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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.