Sida 1 av 1

AVR ballar ur vid Interrupt

Postat: 17 mars 2008, 20:55:42
av John_E
Hej!

Jag har ett problem med en PI reglering.

Har skrivit ett program där en loop skriver är värdet till en led display. Innan loopen återgår till början alternerar en mellan att hämta ärvärdet och börvärdet.
Ärvärdet från AD omvandlaren och börvärdet från ett tumhjul.

I Timer2 interrupten ligger reglerings sekvensen. Räkna ut felet och dela upp det i I-tids portioner.

Styrignalen är OCR1A

Mitt problem är:
När den hoppar till interrupten så slocknar displayen och ingenting fungerar. Inte ens om jag bara skriver reti i interrupten. Jag har kört debuggen 3 miljoner varv och där fungerar skiten.

Har haft det här problemet förrut när jag programerat jätte simpla grejer i Assembler 4. Det verkar som att så fort jag har ett program som hoppar mellan en loop och lite subrutiner så kan jag inte använda interrupts.

Är det någon som vet vad detta beror på?

Till saken hör nog att jag använder Algorithm Builder 5.26, en AtMega8535. Och att jag är jävligt grön och självlärd vad det gäller microcontrolers...

Tack på förhand!

//John

Postat: 17 mars 2008, 22:03:46
av björn
Vet inte vad det kan vara och jag har aldrig haft liknadne fel, men om du hade visat koden kasnke det hade funnits en möjlighet att någos skulle se om det var något mysko.

Du har väl inte glömt att dissabla interrupts i interrupten? då kan man få liknande fel.

Postat: 17 mars 2008, 22:04:18
av peter555
Har du initierat stackpointern ?

Postat: 18 mars 2008, 06:41:07
av Swech
Det kan vara en massa olika saker..... massa massa.....

Stacken? är den ok
Sparar du status i interupten,
Har du en evighetsinterrupt? - vissa interrupt kan man behöva trixa med
för att de inte skall ge interrupt igen direkt..
har du initierat övriga saker ok?
mm.mm

visa koden så kan vi nog hjälpa dig bättre..

Swech

Postat: 18 mars 2008, 10:10:46
av $tiff
Låter onekligen som att stackpointern inte är initierad, om det är asm du kodar i måste det göras manuellt någonstans.

Man ska inte utföra tunga beräkningar i en avbrottsrutin om man inte är helt säker på vad man gör, och man ska speciellt inte hoppa runt bland andra subrutiner därifrån, det inbjuder till onödigt många problem. Det första problemet är att koden riskerar att exekvera längre än avbrottsperioden, då har du en låsning. Andra är att du hoppar fel eller har en väntande rutin i någon av subrutinerna, som också kommer bjuda på otrevliga överraskningar så småningom.

Postat: 18 mars 2008, 19:21:47
av John_E
Tack för alla svar...

Stacken är ok
Sparar och återställer SREG status
Ingen Evighets interrupt
Nollar interrupts i början, rensar TCNT2 och ettar interrupts i slutet

Det är märkligt eftersom felet endast dyker upp när I=1. Även om jag lägger reti direkt i interrupten så strular det.

Koden är i Algorithm builder. Får väl lägga upp den som bild nån stans.

//John