www.mikrocontroller.net

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


Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht 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...


#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

unsigned int g_uiTest = 0;

ISR (TIMER1_COPMPA_vect)
{
  g_uiTest++;
}


int main(void)
{
      

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


    TCNT1 = 0;
  // Zählreggister auf 0 setzen

    OCR1A = 20000;
        

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

    TIFR = 0;

    sei();



    while{1}
    {
       if(g_uiTest > 20000)
       {
          g_uiTest = 0;
       }
    }
    return 1;
}

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

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile unsigned int g_uiTest = 0;

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> volatile unsigned int g_uiTest = 0;

Stimmt danke...das habe ich vergessen!


Aber auch mit dieser Korrektur klappt es nicht.

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du den Code eigentlich durch den Compiler quetschen können?
ISR (TIMER1_COPMPA_vect)

Das schreibt sich TIMER1_COMPA_vect.
                           ^^
    while{1}

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

Mal sehen, was jetzt der Simulator sagt...

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht 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???!!

Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ISR (TIMER1_COPMPA_vect)

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

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Büddeschön ;)

Autor: Magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.