Diskussion:AVR-GCC-Tutorial/Die Timer und Zähler des AVR

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Einleitung

Alternativvorschlag mthomas für Absatz 1 und 2

Jeder Timer verfügt über ein Zählerregister im Mikrocontroller, das automatisch und ohne Zutun des Programms von der Hardware weitergezählt wird. In einem einfachen Anwendungsfall stellt man den Timer auf eine Zählgeschwindigkeit (Frequenz) und kann dann anhand des Zählerstands ermitteln, wie viel Zeit vergangen ist. Das eigentlich Nützliche an Timern ist jedoch, dass man bestimmte Zählerstände mit Interrupts verknüpfen kann, so dass der Controller beim Auftreten automatisch eine vom Anwender geschriebene Routine aufruft. Eines dieser möglichen Ereignisse ist der Overflow (Zählerüberlauf), der dann auftritt, wenn der Wert des Zählerregisters (Timer/Counter-Register) den maximal möglichen Wert überschreitet. Der Maximalwert wird durch die Bitbreite des Zählerregisters bestimmt (z.B. 255 bei 8-Bit Timern). Wurde vorher der Overflow-Interrupt für den Timer aktiviert, unterbricht der Controller automatisch die Ausführung des Hauptprogramms und verzweigt in die Interrupt-Routine des Anwenders.

8-Bit Timer/Counter

Beispiel für CTC Clear Timer on Compare Match

Hier wird im Quelltext ein 16 Bit Counter benutzt, in der Überschrift aber von einem 8 Bit Counter gesprochen. Das ist für mich als Anfänger verwirrend. Kann man das ändern? Martin

Wo soll das sein? Ich sehe unter "8-Bit Timer/Counter" nur ein CTC-Beispiel mit einem 8-Bit-Timer. Oder meinst du den Software-Counter in der ISR? Dessen "Breite" hat doch mit der Überschrift nichts zu tun, die bezieht sich auf den Hardware-Counter. --Sternst 18:58, 24. Jan. 2010 (UTC)

Martin, im Beispiel für den CTC-Modus wird der Timer0 benutzt. Das ist der 8-Bit Timer. Das passt schon zum Anschnittstitel. Wieso denkst du, dass das ein 16-bit Timer ist? Vielleicht kann man dann eine Beschreibung einfügen, so dass keiner auf die gleiche Idee kommt. Stefan 19:44, 24. Jan. 2010 (UTC)

Sorry für die späte Antwort!

<c>int main(void) {

 // Timer 0 konfigurieren
 TCCR0A = (1<<WGM01); // CTC Modus
 TCCR0B = (1<<CS01); // Prescaler 8
 // ((1000000/8)/1000) = 125
 OCR0A = 125-1; // ### Bugfix 20091221

</c>

Ich bin über TCCR0A & TCCR0B sowie über OCR0A gestolpert. Ich bin davon ausgegangen, das die Buchstaben A & B hier auf den jeweiligen Teil eines 16 Bit Registers verweisen. 11:20, 03. Feb.

Fehler in Formel für CTC-Frequenzberechnung?

Hallo,

laut aktuellen Datenblatt (s.77) für z.b. den Atmega16a fehlt ein Faktor 2 in der Formel. Korrekt müsste sie so lauten:

[math]\displaystyle{ f_\text{OC} = \frac{f_\text{CPU}}{2 \cdot \text{Prescaler} \cdot \left( \text{OCRnx} + 1 \right)} }[/math]

Umgeformt gilt für OCRnx: [math]\displaystyle{ \text{OCRnx} = \frac{f_\text{CPU}}{2 \cdot \text{Prescaler} \cdot f_\text{OC}} - 1 }[/math]

oder hat die formel einen anderen hintergrund?? grüß oli

Nein das ist kein Fehler, sondern man muss aufpassen auf welche Anwendung sich die Formel bezieht. Über der obigen Formel steht:

For generating a waveform output in CTC mode, the OC0 output can be set to toggle its logical level on each compare match by setting the Compare Output mode bits to toggle mode (COM01:0 = 1). The OC0 value will not be visible on the port pin unless the data direction for the pin is set to output. The waveform generated will have a maximum frequency of fOC0 = fclk_I/O/2 when OCR0 is set to zero (0x00). The waveform frequency is defined by the following equation...

Der wichtige Teil ist das toggle. Wenn bei jedem Compare Match von Zähler und Vergleichswert der Pin umgeschaltet wird, braucht man für eine komplette Periode der erzeugten Wellenform zwei Halbperioden bzw. zwei zutreffende Compare Match Ereignisse. Deswegen der Teiler 2 in der Formel.

Wenn man jedoch die Frequenz berechnen will, mit der die Compare Match Ereignisse eintreten, bspw. weil man eine Interrupt Service Routine (ISR) dafür eingerichtet hat und dort anderes machen will, dann ist der Teiler 2 nicht vorhanden. Das ist der Fall im Artikel. Stefan 14:45, 28. Apr. 2010 (UTC)

im Code-Beispiel des 8-Bit Timers..fehler?

Im Codeb eispiel zum (-Bit timer steht :

/* uC: AT90S2313 */

  1. include <avr/io.h>
  2. include <avr/interrupt.h>

int main(void) {

 // Timer 0 konfigurieren
 TCCR0 = (1<<CS01); // Prescaler 8

 // Overflow Interrupt erlauben
 TIMSK |= (1<<TOIE0);

. . .


müsste es aber nicht

int main(void) {

 // Timer 0 konfigurieren
 TCCR0 |= (1<<CS01); // Prescaler 8

 // Overflow Interrupt erlauben
 TIMSK |= (1<<TOIE0);

. . .

heissen also statt der Zeile TCCR0 = (1<<CS01); // Prescaler 8 die zeile TCCR0 |= (1<<CS01); // Prescaler 8 fehlt da nicht ein ODER | ?