- Wat is TIMER in Embedded Electronics?
- Arduino Timer registreert
- Arduino Timer onderbreekt
- Componenten vereist
- Schakelschema
- Programmeren van Arduino UNO-timers
Het Arduino Development Platform is oorspronkelijk ontwikkeld in 2005 als een gebruiksvriendelijk programmeerbaar apparaat voor kunstontwerpprojecten. De bedoeling was om niet-ingenieurs te helpen werken met basiselektronica en microcontrollers zonder veel programmeerkennis. Maar vanwege zijn gebruiksvriendelijke karakter werd het al snel aangepast door elektronica-beginners en hobbyisten over de hele wereld en tegenwoordig heeft het zelfs de voorkeur voor prototype-ontwikkeling en POC-ontwikkelingen.
Hoewel het prima is om met Arduino te beginnen, is het belangrijk om langzaam naar de kernmicrocontrollers zoals AVR, ARM, PIC, STM enz. Te gaan en deze te programmeren met hun eigen applicaties. Dit komt omdat de Arduino-programmeertaal heel gemakkelijk te begrijpen is, aangezien het meeste werk wordt gedaan door vooraf gebouwde functies zoals digitalWrite (), AnalogWrite (), Delay () enz. Terwijl de machinetaal op laag niveau daarachter verborgen is. De Arduino-programma's zijn niet vergelijkbaar met andere Embedded C-codering, waarbij we omgaan met registerbits en ze hoog of laag maken op basis van de logica van ons programma.
Arduino Timers zonder vertraging:
Om te begrijpen wat er gebeurt binnen de vooraf gebouwde functies, moeten we daarom achter deze termen graven. Als bijvoorbeeld een delay () -functie wordt gebruikt, worden de Timer- en Counter Register-bits van de ATmega-microcontroller daadwerkelijk ingesteld.
In deze arduino-timer-tutorial gaan we het gebruik van deze delay () -functie vermijden en in plaats daarvan de registers zelf afhandelen. Het goede is dat je hiervoor dezelfde Arduino IDE kunt gebruiken. We zullen onze Timer-registerbits instellen en de Timer Overflow Interrupt gebruiken om elke keer dat de interrupt optreedt een LED in te schakelen. De preloader-waarde van de Timer-bit kan ook worden aangepast met behulp van drukknoppen om de duur van de onderbreking te regelen.
Wat is TIMER in Embedded Electronics?
Timer is een soort onderbreking. Het is als een eenvoudige klok die het tijdsinterval van een gebeurtenis kan meten. Elke microcontroller heeft een klok (oscillator), zeg maar in Arduino Uno is dat 16Mhz. Dit is verantwoordelijk voor snelheid. Hoe hoger de klokfrequentie, hoe hoger de verwerkingssnelheid. Een timer gebruikt een teller die op een bepaalde snelheid telt, afhankelijk van de klokfrequentie. In Arduino Uno duurt het 1/16000000 seconden of 62 nano seconden om een enkele telling te maken. Dit betekent dat Arduino voor elke 62 nano-seconde van de ene instructie naar de andere gaat.
Timers in Arduino UNO:
In Arduino UNO worden drie timers gebruikt voor verschillende functies.
Timer0:
Het is een 8-bits timer en wordt gebruikt in timerfuncties zoals delay (), millis ().
Timer1:
Het is een 16-bits timer en wordt gebruikt in de servobibliotheek.
Timer2:
Het is een 8-bits timer en wordt gebruikt in de toon () -functie.
Arduino Timer registreert
Om de configuratie van de timers te wijzigen, worden timerregisters gebruikt.
1. Registers voor timer- / tellerbesturing (TCCRnA / B):
Dit register bevat de belangrijkste besturingsbits van de timer en wordt gebruikt om de prescalers van de timer te besturen. Het maakt het ook mogelijk om de modus van de timer te regelen met behulp van de WGM-bits.
Frame formaat:
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 |
Voorkalker:
De CS12-, CS11-, CS10-bits in TCCR1B stellen de presalerwaarde in. Een voorschrijver wordt gebruikt om de kloksnelheid van de timer in te stellen. Arduino Uno heeft prescalers van 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | GEBRUIK |
0 | 0 | 0 | Geen kloktimer STOP |
0 | 0 | 1 | CLCK i / o / 1 Geen voorkalibratie |
0 | 1 | 0 | CLK i / o / 8 (van Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (van Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (van prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (van Prescaler) |
1 | 1 | 0 | Externe klokbron op T1 Pin. Klok op dalende rand |
1 | 1 | 1 | Externe klokbron op T1-pin. Klok op stijgende rand. |
2. Timer / tellerregister (TCNTn)
Dit register wordt gebruikt om de tellerwaarde te controleren en om een voorladerwaarde in te stellen.
Formule voor voorladerwaarde voor vereiste tijd in seconden:
TCNTn = 65535 - (16x10 10 xTijd in sec / Prescaler-waarde)
Om de waarde van de voorlader voor timer1 te berekenen voor een tijd van 2 sec:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Timer onderbreekt
We hebben eerder geleerd over Arduino Interrupts en hebben gezien dat Timer-interrupts een soort software-interrupts zijn. Er zijn verschillende timer-interrupts in Arduino die hieronder worden uitgelegd.Timer overloop onderbreken:
Telkens wanneer de timer zijn maximale waarde bereikt, bijvoorbeeld (16 Bit-65535), treedt de Timer Overflow Interrupt op. Er wordt dus een ISR-onderbrekingsserviceroutine aangeroepen wanneer de Timer Overflow Interrupt-bit geactiveerd is in de TOIEx die aanwezig is in het timer-onderbrekingsmaskerregister TIMSKx.
ISR-indeling:
ISR (TIMERx_OVF_vect) { }
Uitgangsvergelijkingsregister (OCRnA / B):
Wanneer hier de Output Compare Match Interrupt plaatsvindt, wordt de interruptdienst ISR (TIMERx_COMPy_vect) aangeroepen en wordt ook de OCFxy-vlagbit in het TIFRx-register gezet. Deze ISR wordt ingeschakeld door de activeringsbit in OCIExy aanwezig in het TIMSKx-register in te stellen. Waar TIMSKx Timer Interrupt Mask Register is.
Timer-ingang vastleggen:
Wanneer vervolgens de timer Input Capture Interrupt optreedt, wordt de interruptdienst ISR (TIMERx_CAPT_vect) aangeroepen en zal ook de ICFx-vlagbit worden ingesteld in TIFRx (Timer Interrupt Flag Register). Deze ISR wordt ingeschakeld door de inschakelingsbit in ICIEx in het TIMSKx-register in te stellen.
Componenten vereist
- Arduino UNO
- Drukknoppen (2)
- LED (elke kleur)
- 10k weerstand (2), 2,2k (1)
- 16x2 LCD-scherm
Schakelschema
Circuitverbindingen tussen Arduino UNO en 16x2 LCD-scherm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Naar middenpen van potentiometer voor contrastregeling van LCD |
RS |
8 |
RW |
GND |
E. |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EEN |
+ 5V |
K |
GND |
Twee drukknoppen met pull-down weerstanden van 10K zijn verbonden met de Arduino pinnen 2 & 4 en een LED is verbonden met pin 7 van Arduino via een 2.2K weerstand.
De installatie ziet er uit zoals hieronder afgebeeld.
Programmeren van Arduino UNO-timers
In deze tutorial zullen we de TIMER OVERFLOW INTERRUPT gebruiken en deze gebruiken om de LED AAN en UIT gedurende een bepaalde tijd te laten knipperen door de waarde van de voorlader (TCNT1) aan te passen met behulp van drukknoppen. De volledige code voor Arduino Timer wordt aan het einde gegeven. Hier leggen we de code regel voor regel uit:
Omdat in het project 16x2 LCD wordt gebruikt om de waarde van de preloader weer te geven, wordt liquid crystal library gebruikt.
# omvatten
De LED-anode-pin die is verbonden met Arduino-pin 7 wordt gedefinieerd als ledPin .
#define ledPin 7
Vervolgens wordt het object voor toegang tot de Liquid Crystal-klasse gedeclareerd met de LCD-pinnen (RS, E, D4, D5, D6, D7) die zijn verbonden met Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Stel vervolgens de waarde van de voorlader 3035 in voor 4 seconden. Controleer de bovenstaande formule om de waarde van de voorlader te berekenen.
zwevende waarde = 3035;
Zet vervolgens in de ongeldige setup () eerst het LCD-scherm in de 16x2-modus en geef een paar seconden een welkomstbericht weer.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); vertraging (2000); lcd.clear ();
Stel vervolgens de LED-pin in als OUTPUT-pin en de drukknoppen worden ingesteld als INPUT-pinnen
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Schakel vervolgens alle interrupts uit:
noInterrupts ();
Vervolgens wordt Timer1 geïnitialiseerd.
TCCR1A = 0; TCCR1B = 0;
De timerwaarde van de voorlader is ingesteld (aanvankelijk als 3035).
TCNT1 = waarde;
Dan wordt de Pre scaler-waarde 1024 ingesteld in het TCCR1B-register.
TCCR1B - = (1 << CS10) - (1 << CS12);
De Timer overflow-interrupt is ingeschakeld in het register Timer Interrupt Mask, zodat de ISR kan worden gebruikt.
TIMSK1 - = (1 << TOIE1);
Eindelijk zijn alle interrupts ingeschakeld.
onderbreekt ();
Schrijf nu de ISR voor Timer Overflow Interrupt die verantwoordelijk is voor het in- en uitschakelen van LED met behulp van digitalWrite . De toestand verandert telkens wanneer de timeroverlooponderbreking optreedt.
ISR (TIMER1_OVF_vect) { TCNT1 = waarde; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
In de lege lus () wordt de waarde van de voorlader verhoogd of verlaagd met behulp van de drukknopingangen en ook wordt de waarde weergegeven op een 16x2 LCD.
if (digitalRead (2) == HIGH) { waarde = waarde + 10; // Incement preload value } if (digitalRead (4) == HIGH) { waarde = waarde-10; // Voorlaadwaarde verlagen } lcd.setCursor (0,0); lcd.print (waarde); }
Dus dit is hoe een timer kan worden gebruikt om vertraging in het Arduino-programma te produceren. Bekijk de onderstaande video waarin we de verandering in vertraging hebben gedemonstreerd door de waarde van de voorlader te verhogen en te verlagen met behulp van drukknoppen.