Timer: Vergleichswertauswertung anhand des Timer0
In diesem kurzen Demonstrationsbeispiel, wird gezeigt, wie man mittels Timer0 eine Vergleichswertauswertung vornimmt. Ziel ist es, bei Erreichen eines bestimmten (frei definierbaren) Zählerstandes und somit einer frei definierbaren Zeit nach Zählerstart , den Ausgang des Timers am Mikrocontroller zu steuern. In diesem Fall, soll der Ausgang (OC0A = digitaler Pin 6 am Arduino) getoggelt werden.
An Pin 6 des Arduinos ist eine LED mit Vorwiderstand angeschlossen, die das toggeln optisch sichtbar macht:
Abb.: Einfacher Aufbau; Quelle: BBS2 Wolfsburg
Folgender Quellcode realisiert das Beispiel:
Es wird der größte Vorteiler (1024) verwendet, um das Toggeln optisch sichtbar zu machen.
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void)
{
DDRD = (1<<DDD7) | (1 << DDD6) |(0 << DDD5); // setzt digitalen Pin 6 als Output
PORTD |= (1<<PORTD5);
OCR0A = (0<<7) | (0<<6) | (1<<6) | (0 <<5) | (0 << 4) | (0<<3) | (0<<2) | (1<<1) | (1 <<0); // setzen des Vergleichwertes 001000011 entspricht 67
//TCCR0A = (0<< COM0A1) | (1<<COM0A0) | (0<< COM0B0) | (0<<COM0B1) | (0<<WGM01) | (0<<WGM00); // konfig. Timer0 -> Toggeln OC0A (Pin 6) bei
// erreichen des Vergleichwertes
//TCCR0B = (0<<FOC0A) | (0<<FOC0B) | (0<<WGM02) | (1 << CS02) | (0<<CS01) | (1<<CS00); //konfig. Timer0 -> Vorteiler 1024
while (1)
{
if((PIND & (1 << PORTD5)))
{
PORTD = (1<<PORTD7);
}
else
{
PORTD = (0<<PORTD7);
}
}
}
Ergebnis:
Trotz des hohen Vorteilers (1024), zählt der 8-Bit-Zähler sehr schnell. Das heißt die Zeit von Vergleichswert zu Vergleichswert ist sehr kurz, somit geht auch das Toggeln sehr schnell. Als Ergebnis erhält man eine schnell flackernde LED.
Frequenz der Zählerdurchläufe: Mikorcontroller-Taktfrequenz / (Vorteiler * Anzahl der Schritte pro Durchlauf) = 16 MHz / (1024 * 256 ) = 61,035 Hz
Die Blinkfrequenz liegt bei der Hälfte der Taktfrequenz: 61,035 Hz / 2 = 30,52 Hz
Dauer eines Zählerdurchlaufes: 1/Blinkfrequenz = 1 / 61,035 Hz = 16,384 ms
In Bezug auf den Zählerstand 0 findet der Zustandswechsel der LED nach jeweils:
t = 67/256 * 16,384 ms = 4,288 ms