Problem med Interrupt AtMega168 @ 16MHz
Postat: 10 april 2010, 15:30:32
Hej allihop. jag håller på med ett litet projekt där jag spelar musik med stegmotorer. Jag har dock ett problem med min kod som jag hoppas någon kan hjälpa mig med.
Lite bakgrund. Jag använder mig av en AtMega168-20 samt en extern oscillator med en klockfrekvens på 16Mhz.
Programmet fungerar som så att jag kör en interrupt med extremt hög frekvens (prescaler 1, 8bitar. 1/16MHZ * 256)
Timern har en frekvens på 16uS. Inuti denna interrupt har jag en räknare som räknar antalet interrupts som har utförts och kontrollerar hela tiden interrupt numret mot en array som innehåller de toner jag vill spela.
Tonerna är alltså lagrade i en array där deras frekvens (tonen som skall spelar) står i direkt relation till antalet interrupts.
Om interrupt talet är korrekt så stegar jag motorn. Efter varje steg kontrollerar jag ytterligare en array som innehåller den paus som skall vara efter varje spelad ton. även denna är hårdkodad.
Mitt problem är följande. Låten spelar som den ska vissa stunder för att sedan stanna av någon sekund och fortsätta. Jag trodde detta berodde på att jag hade för hög interruptfrekvens men precis samma sak händer när jag ökar prescalern.
Jag provade också att byta uC till AtMega8515 men precis samma fel kvarstår. Jag körde lite simulering i avrstudio då jag misstänkt att interrupten kanske tog för god tid på sig och avbröt sig själv eller något liknande (om det är möjligt) men hela ISR:en han slutföras i god tid innan nästa.
Jag har förmodligen något fel i min kod. hoppas någon kan ta sig tid att kolla igenom lite. Jag vet att koden är något ostrukturerad... och att variabelnamnen är kassa men jag har experimenterat så mycket med detta fram och tillbaka att det har blivit så
när jag kollar med oscilloskopet ser jag att alla frekvenser är korrekta men plötsligt bara dör allt och pinnen ställer sig antingen låg eller hög för att sedan fortsätta efter några sekunder. Koden rullar på som vanligt eftersom jag plötsligt befinner mig på "rätt" ställe i musikstycket.
Lite bakgrund. Jag använder mig av en AtMega168-20 samt en extern oscillator med en klockfrekvens på 16Mhz.
Programmet fungerar som så att jag kör en interrupt med extremt hög frekvens (prescaler 1, 8bitar. 1/16MHZ * 256)
Timern har en frekvens på 16uS. Inuti denna interrupt har jag en räknare som räknar antalet interrupts som har utförts och kontrollerar hela tiden interrupt numret mot en array som innehåller de toner jag vill spela.
Tonerna är alltså lagrade i en array där deras frekvens (tonen som skall spelar) står i direkt relation till antalet interrupts.
Om interrupt talet är korrekt så stegar jag motorn. Efter varje steg kontrollerar jag ytterligare en array som innehåller den paus som skall vara efter varje spelad ton. även denna är hårdkodad.
Mitt problem är följande. Låten spelar som den ska vissa stunder för att sedan stanna av någon sekund och fortsätta. Jag trodde detta berodde på att jag hade för hög interruptfrekvens men precis samma sak händer när jag ökar prescalern.
Jag provade också att byta uC till AtMega8515 men precis samma fel kvarstår. Jag körde lite simulering i avrstudio då jag misstänkt att interrupten kanske tog för god tid på sig och avbröt sig själv eller något liknande (om det är möjligt) men hela ISR:en han slutföras i god tid innan nästa.
Jag har förmodligen något fel i min kod. hoppas någon kan ta sig tid att kolla igenom lite. Jag vet att koden är något ostrukturerad... och att variabelnamnen är kassa men jag har experimenterat så mycket med detta fram och tillbaka att det har blivit så

när jag kollar med oscilloskopet ser jag att alla frekvenser är korrekta men plötsligt bara dör allt och pinnen ställer sig antingen låg eller hög för att sedan fortsätta efter några sekunder. Koden rullar på som vanligt eftersom jag plötsligt befinner mig på "rätt" ställe i musikstycket.