- Was ist TIMER in Embedded Electronics?
- Arduino Timer Register
- Arduino Timer Interrupts
- Erforderliche Komponenten
- Schaltplan
- Programmieren von Arduino UNO-Timern
Die Arduino Development Platform wurde ursprünglich 2005 als benutzerfreundliches programmierbares Gerät für Kunstdesignprojekte entwickelt. Ziel war es, Nicht-Ingenieuren bei der Arbeit mit Basiselektronik und Mikrocontrollern ohne große Programmierkenntnisse zu helfen. Aufgrund seiner einfachen Bedienung wurde es jedoch bald von Elektronik-Anfängern und Hobbyisten auf der ganzen Welt angepasst und wird heute sogar für die Entwicklung von Prototypen und POCs bevorzugt.
Während es in Ordnung ist, mit Arduino zu beginnen, ist es wichtig, langsam in die Kernmikrocontroller wie AVR, ARM, PIC, STM usw. einzusteigen und sie mit ihren nativen Anwendungen zu programmieren. Dies liegt daran, dass die Programmiersprache Arduino sehr einfach zu verstehen ist, da der Großteil der Arbeit von vorgefertigten Funktionen wie digitalWrite (), AnalogWrite (), Delay () usw. erledigt wird, während die Maschinensprache auf niedriger Ebene dahinter verborgen ist. Die Arduino-Programme sind nicht mit anderen Embedded C-Codierungen vergleichbar, bei denen wir uns mit Registerbits befassen und sie basierend auf der Logik unseres Programms hoch oder niedrig machen.
Arduino Timer ohne Verzögerung:
Um zu verstehen, was in den vorgefertigten Funktionen geschieht, müssen wir uns hinter diese Begriffe stellen. Wenn beispielsweise eine delay () -Funktion verwendet wird, werden die Timer- und Zählerregisterbits des ATmega-Mikrocontrollers tatsächlich gesetzt.
In diesem Arduino-Timer-Tutorial werden wir die Verwendung dieser delay () -Funktion vermeiden und uns stattdessen tatsächlich mit den Registern selbst befassen. Das Gute ist, dass Sie dafür dieselbe Arduino-IDE verwenden können. Wir setzen unsere Timer-Registerbits und verwenden den Timer-Überlauf-Interrupt, um jedes Mal, wenn der Interrupt auftritt, eine LED umzuschalten. Der Preloader-Wert des Timer-Bits kann auch über Drucktasten eingestellt werden, um die Dauer des Interrupts zu steuern.
Was ist TIMER in Embedded Electronics?
Timer ist eine Art Interrupt. Es ist wie eine einfache Uhr, die das Zeitintervall eines Ereignisses messen kann. Jeder Mikrocontroller hat eine Uhr (Oszillator), in Arduino Uno sind es 16 MHz. Dies ist für die Geschwindigkeit verantwortlich. Je höher die Taktfrequenz, desto höher die Verarbeitungsgeschwindigkeit. Ein Timer verwendet einen Zähler, der abhängig von der Taktfrequenz mit einer bestimmten Geschwindigkeit zählt. In Arduino Uno dauert es 1/16000000 Sekunden oder 62 Nanosekunden, um eine einzelne Zählung durchzuführen. Das heißt, Arduino wechselt alle 62 Nano-Sekunden von einem Befehl zu einem anderen.
Timer in Arduino UNO:
In Arduino UNO werden drei Timer für verschiedene Funktionen verwendet.
Timer0:
Es ist ein 8-Bit-Timer und wird in Timerfunktionen wie delay (), millis () verwendet.
Timer1:
Es ist ein 16-Bit-Timer und wird in der Servobibliothek verwendet.
Timer2:
Es ist ein 8-Bit-Timer und wird in der Funktion ton () verwendet.
Arduino Timer Register
Um die Konfiguration der Timer zu ändern, werden Timer-Register verwendet.
1. Timer- / Zählersteuerregister (TCCRnA / B):
Dieses Register enthält die Hauptsteuerbits des Timers und dient zur Steuerung der Vorskalierer des Timers. Es ermöglicht auch die Steuerung des Timer-Modus mithilfe der WGM-Bits.
Rahmenformat:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
Die CS12-, CS11- und CS10-Bits in TCCR1B setzen den Prescaler-Wert. Ein Prescaler wird verwendet, um die Taktrate des Timers einzustellen. Arduino Uno hat Vorskalierer von 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | VERWENDEN |
0 | 0 | 0 | Kein Clock Timer STOP |
0 | 0 | 1 | CLCK i / o / 1 Keine Vorskalierung |
0 | 1 | 0 | CLK i / o / 8 (vom Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (vom Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (vom Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (vom Prescaler) |
1 | 1 | 0 | Externe Taktquelle am T1-Pin. Uhr auf fallende Flanke |
1 | 1 | 1 | Externe Taktquelle am T1-Pin. Uhr mit steigender Flanke. |
2. Timer / Zählerregister (TCNTn)
Dieses Register wird verwendet, um den Zählerwert zu steuern und einen Preloader-Wert festzulegen.
Formel für den Preloader-Wert für die erforderliche Zeit in Sekunden:
TCNTn = 65535 - (16 x 10 10 x Zeit in Sekunden / Prescaler-Wert)
So berechnen Sie den Preloader-Wert für timer1 für eine Zeit von 2 Sekunden:
TCNT1 = 65535 - (16 × 10 10 × 2/1024) = 34285
Arduino Timer Interrupts
Wir haben zuvor etwas über Arduino-Interrupts gelernt und festgestellt, dass Timer-Interrupts eine Art Software-Interrupt sind. In Arduino gibt es verschiedene Timer-Interrupts, die im Folgenden erläutert werden.Timer-Überlauf-Interrupt:
Immer wenn der Timer seinen Maximalwert erreicht, beispielsweise (16 Bit-65535), tritt der Timer-Überlauf-Interrupt auf. Daher wird eine ISR-Interrupt-Serviceroutine aufgerufen, wenn das Timer-Überlauf-Interrupt-Bit im TOIEx aktiviert ist, das im Timer-Interrupt-Maskenregister TIMSKx vorhanden ist.
ISR-Format:
ISR (TIMERx_OVF_vect) { }
Ausgangsvergleichsregister (OCRnA / B):
Wenn hier der Output Compare Match Interrupt auftritt, wird der Interrupt-Dienst ISR (TIMERx_COMPy_vect) aufgerufen und auch das OCFxy-Flag-Bit wird im TIFRx-Register gesetzt. Dieser ISR wird durch Setzen des Aktivierungsbits in OCIExy aktiviert, das im TIMSKx-Register vorhanden ist. Wobei TIMSKx das Timer Interrupt Mask Register ist.
Timer Input Capture:
Wenn als nächstes der Timer Input Capture Interrupt auftritt, wird der Interrupt-Dienst ISR (TIMERx_CAPT_vect) aufgerufen und auch das ICFx-Flag-Bit wird in TIFRx (Timer Interrupt Flag Register) gesetzt. Dieser ISR wird aktiviert, indem das Aktivierungsbit in ICIEx gesetzt wird, das im TIMSKx-Register vorhanden ist.
Erforderliche Komponenten
- Arduino UNO
- Druckknöpfe (2)
- LED (beliebige Farbe)
- 10k Widerstand (2), 2,2k (1)
- 16x2 LCD-Anzeige
Schaltplan
Schaltungsverbindungen zwischen Arduino UNO und 16x2 LCD-Display:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Zum Potentiometer-Mittelstift zur Kontrastregelung des LCD |
RS |
8 |
RW |
GND |
E. |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EIN |
+ 5V |
K. |
GND |
Zwei Drucktasten mit 10K-Pulldown-Widerständen sind mit den Arduino-Pins 2 und 4 verbunden, und eine LED ist über einen 2,2K-Widerstand mit PIN 7 von Arduino verbunden.
Das Setup sieht wie im folgenden Bild aus.
Programmieren von Arduino UNO-Timern
In diesem Tutorial verwenden wir die TIMER OVERFLOW INTERRUPT und blinken die LED für eine bestimmte Dauer ein und aus, indem wir den Preloader-Wert (TCNT1) mithilfe von Drucktasten anpassen. Der vollständige Code für den Arduino Timer ist am Ende angegeben. Hier erklären wir den Code Zeile für Zeile:
Da im Projekt ein 16x2-LCD zur Anzeige des Preloader-Werts verwendet wird, wird eine Flüssigkristallbibliothek verwendet.
#einschließen
Der LED-Anoden-Pin, der mit dem Arduino-Pin 7 verbunden ist, wird als ledPin definiert.
#define ledPin 7
Als nächstes wird das Objekt für den Zugriff auf die Flüssigkristallklasse mit den LCD-Pins (RS, E, D4, D5, D6, D7) deklariert, die mit Arduino UNO verbunden sind.
LiquidCrystal lcd (8,9,10,11,12,13);
Stellen Sie dann den Preloader-Wert 3035 für 4 Sekunden ein. Überprüfen Sie die obige Formel, um den Preloader-Wert zu berechnen.
Gleitkommawert = 3035;
Stellen Sie als nächstes in void setup () zuerst das LCD in den 16x2-Modus und zeigen Sie einige Sekunden lang eine Willkommensnachricht an.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); Verzögerung (2000); lcd.clear ();
Als nächstes setzen Sie den LED-Pin als OUTPUT-Pin und die Drucktasten als INPUT-Pins
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Deaktivieren Sie als Nächstes alle Interrupts:
noInterrupts ();
Als nächstes wird der Timer1 initialisiert.
TCCR1A = 0; TCCR1B = 0;
Der Preloader-Timer-Wert wird eingestellt (anfänglich als 3035).
TCNT1 = Wert;
Dann wird der Pre-Scaler-Wert 1024 im TCCR1B-Register eingestellt.
TCCR1B - = (1 << CS10) - (1 << CS12);
Der Timer-Überlauf-Interrupt ist im Register Timer-Interrupt-Maske aktiviert, damit der ISR verwendet werden kann.
TIMSK1 - = (1 << TOIE1);
Endlich sind alle Interrupts aktiviert.
Interrupts ();
Schreiben Sie nun den ISR für Timer Overflow Interrupt, der für das Ein- und Ausschalten der LED mit digitalWrite verantwortlich ist . Der Status ändert sich immer dann, wenn der Timer-Überlauf-Interrupt auftritt.
ISR (TIMER1_OVF_vect) { TCNT1 = Wert; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }}
In der Void-Schleife () wird der Wert des Preloaders mithilfe der Drucktasteneingänge erhöht oder verringert, und der Wert wird auch auf dem 16x2-LCD angezeigt.
if (digitalRead (2) == HIGH) { Wert = Wert + 10; // Incement Preload-Wert } if (digitalRead (4) == HIGH) { value = value-10; // Vorspannungswert dekrementieren } lcd.setCursor (0,0); lcd.print (Wert); }}
Auf diese Weise kann ein Timer verwendet werden, um eine Verzögerung im Arduino-Programm zu erzeugen. Sehen Sie sich das folgende Video an, in dem wir die Änderung der Verzögerung durch Erhöhen und Verringern des Preloader-Werts mithilfe von Drucktasten demonstriert haben.