Electrokit Buggfix Plus
Aktuellt datum och tid: 02.52 2019-10-18

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 57 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa
Författare Meddelande
InläggPostat: 08.42 2019-08-17 

Blev medlem: 06.51 2008-05-19
Inlägg: 22231
Ort: Upplands väsby
Jag tycker det här låter lite som när folk använder timer till fel saker.

Precis som mrfrenzy skriver så är en timer nåt man använder om man så att säga vill att nåt ska "ticka på med en egen frekvens". En timer ställs in och går sen fristående. Antingen har man den för att få en pinne att ticka på egen frekvens, med egen pulsbredd eller liknande, eller så använder man den för att köra en interrupt-rutin med viss frekvens.

Om man istället gör misstaget att tro att en timer är nån slags stoppur som man kan använda att vänta på för att få sin huvudloop att göra saker i rätt tempo så gör man oftast fel. Vänta på en timer ska man väl i princip aldrig göra, däremot kan man i sin loop kolla en timer och agera utifrån dess värde. Men då får man ju tänka på att man kollar "har timern passerat xxx", sen om det är xxx+1 eller xxx+100 kan man aldrig vara säker på (så det är ju en funktion man ska använda om man inte vill göra saker för tätt, men det funkar inget bra om man vill göra saker vid en exakt tid).


Upp
 Profil  
 
InläggPostat: 09.34 2019-08-17 

Blev medlem: 17.59 2009-12-21
Inlägg: 3481
Jag är nog inne lite på din linje Nerre.

Samtidigt så är jag lite osäker på om TS egentligen har något problem.
1. Byte från Atmega 328 till STM32F103C med samma kod ger "interferens"
2. Killen som hjälper att göra om koden säger att det är för få timers i STM32F103C och växlar till F446

3. Och frågan är från TS är om man inte kan "Kan man bara använda en timer en gång per programloop"

Om vi delar upp det hela lite så blir nog svaren:
1.)
Om du kör samma kod mot annan MCU och får annat resultat så är Arduino porteringen till STM inte riktigt bra.
Det kan finnas workarounds och troligen bör du ställa frågan i något STM32Duino forum.

2.)
Det låter märkligt. STM32F103C Har 4 timers (3st 16 bit + 1st 24 bit) dvs. lika många som Atmega 328.
Beakta att 24-bit timern är SysTick och därför kanske inte kan användas hur som helst i Arduino (enl. tidigare inlägg).
Detta kan vara skälet att killen som hjälper dig får för lite timers.

3.)
Som IceCap beskrivit finns timers med olika syfte, men om avgränsar oss till en "normal räknare" så visst kan du använda den till fler saker. Det blir dock lite abstrakt när du skriver "per programloop" då man normalt inte använder dom i loopar på det sättet. Det är dock större risk att man går bort sig om man använder 1 timer till flera saker, i synnerhet med interrupt.
Vanliga misstag är:
- Man har för mycket kod i Servicerutinen (en högrprioriterad ISR kommer köra färdigt innan den hoppar vidare till en med lägre prioritet)
- Man förstår inte hur (eller har inte tillgång till via programspråket) man sätter upp ISR prioriteteter länk
- Man reinitierar timern eller interruptflaggan efter man genomfört ISR (innebär att man förskjuter tiden med lika mycket som det tar att köra ISR koden)
- osv. osv.

För att ge ett tanke experiment:
Tänk att du vill ha 3 olika saker utförda.
Sak 1 varje sekund
Sak 2 varannan sekund
Sak 3 var tredje sekund

Vad blir skillnaden med en timer respektive tre olika ?
Var tredje sekund skall alla saker köras samtidigt vilken körs först (i båda fallen med 1 och 3 timers) ?


Upp
 Profil  
 
InläggPostat: 10.02 2019-08-17 

Blev medlem: 06.51 2008-05-19
Inlägg: 22231
Ort: Upplands väsby
Precis, i ett sånt exempel använder man väl bäst en timer på 1 sekund, sen får interrupt-rutinen hålla reda på 2 och 3 sekunder mha en räknare (variabel).


