Interrupt Priorität

Gast #488432
Lesenswert?

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);
}
Gast #488435
Lesenswert?

> Bei folgendem Programmcode habe ich das Problem, dass sich die Uhr nach
> einigen Minuten aufhängt. Woran könnte das liegen ?

Meinst du mit "nach einigen Minuten"...

   --> nach einer Laufzeit von x Minuten?
   --> bei immer ein und derselben Uhrzeit (hh:mm:ss)?

Was passiert, wenn du deine Uhr mit einer Anderen Startzeit (z.B. 
01:02:03) initialisierst?


Noch etwas:

Das "sei();" am Ende der ISR kannst (oder solltest?) du dir schenken. 
Die Interrupts werden nach der Abarbeitung der ISR automatisch wieder 
freigegeben.
#488564
Lesenswert?

AVRs haben keine Prioritäten, sondern nur ne Auflösungsreihenfolge, wenn 
mehrere Interruptflags gesetzt sind (z.B. nach Verlassen eines langen 
Interrupts).


Was Dein Code macht, kann man nicht nachvollziehen, da er nicht 
compilierbar ist (die Hälfte fehlt).


Allgemein sollte man Ausgaben (LCD, UART) nicht in Interrupts machen, da 
sie nicht reentrant sind und viel Zeit kosten (= miese Echtzeitigkeit).


Software-Preload von Timern verbietet sich, wenns genau sein soll (bzw. 
dann nur per Addition inklusive Ausführungszeit).


C-Files sollte man besser nicht includen, sondern einzeln compilieren 
und dann zusammenlinken.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren