mikrocontroller.net

Forum: Compiler & IDEs Interrupt Priorität


Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.