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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.