Timer1 bei ATmega16 - Interrupt klappt nicht

OP #1734762
Lesenswert?

Hi!
Ich suche schon seit 2 Stunden meinen Fehler, vielleicht ist es an der 
Zeit, dass mal jemand anders den Quelltext anschaut. Ich suche schon wie 
blöde...
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h>
4

5
unsigned int g_uiTest = 0;
6

7
ISR (TIMER1_COPMPA_vect)
8
{
9
  g_uiTest++;
10
}
11

12

13
int main(void)
14
{
15
      
16

17
    // void init_timer1(void)    
18
    TCCR1B = (0<<CS02) | (0<<CS01) | (1<<CS00) | (1<<WGM12);
19
      // Zähltakt einstellen
20
  // clk = 16 MHz
21
  // WGM12:  CTC-mode aktiviert
22

23

24
    TCNT1 = 0;
25
  // Zählreggister auf 0 setzen
26

27
    OCR1A = 20000;
28
        
29

30
    TIMSK = (1<<OCIE1A);
31
  // Freigabe T/C1 Interrupt
32

33
    TIFR = 0;
34

35
    sei();
36

37

38

39
    while{1}
40
    {
41
       if(g_uiTest > 20000)
42
       {
43
          g_uiTest = 0;
44
       }
45
    }
46
    return 1;
47
}

Im Debug-Modus kann ich genau alles verfolgen, die Register sind korrekt 
gesetzt. Die Variable g_uiTest müsste doch jetzt hochlaufen...tut sie 
aber nicht
Gast #1734818
Lesenswert?

Was wassiert, wenn du den Optimizer ausschaltest? Womöglich wurde da ein 
wenig mehr wegoptimiert, als dir lieb ist. Schließlich wird die Variable 
g_uiTest nicht wirklich sinnvol verwendet. Hier könnte der Optimizer 
also einiges wegoptimieren.

Gruß,
Magnetus
Gast #1734853
Lesenswert?

Wie hast du den Code eigentlich durch den Compiler quetschen können?
1
ISR (TIMER1_COPMPA_vect)

Das schreibt sich TIMER1_COMPA_vect.
                           ^^
1
    while{1}

Hier würde ich "while(1)" vorschlagen.
                     ^ ^

Mal sehen, was jetzt der Simulator sagt...
OP #1734855
Lesenswert?

Hmm also wenn ich das

TIMSK = (1<<OCIE1A);

weglasse, also so

//TIMSK = (1<<OCIE1A);

dann bleibt das OCF1A Flag immer auf 1.


D.h., es muss durch die Software selber auf 0 gesetzt werden.


Mit TIMSK = (1<<OCIE1A); sind die Interrupts enabled. Dadurch wird immer 
beim Eintreten des Interrupts auch das OCF1A-Flag zurückgesetzt. Dieses 
Rücksetzen durch den Interrupt scheint also zu funktionieren. Wieso aber 
wird diese dämliche Variable nicht hochgesazählt???!!
#1734869
Lesenswert?

@  Jürgen Hems (misteret)

>Das mit dem while{1} hatte ich nur hier falsch eingetippt....

Patsch

Quelltext tippt man nicht ab, man postet das ORIGINAL als Anhang!!!
Nur so kann man den Fehler 100% beurteilen!!!

Leute gibts

>Es kam aber auch keine Fehlermeldung tz tz

Doch, da kommt eine Warnung, man muss halt nur die Augen aufmachen.

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