Timer interrupt geht nicht

Gast #682030
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?

1
// Timer0 initialization
2
  TIMSK0 = (1<<TOIE0);
3
  TCCR0A |=(1<<CS00) | (1<<CS02);
4
  TCNT0 = 0;
5
  
6

7
    // Program initalization
8
    Initialization();
9
    sei(); // mt __enable_interrupt();
10

11
  
12
  uint16_t ad_wert = 0;
13
  char str_adwert[4];
14
  
15
    for (;;)            // Main loop
16
    {
17
        //ADC_init(AD2);
18
  //ad_wert = ADC_read();
19
    
20
    if(TIFR0 ==(1<<TOV0))
21
    {
22
        LCD_puts("OVF ok",1); //GEHT NICHT!!!
23
    }
24
    if(TCNT0==0xff)
25
    {
26
        LCD_puts("zaehlt",1);  //GEHT!!!!
27
    }
28
    
29

30
    } //End Main loop
31

32
    return 0; // mt
33
}
34

35

36

37
ISR(TIMER0_OVF_vect)
38
{
39
  
40
LCD_puts("hallo",1);
41

42
}
#682051
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.
Gast #682065
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.
#682074
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

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