ATmega8 16Bit Timer/Counter; brauche Hilfe zu den Registern!

Gast #182053
Lesenswert?
• ▲
▼
Hallo,
bin gerade dabei ein Programm für den 16Bit Timer/Counter zu schreiben.

Dabei sollen externe Pulse gezählt und bei erreichen eines vorgegebenen
Wertes, eine Routine abgearbeitet werden.

Ich brauch nur Hilfe bei den Registern, ich verliere die Übersicht.

TCCR1A: Da brauch ich nichts einstellen??
TCCR1B: (1<<CS12) | (1<<CS11) --> Externe "Clock Source" an Pin T1
(fallende Flanke)
Wo liegt der Unterschied zwischen ICP1 (Input Capture Pin 1) und Pin
T1?

OCR1AH, OCR1AL: Muss ich in das Register den Vergleichswert schreiben?

TIMSK: (1<<OCIE1A) --> Output Compare A Match Interrupt Enable

Stimmt das so oder hab ich mich bei den Registern vertan?
Gast #182054
Lesenswert?
• ▲
▼
> Dabei sollen externe Pulse gezählt und bei erreichen eines
> vorgegebenen Wertes, eine Routine abgearbeitet werden.

Das heißt, du willst einen `compare match' programmieren und dann
wahrscheinlich am besten einen Interrupt auslösen, wenn der
entsprechende Zählerstand erreicht ist (alternativ: im Hauptprogramm
auf das entsprechende Interrupt-Flag pollen).

> Wo liegt der Unterschied zwischen ICP1 (Input Capture Pin 1) und Pin
> T1?

T1 ist der externe Takteingang (den du für dein Projekt brauchst).

Input capture brauchst do wohl in deiner Konstellation nicht: bei
einer definierbaren Flanke am ICP1 wird der aktuelle Zählerstand TCNT1
in einem Register (ICR1) zwischengespeichert und bedarfsweise noch ein
Interrupt ausgelöst.  Damit kann man Zeitabstände messen, ohne dass
die Interruptreaktionszeit selbst in die Messung eingeht.

> OCR1AH, OCR1AL: Muss ich in das Register den Vergleichswert
> schreiben?

Ja.

> TIMSK: (1<<OCIE1A) --> Output Compare A Match Interrupt Enable

Je nachdem, ob du mit Interrupt oder Polling arbeiten willst.  Wenn du
pollen willst, dann OCF1A im TIFR durch Schreiben einer 1 löschen:

TIFR = (1 << OCF1A);

(Ja, genau so.  Nicht mit |= oder sowas.  Warum, steht in der avr-libc
FAQ.)

Danach dein OCR1A programmieren und so lange warten, bis das Bit
wieder 1 wird.
Gast #182055
Lesenswert?
• ▲
▼
TIFR = (1 << OCF1A);

(Ja, genau so.  Nicht mit |= oder sowas.  Warum, steht in der avr-libc
FAQ.)


Würde zwar den in den FAQ 24 genannten SBI-Befehl statt dem OUT-Befehl
erzeugen und somit länger dauern (ist das der grund?), aber gehen würde
es doch auch, oder? "There is no need to perform a read-modify-write
cycle ..."
Gast #182057
Lesenswert?
• ▲
▼
Oh Mann, na klar. Das ist ja gerade der Witz mit dem "verODERn". 1
ODER 0 = 1. Und schon wird´s gelöscht.  Ein bischen Laufzeitperformance
wäre auch sicherlich keinen Eintrag in den FAQ´s wert gewesen. Wieder
viel gelernt heute. Danke!
Gast #182058
Lesenswert?
• ▲
▼
Wie sieht denn der Befehl aus, mit dem ich auf das Interrupt-Ereignis
pollen kann? Das Auslösen einer Interrupt Routine ist kein Problem,
aber das mit dem Pollen würde mich interessieren.
Danke.

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.