Upp
 Profil  
 
InläggPostat: 23.19 2019-08-17 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Jag tror faktiskt jag förstod lite av det sista nu, framför allt så tror jag ni har förstått mitt dilemma... Men, jag har själv börjat med lite felsökning, vad fungerar/fungerar inte. Och för det första så har jag skrivit fel i koden, man måste dels göra om: istället för analogWrite så skall det vara pwmWrite. Sen så har STM32 inte 255 steg utan 65535 steg. Sedan är analogingångarna 12 bitar istället för 10 som Atmegan har. (detta visste jag i och för sig sen förut) Även i pinMode skall man välja PWM resp INPUT_ANALOG, PWM hade jag missat... Sen så skall man nog undvika PULLUP om man kör in 5 volt på ingången även om den är "5 volt tolerant" för det blir ju inte bra för resten av kretsen så det har jag sedan tidigare tagit bort. Nu är klockan läggdags men i morgon skall jag prova dessa förändringar/förbättringar...


Upp
 Profil  
 
InläggPostat: 06.49 2019-08-18 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Nu är det testat och det fungerar INTE (än) Det jag avser är pwm-utgången. Så här har jag gjort: Använder en int som gasPin = PA0, den pinnen klarar analoginsignal 0-3,3 volt. pinMode(gasPin, ANALOG_INPUT); (räcker med INPUT, utan ANALOG, det verkar fungera ändå) Jag har sen gjort om gasvärdet 0-255 till 0-65535 via MAP och det fungerar, kollat via Serial.print-funktionen. Men på slutet så skiter det sig. Enligt: https://circuitdigest.com/microcontroll ... ed-Control så skall jag använda pwmWrite(berördutgång(med tildetecken), värde); istället för analogWrite som förut.
kompilatorn sväljer pwmWrite men det är inte rött som tex analogWrite blir. Så jag tror nåt är vajsing runt detta...


Upp
 Profil  
 
InläggPostat: 06.56 2019-08-18 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Testade att lägga in den filen enligt länken ovan och där fungerar pwm funktionen men inte ihop med min ECU, så det är nog en konflikt någonstans?


Upp
 Profil  
 
InläggPostat: 09.24 2019-08-18 

Blev medlem: 17.59 2009-12-21
Inlägg: 3481
Använder du samma pinne i ditt program som dom gör i testprogrammet som funkar ?


Upp
 Profil  
 
InläggPostat: 12.55 2019-08-18 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Japp, jag gjorde tom om testprogrammet till "mina" pinnar från början så jag vet till 100% att det funkar att göra så här.


Upp
 Profil  
 
InläggPostat: 14.35 2019-08-18 

Blev medlem: 17.59 2009-12-21
Inlägg: 3481
Då måste väl nästan den enda förklaringen vara att just den timern som används för PWM på just vald pinne redan är upptagen med något annat.

Jag försökte hitta lite hur dom assignar timers till pwmWrite och det enda jag hittat så långt är att det blir olika timers beroende på vilken pinne.

Jag tycker det är ruskigt dåligt dokumenterat.
Mycket av platfformstödet verkar ha ärvts av MapleLabs som var pionjärer med att få Arduino att köra på STM chip. Deras kort (MapleLeaf) tror jag dock inte säljs längre.
Det finns dock lite historisk dokumentation kvar LÄNK

Om du inte klantat dig (du verkar noggrann) på något sätt i koden så skulle jag rekommendera att du kikar lite på övriga funktioner som du använder och som kanske lägger beslag på samma timer på något vis.

Jag tror den här pin map'en även visar vilken timer som används till PWM för respektive pinne
Bild


Upp
 Profil  
 
