mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer interrupt geht nicht


Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich bekomme den Timer0 nicht zum laufen. Bzw der Timer geht/zählt nur 
der interrupt wird nicht ausgeführt.
Welche includes brauche ich denn für den mega169?

// Timer0 initialization
  TIMSK0 = (1<<TOIE0);
  TCCR0A |=(1<<CS00) | (1<<CS02);
  TCNT0 = 0;
  

    // Program initalization
    Initialization();
    sei(); // mt __enable_interrupt();

  
  uint16_t ad_wert = 0;
  char str_adwert[4];
  
    for (;;)            // Main loop
    {
        //ADC_init(AD2);
  //ad_wert = ADC_read();
    
    if(TIFR0 ==(1<<TOV0))
    {
        LCD_puts("OVF ok",1); //GEHT NICHT!!!
    }
    if(TCNT0==0xff)
    {
        LCD_puts("zaehlt",1);  //GEHT!!!!
    }
    

    } //End Main loop

    return 0; // mt
}



ISR(TIMER0_OVF_vect)
{
  
LCD_puts("hallo",1);

}

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und noch
#include <inttypes.h>

Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke schon mal, bis auf den inttypes.h hatte ich die schon drin. 
Geht aber immer noch nicht. Was mache ich falsch?

Autor: Peter P. (bonsaibaum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann es sein dass immer 'zaehlt' am display steht ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass mal den Teil mit der Auswertung des Timers in der
main() Schleife weg.
Auf die Schnelle sehe ich nichts in deinem Code, was den
Interrupt verhindern würde. Allerdings steht der Text
"hallo" nur ganz kurz (abhängig von deiner Taktfrequenz)
auf deinem Display. Ich könnte mir vorstellen: Zu kurz.

Autor: jabber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja "zaehlt" steht immer da!
Aber wenn ich es auskommentiere dann kommt nichts mehr.
Aber das "hallo" müsste doch dann eigentlich immer da stehen, oder 
nicht?
Auch wenn es sehr schnell geht. Der LCD kann es ja bestimmt nicht so 
schnell  wieder löschen wie ein heues "hallo" kommt. Oder doch?
Aber selbst ohne die abfragen kommt kein "hallo" auf lcd.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Programm ist ganz großer Käse.

LCDputs hat im Timerinterrupt nichts zu suchen, weil 1. schnarchlahm und 
2 nicht reentrant.
D.h. es sind warscheinlich mehrere Overflows vergangen, ehe im Interrupt 
die Ausgabe fertig ist.
Und es gibt lustigen Zeichensalat, wenn das LCDputs im Interrupt 
zufällig das LCDputs im Main unterbricht.


LCDs brauchen generell einige Zeit, um was darzustellen und der Mensch 
braucht noch viel länger, um es abzulesen. Nach einer LCD-Ausgabe 
sollten daher mindestens 200ms Pause sein.

Es macht auch keinen Sinn, das Interruptflag zu testen und nen 
Interrupthandler aufzusetzen.
Du mußt Dich schon entscheiden, ob Polling oder Interrupt, beides geht 
nicht (der Interrupt zieht fast immer dem Polling das Bit unterm Hintern 
weg).


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.