Forum: Mikrocontroller und Digitale Elektronik Timer interrupt geht nicht


von jabber (Gast)


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
}

von Patrick (Gast)


Lesenswert?

1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>

von Patrick (Gast)


Lesenswert?

und noch
1
#include <inttypes.h>

von jabber (Gast)


Lesenswert?

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

von Peter P. (bonsaibaum)


Lesenswert?

kann es sein dass immer 'zaehlt' am display steht ?

von Karl H. (kbuchegg)


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.

von jabber (Gast)


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.

von Peter D. (peda)


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

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.