InläggPostat: 15.11 2019-08-18 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
TopNotCH: det var en bättre bild på "Blue Pill" modulen än vad jag sett hittills. Det skulle nog mycket riktigt vara vilken timer som är hårdvarukopplad till vilket ben. Det jag ser direkt nu är att jag valt PB0, PB1 som ingångar för vev resp. kamgivare och dom skall inte vara 5 voltstolleranta och det är dom ända benen som fungerar direkt... Jag vet inte hur känsligt det är men nu har ECU:n gått med lysdioder nåt dygn med 5 volt rakt in från motorsimulatorn som är en Atmega328 med 5 volts drivning. Hmm, kanske skulle sätta nåt slags motstånd i serie eller dubbla motstånd så det blir 3,3 volt?
PB0 använder då timer 3 och PB1 använder timer 4 och min elfläktsutgång som jag satt på PA6 använder timer 1.
Skall man läsa det så? Vad betyder PWM2/2 resp PWM2/3? Vad är vad?
Innan fler frågor så skall jag läsa din länk också, det kanske blir självklart sedan...


Upp
 Profil  
 
InläggPostat: 06.07 2019-08-19 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Den här leafLabs sidan om maple-modulen är ganska bra, jag har kollat igenom en del där men kan inte hitta specifikt vilken timer som går till vad. Timer 4 verkar vara till PWM för alla utgångar. Vad jag förstår så om man har alla PWM igång samtidigt så startar dom alla samtidigt men beroende på var man sätter stopptiden (duty) så stängs PWM utgångarna av en efter en tills timern går i botten (overflow) och då börjar alla utgångar om på nytt. Maxvärdet är 16535. Så långt fattar jag nog... I mitt fall så verkar mitt ECU-program ha lagt beslag på denna timer 4 till nåt annat? Om så är fallet, hur luskar man ut det? Jag använder ju PB1 som ingång och det står ju PWM3/4 på det benet också. Enklast vore kanske bara att helt random välja en annan pinne för denna ingång?


Upp
 Profil  
 
InläggPostat: 09.33 2019-08-19 

Blev medlem: 17.59 2009-12-21
Inlägg: 3481
Jo...Så skulle jag nog gjort.

Annars ta en backup på koden.
Ta bort alla definitioner som använder Timers då skall det ju hoppa igång.
Sedan lägga tillbaka dom en efter en och se vilken som sabbar.

Alternativt tar du exempelkoden som du fick att funka och lägger på dina definitioner på den, en efter en.
Tanken är att ringa in vilken funktion som konfliktar med din pwm.


Upp
 Profil  
 
InläggPostat: 10.09 2019-08-19 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Jag börjar nog med att "vetenskapligt" random med att välja andra pinnar som utgångar/ingångar för att se om det hjälper...


Upp
 Profil  
 
InläggPostat: 20.25 2019-08-19 

Blev medlem: 09.06 2016-12-01
Inlägg: 763
Ort: Marks Kommun
Ingenting av det jag nu provat hjälper. Jag tror inte jag kommer längre och dessutom saknar jag programmeringskunskap. Jag har läst en del men blir väl egentligen inte så mycket klokare. Finns det något lättläst som förklarar timer och frekvensdelare på ett väldigt enkelt sätt? Jag har ju skrivit koden i Arduinospråk och detta fungerar felfritt i NANO:n. I och med att jag använder Arduinospråk så ser jag inte när och vilka timrar jag använder men förmodligen behövs timer för millis, micros, delay, interrupt, PWM. Skall väl tillägga att denna tråd är en utbrytare ur "ECU-styrning till en VW pumpdysediesel" så fixar sig inte detta problem med Blue-Pill modulen så får jag helt enkelt släppa tanken på att uppgradera från Atmega till STM32...


Upp
 Profil  
 
InläggPostat: 21.36 2019-08-19 
EF Sponsor
Användarvisningsbild

Blev medlem: 22.58 2005-10-01
Inlägg: 1178
Ort: Torestorp
https://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf

https://www.youtube.com/watch?v=DyyYaGU4biY

https://www.youtube.com/watch?v=DQFvV3DJL54


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 57 inlägg ]  Gå till sida Föregående  1, 2, 3, 4  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 2 gäster


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    Electrokit
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010