Forum: Mikrocontroller und Digitale Elektronik Timer1 bei ATmega16 - Interrupt klappt nicht


von Jürgen H. (misteret)


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

von Jürgen H. (misteret)


Lesenswert?

Außerdem wundert mich:

Das Output Compare Flag 1 B (OCF1B) wird immer gesetzt, obwohl es zu 
Beginn mit 0 initialisiert wurde. Es bleibt dann auch auf 1.
Und Output Compare Flag 1 A (OCF1A) ist immer 1.

Was hat OCF1B auf einmal damit zu tun?

von holger (Gast)


Lesenswert?

volatile unsigned int g_uiTest = 0;

von Jürgen H. (misteret)


Lesenswert?

holger schrieb:
> volatile unsigned int g_uiTest = 0;

Stimmt danke...das habe ich vergessen!


Aber auch mit dieser Korrektur klappt es nicht.

von Magnetus (Gast)


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

von Jürgen H. (misteret)


Lesenswert?

Also das mit der Optimierung, dieses Problem hatte ich, als ich mein 
erstes mal versucht hatte zu debuggen ;-)

Der ist schon ausgeschaltet...auf O0.

Ich sehe ja auch, dass jeder Schritt abgearbeitet wird. Es passiert nur 
nichts mit der Variable

von Magnetus (Gast)


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...

von holger (Gast)


Lesenswert?

>    TCCR1B = (0<<CS02) | (0<<CS01) | (1<<CS00) | (1<<WGM12);

    TCCR1B = (0<<CS12) | (0<<CS11) | (1<<CS10) | (1<<WGM12);

Das ist es aber auch nicht.

von Jürgen H. (misteret)


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???!!

von Jürgen H. (misteret)


Lesenswert?

Magnetus schrieb:
> Das schreibt sich TIMER1_COMPA_vect.
>                            ^^

OOOAAAAR DAAAARAN lag es also!!!

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

Aber der Dreher oben war auch im Quelltext....oh man ich sitz einfach zu 
lang davor, um sowas zu sehen....so am besten jetzt aufhören^^

Es kam aber auch keine Fehlermeldung tz tz


Bye bye


Danke!!

von holger (Gast)


Lesenswert?

>ISR (TIMER1_COPMPA_vect)

Das wirds wohl sein.
COPMPA hab ich noch nie im Datenblatt gesehen;)

von Magnetus (Gast)


Lesenswert?

Büddeschön ;)

von Magnetus (Gast)


Lesenswert?

By the way:

Jürgen Hems schrieb:
> Das mit dem while{1} hatte ich nur hier falsch eingetippt....

Hast du schon einmal was von "Copy & Paste" gehört?

von Falk B. (falk)


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.

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.