Jag har gjort en software PWM som inte vill fungera som jag vill...
Det är så att själva PWMen fungerar som den ska men inte styrningen.
Problemet är när jag försöker få ett ljus att lysa fullt sen bli svagare som går i en loop upp å ner så stannar den på första "steget" och ändrar sig inte ett dugg.
Vad kan felet vara?
Koden (OSCCAL_calibration() är inte med för att den är stor och onödig att ha med):
Om _delay_loop_2 tar ms som argument tar det 43 minuter innan den har dimmat upp fullt. (Förutsatt att din klockfrekvens stämmer med delayfunktionen, kan ju ta längre tid också...)
Kanske bara är det som är fel?
Har du mätt signalen med olika duty för att testa att PWM-en funkar?
Vad är egentligen anledningen till varför du vill sköta PWM:en i mjukvaran? Hårdvaru-PWM är betydligt smidigare och bättre.
Kopplingen mellan looparna och interruptrutinen verkar väldigt osäker. Jag tycker att det vore bättre att sköta PWM:en antingen från en interrupt _eller_ från någon loop. Att försöka kombinera dom är att be om trubbel.
bearing: Argumentet till _delay_loop_2() anger hur många delays på 4/f_osc som ska göras.
Jag gör detta för att få det att dimma upp å ner, som ett litet test.
Och jag har teta att ha massa olika värden på delay grejen men det har inte hjälpt.
Varför jag har den i mjukvaran? Jo, därför att det sen ska vara till fläktstyrning av 8st fläktar och jag har bara 3st PWM utgångar.
"Kopplingen mellan looparna och interruptrutinen verkar väldigt osäker." <-- Vad menar du?
Frekvensen blir (väl) 2000000 / 8 / 256 / 256 = 3.8 Hz.
Periodtiden motsvarar 524288 instruktioner, vilket borde vara betydligt fler än i delayen i FOR-looparna.
Det ända jag gör är minskar den till 2MHz och delar på 8, sen att det är en byte som måste gå i själva timern men det är fortfarande inte 3.8Hz.
Jag fick det till 976,6Hz.
Det du nog har sett fel är att jag kör OCR0A registret på 1 och inte 255.
Jaha, borde sett att du körde interrupt vid compare och inte vid overflow...
Du får alltså ett interrupt var 8:nde instruktionscykel? möjligtvis blir det var 16:ende.
Då är det nog det som är felet. Den hinner förmodligen inte ens köra klart interruptet innan den ska in i det igen.
Den kommer iaf knappt ha någon tid alls över att köra koden i main() om den är så mycket i interruptet.
Kör interruptet mer sällan och nollställ tickCount när den nått en lägre siffra än att den slår runt. Då kanske du kan få samma frekvens men med lite lägre upplösning på pulsbredden. Det gör nog inte något när det gäller fläktar. Det räcker säkert att tockCount bara kör till 20 så får du en upplösning på 5% och betydligt minder tid i interrupten.