Gast
#488432
Hallo, ich bin auf dem Gebiet relativ neu und beschäftige mich jetzt mit den Interrupts. Im Tutorial habe ich gelesen, dass jeder Interrupt eine Priorität besitzt und evtl. unterbrochen werden kann. Wo finde ich diese beim AVR mega8 ? Bei folgendem Programmcode habe ich das Problem, dass sich die Uhr nach einigen Minuten aufhängt. Woran könnte das liegen ? Der Code ist einigermaßen dokumentiert, allerdings sicher nicht schwer verständlich. #include <inttypes.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <lcd.h> #include <lcd.c> #include <avr/interrupt.h> #include <util/delay.h> #include <entprell.c> int sec; int min=11; int hr=23; char buffer[16]; ISR (TIMER0_OVF_vect){ //Einstellmöglichkeit der Minuten über PD2 //PD2 wird 15 mal pro sec abgefragt if(debounce(&PIND, PD2)){ min++; if(sec>59) {sec=0;min++;} if(min>59) {min=0;hr++;} if(hr>23) {hr=0;} sprintf(buffer,"%02d:%02d:%02d",hr,min,sec); lcd_home(); lcd_puts(buffer); } sei(); } ISR(TIMER1_COMPA_vect) //hier wird der Zahlenwert der abgearbeitet { TCNT1=0; //Compare Register löschen if(sec>59) {sec=0;min++;} if(min>59) {min=0;hr++;} if(hr>23) {hr=0;} sprintf(buffer,"%02d:%02d:%02d",hr,min,sec); lcd_home(); lcd_puts(buffer); sec++; } int main(void) //Initialisierung der Timer0(clk/1024) //und Timer1(clk/256) { DDRD=0x00; TCCR1B|=(1<<CS12);TIMSK|=(1<<OCIE1A); TCCR0|=(1<<CS00)|(1<<CS02); TIMSK|=(1<<TOIE0); lcd_init(LCD_DISP_ON); OCR1A=15625; //Compare, damit Timer 1 im Sekundentakt sei(); //aufgerufen wird while(1); }