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
AVR ballar ur vid Interrupt
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
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
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
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.
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.
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
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