Forum: Compiler & IDEs Interrupt Priorität


von Joachim (Gast)


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);
}

von Magnus Müller (Gast)


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.

von Joachim (Gast)


Lesenswert?

Habe das nicht genau beobachtet, aber etwa nach einer halben Stunde. Du 
fragst wahrscheinlich, weil du vermutest, dass sich die Interrupts immer 
bei der selben Zeit überlagern und das zu dem absturz führen könnte ?

Habe dies hier 2 mal gepostet.

Beitrag "for schleife als Timer"

von Peter D. (peda)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.