mikrocontroller.net

Forum: Compiler & IDEs ATmega8 16Bit Timer/Counter; brauche Hilfe zu den Registern!


Autor: Steffen (Gast)
Datum:

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

Autor: Jörg Wunsch (Gast)
Datum:

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

Autor: Thorsten (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thorsten

> länger dauern
nein, aber andere gesetzte interrupt flags würden durch schreibern
einer "1" (sie sind ja gesetzt, also "1") unabsichtlich gelöscht.

Autor: Thorsten (Gast)
Datum:

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

Autor: Tobi78 (Gast)
Datum:

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

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähmm ... nur mal blöd gefragt ...

warum willst du das irq event pollen? der vorteil eines IRQs ist ja
gerade dass man nicht pollen muss, sondern praktisch mit der nase
darauf gestossen wird.

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.