Hallo,
Ik heb hier op het forum volgend programma gevonden:
http://www.circuitsonline.net/forum/view/8543/1/timer+atmega
Maar ik begrijp de werking niet.
Het programma werkt, ik kan op een scoop een mooie blokgolf zien op poort C.
Ik heb het programma in studio4 gesimuleerd, maar nog begrijp ik het niet.
Ik heb de Pdf van de ATMEGA8 over de timer0 al een paar keer gelezen.
Zoals ik het versta, wordt er telkens als de timer0 een overflow heeft een interupt gemaakt.
Dus de bit TOV0 in het TIFR wordt geset.
En hij gaat dan de instructie uitvoeren die bij de interupt staat.
Dus hij komt in dit gedeelte:
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
PORTC = PORTC ^ 0xFF;
TCNT0 = 0x83; //reload counter value
}
Maar zolang de TOV0 niet geset is, dan gaat hij toch gewoon verder in zijn programma? en voert hij het bovenstaande toch niet uit? ofwel?
alvast bedankt!
Voor zover ik het kan volgen is je conclusie juist. Er treedt een interrupt op, het lopende programma wordt onderbroken, interrupt routine wordt uitgevoerd, programma wordt hervat.
Je interrupt code zet je wel buiten je programma lus.
Er niet tussen in. anders wordt die wel gewoon uitgevoerd.
Succes,
Hoe bedoel je?
De interupt code staat tussen de haakjes, niet? { }
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
PORTC = PORTC ^ 0xFF;
TCNT0 = 0x83; //reload counter value
PORTD = 0x00;
PORTD = 0XFF;
PORTD = 0x00;
}
Als ik in studio 4 simuleer, dan zie ik dat hij verschillende keren in de interuptcode komt.
zonder dat de flag geset is.
Ik zie dan poort d voortdurent wisselen
sven
pointers don't kill programs, programmers kill programs
je moet gewoon zorgen dat die volledige routine enkel wordt aangeroepen bij die interrupt.
Nergens in je main routine (en de subroutine)mag je deze routine aanroepen.