Mikrocontroller – Ein Leitfaden für Einsteiger – Grundlegende und Standardmäßige Verwendung eines Timers und Zählers sowie des Mikrocontroller-Taktes

Mikrocontroller - Eine Einführung für Anfänger - Grundlegende und standardmäßige Verwendung eines Timers und Zählers und des Mikrocontroller-Takts

Timer und Zähler sind so wichtig, dass Sie in dieser Tutorialreihe viele Beispiele finden werden. dieser Tutorial-Reihe finden. Wie der Name schon sagt, können Timer die Zeit und das Zählen bestimmen. Zählen und Zeiteinstellung ermöglichen einige wirklich coole Dinge, wie die Steuerung der Helligkeit von LEDs, die Steuerung des Winkels von Servowellen, den Empfang von Sensordaten, die in PWM (Pulsweitenmodulation - mehr dazu in einem anderen Tutorial), einen Timer erstellen (wie am Herd), oder einfach nur eine Zeitvariable zu Ihrem Mikrocontroller hinzufügen Projekt.

Zuerst ist es jedoch wichtig zu wissen, dass sich in (oder außerhalb) der AVR-Mikrocontroller eine Uhr befindet. Tatsächlich haben alle Mikrocontroller Uhren in sich (oder verwenden eine, die sich außerhalb eines Mikrocontrollers befindet). Mikrocontroller benötigen Uhren, damit unsere Programme im Rhythmus der Uhr ausgeführt werden können. Dies ist die grundlegende Funktion von Mikrocontrollern. Eine grundlegende Anweisung wird verarbeitet, wenn ein Tick der Uhr vergeht. Genau wie die Programme, die wir schreiben, werden Anweisungen im Takt der Uhrenticks verarbeitet, wenn die Uhrenticks vergehen.

Die Timer- und Zählerfunktionen im Mikrocontroller zählen einfach synchron mit dem Mikrocontroller-Takt. Der Zähler kann jedoch nur bis 256 (8-Bit-Zähler) oder 65535 (16-Bit-Zähler) zählen. Das ist weit entfernt von den 1.000.000 Ticks pro Sekunde, die der Standard-AVR-Mikrocontroller bietet. Der Mikrocontroller bietet eine sehr nützliche Funktion namens Prescaling. Prescaling ist einfach eine Möglichkeit für den Zähler, eine bestimmte Anzahl von Mikrocontroller-Taktticks zu überspringen. Die AVR-Mikrocontroller ermöglichen das Prescaling (Überspringen) von Zahlen: 8, 64, 256 und 1024. Das heißt, wenn 64 als Prescaler eingestellt ist, zählt der Zähler nur jedes Mal, wenn der Takt 64 Mal tickt. Das bedeutet, dass der Zähler in einer Sekunde (in der der Mikrocontroller eine Million Mal tickt) nur bis 15.625 zählen würde. Man könnte sehen, dass, wenn der Zähler bis zu dieser Zahl zählt, man eine LED jede Sekunde blinken lassen könnte.

Hauptsächlich haben Timer ein Register zur Steuerung und ein Register, das die Zählzahl enthält. Zahl enthält. Das Steuerregister enthält einige Schalter, um Funktionen ein- und auszuschalten. Und Sie haben es erraten... eine der Funktionen ist die Auswahl des Prescalings. Das Steuerregister Register wird TCCR0 oder TCCR1 (Timer/Counter Control Register) genannt. Das TCCR0 ist das 8-Bit-Steuerregister und hat nur ein 8-Bit-Steuerregister, es gibt also nur 8 Schalter zum Ein- und Ausschalten. TCCR1 ist 16-Bit, hat also 16 Schalter zum Ein- und Ausschalten. und Ausschalten, aber es kommt in zwei 8-Bit-Registern, die A und B (TCCR1A und TCCR1B) genannt werden. Die Schalter sind wie folgt: FOC (force Output Compare), WGM (Waveform Generation Mode), COM (Compare Match Output Mode) und CS (Clock Select).

Das Register, das die Zählung enthält, wird TCNT-Register genannt. Und es gibt eine 8-Bit-Version Version (TCNT0) und eine 16-Bit-Version (TCNT1). Das TCNT1-Register erhält seine Zahl tatsächlich aus zwei anderen 8-Bit-Registern, um eine vollständige 16-Bit-Zahl zu erstellen, aber das geschieht alles hinter den Kulissen (abstrahiert), sodass Sie sich keine Sorgen machen müssen, wie das TCNT1 diese Fähigkeit zur 16-Bit-Darstellung erhält, denken Sie einfach, es ist Magie.

Im Video wurden zwei Programme gezeigt: eines, das nur eine einzelne LED zeigt, die etwa 1 Sekunde lang blinkt, und ein anderes Programm, das eine Reihe von 7 LEDs zeigt, die jede Sekunde jagen, und eine weitere Reihe von 7 LEDs, die jeweils 1 Sekunde lang jagen. Das letztere Programm wird hier gezeigt, da es die meisten Funktionen des 16-Bit-Timers verwendet.

Ohne Wiederholungen aus früheren Beiträgen zu machen, initialisiert das Programm die Ports für die LEDs und stellt den Timer/Zähler #1 (den 16-Bit-Timer) ein. Das Steuerregister TCCR1B wird verwendet, um den Prescaling-Faktor von 64 mit den Schaltern CS10 und CS11 einzustellen.

Da wir wollen, dass eine der 7 LEDs jeweils 1/7 Sekunde lang jagt, nehmen wir die Zahl 15.625 (1000000/64 - denken Sie daran, 1000000 ist der 1 MHz Takt des Mikrocontrollers) und teilen sie durch 7, um ~2.232,143 zu erhalten. Nun, Sie sagen, aber Sie verwenden nur 2232 im Programm!! Das liegt daran, dass TCNT1 nur ganze Zahlen (keine Dezimalzahlen) akzeptiert. Nun sagen Sie, die Zeit wird um den Betrag der Dezimalzahl verschoben sein!! Das stimmt, aber die interne AVR-Uhr ist sowieso um +/- 10% ungenau. Wenn ein externer Quarz verwendet wird, sollten Sie eine perfekte Zahl verwenden, die die entsprechende Zählung darstellt.

Sie werden feststellen, dass das TCNT1 auch manuell auf Null zurückgesetzt wird. Dies ist notwendig, da das TCNT1 sonst über die eingestellte Bedingung von 2232 hinaus weiterzählt. Es gibt andere Steuerungsfunktionen, die ein automatisches Nullen dieser Zahl haben, aber darauf werden wir in einem anderen Tutorial eingehen. Die restlichen Teile des Programms verwenden Dinge, die wir in früheren Tutorials gelernt haben (LED ein- und ausschalten und Arrays).

#include
int main(void)
{
DDRB = 0b01111111;
PORTB = 0b00000000;
DDRD = 0b01111111;
PORTD = 0b00000000;
TCCR1B |= 1< int LEDNumber[2];
while(1)
{
if (TCNT1 > 2232)
{
TCNT1 = 0;
PORTB = 1< LEDNumber[0] ++;
if (LEDNumber[0] > 6)
{
LEDNumber[0] = 0;
PORTD = 1< LEDNumber[1] ++;
if (LEDNumber[1] > 6)
LEDNumber[1] = 0;
}
}
}
}
Zurück zum Blog

Hinterlasse einen Kommentar

Bitte beachte, dass Kommentare vor der Veröffentlichung freigegeben werden müssen.