Skillnader i timers, prescalers på Atmega och STM32

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Nerre
Inlägg: 26652
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Nerre »

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).
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av ToPNoTCH »

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) ?
Nerre
Inlägg: 26652
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Nerre »

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).
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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?
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av ToPNoTCH »

Använder du samma pinne i ditt program som dom gör i testprogrammet som funkar ?
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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.
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av ToPNoTCH »

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
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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?
ToPNoTCH
Inlägg: 4847
Blev medlem: 21 december 2009, 17:59:48

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av ToPNoTCH »

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.
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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...
Janson1
Inlägg: 1338
Blev medlem: 1 december 2016, 09:06:02
Ort: Marks Kommun

Re: Skillnader i timers, prescalers på Atmega och STM32

Inlägg av Janson1 »

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...
Skriv svar