mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer1 Capture wird nicht ausgeführt.


Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe einen Atmega8 und bekomme den Capture des Timer1 einfach nicht 
zu Laufen:

Ich habe die Register folgendermaßen konfiguriert:

  TCCR1B = 0b1101;
  OCR1A = 780;
  TIMSK = 0b10000;

  sei();

Und im AVR-GCC folgende ISR-Funktion:
ISR(TIMER1_CAPT_vect)

aber irgendwie springt er mir nicht in die ISR...

Kann mir jemand helfen?

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh sorry meinte natürlich den Compare nicht den Capture!

und hier die ISR(TIMER1_COMPA_vect)...

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was daran liegen sollte, daß WGM10..13 nicht korrekt gesetzt werden. 
Wenn TCCR1A nicht gesetzt ist, dann gibt's den Mode überhaupt nicht.

Register binär statt mit symbolischen Namen zu setzen ist auch nicht 
wirklich übersichtlich...

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jup sorry hab ich jetzt auch bemerkt ;)

        TCCR1B |= (1 << WGM12) | (1<<CS12) | (1<<CS10);
  OCR1A = 780;
  TIMSK = (1 << OCIE1A);

Aber WGM 10, 11 und 13 müssen doch 0 sein, damit das überhaupt geht 
oder?

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab gerade den Debug einfach mal ne Weile laufen lassen: Irgendwie 
springt der mir erst nach ca. 255 ms in die Routine;

Mit 16MHz Prescaler von 1024 und 65535 ist das auch der Fall, aber warum 
springt er mir nicht schon bei 780 rein?

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind die OCxyz Register nicht normalerweise gepuffert (d.h. die Werte 
werden erst beim nächsten Match übernommen)?
Funktioniert dein Code also, wenn du erst OCR1A und dann TCCR1B 
schreibst?

rtfm, Jörg

edit: zuviele Typos

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber WGM 10, 11 und 13 müssen doch 0 sein, damit das überhaupt
> geht oder?

Stimmt, mein Fehler, zu weit unten in der Tabelle gekuckt...

Da das nicht Dein vollständiger Code ist, kann man nur raten. Wenn der 
TCCR1B noch nicht beschrieben wurde, so ginge TCCR1B |= , ansonsten 
würde ich lieber:
TCCR1B = (1 << WGM12) | (1<<CS12) | (1<<CS10);
schreiben.

Autor: Thorsten001 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also rumgedreht hab ichs, aber er geht mir trotzdem erst nach 255 ms in 
den ersten Interrupt...

Beim zweiten sind es dann meine 45ms wie ich eingestellt hab!
Also das wusst ich net das das so ist...

Kann man das irgendwie umgehen, dass das direkt übernommen wird ohne 
Puffer?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte für den Timer/Counter einen Preset von 65536 - 780 nehmen 
oder Mode 12 mit ICR1 statt OCR1A. ICR1 und dieser Mode ist nicht 
gepuffert.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal nachgelesen, das hier sollte für exakt diese Zweck vorgesehen sein:
  TCCR1B = (1 << WGM12) | (1<<CS12) | (1<<CS10);
    OCR1A = 780;
      TCCR1A |= (1 << FOC1A);
        TIMSK = (1 << OCIE1A);
  sei();

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im CTC-Modus ist OCRA1 nicht gepuffert.

>Mit 16MHz Prescaler von 1024 und 65535 ist das auch der Fall, aber warum
>springt er mir nicht schon bei 780 rein?

Was machst du denn in deinem Programm noch alles zwischen 
Timer-Initialisierung und sei()?

Oliver

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.