- Hvad er TIMER i Embedded Electronics?
- Arduino-timeregistre
- Arduino Timer afbryder
- Komponenter, der kræves
- Kredsløbsdiagram
- Programmering af Arduino UNO-timere
Arduino Development Platform blev oprindeligt udviklet i 2005 som en brugervenlig programmerbar enhed til kunstdesignprojekter. Dens hensigt var at hjælpe ikke-ingeniører til at arbejde med grundlæggende elektronik og mikrocontrollere uden meget programmeringskendskab. Men på grund af sin brugervenlige natur blev den snart tilpasset af elektronikbegyndere og hobbyister rundt omkring i verden, og i dag foretrækkes den endda til udvikling af prototype og POC-udvikling.
Selvom det er okay at begynde med Arduino, er det vigtigt langsomt at bevæge sig ind i kernemikrocontrollerne som AVR, ARM, PIC, STM osv. Og programmere det ved hjælp af deres oprindelige applikationer. Dette skyldes, at Arduino-programmeringssproget er meget let at forstå, da det meste af arbejdet udføres af forudbyggede funktioner som digitalWrite (), AnalogWrite (), Delay () osv., Mens maskinsproget på lavt niveau er skjult bag dem. Arduino-programmerne ligner ikke andre Embedded C-kodninger, hvor vi beskæftiger os med registerbits og gør dem høje eller lave baseret på logikken i vores program.
Arduino-timere uden forsinkelse:
Derfor er det nødvendigt at grave bag disse vilkår for at forstå, hvad der sker inden for de forudbyggede funktioner. For eksempel, når en forsinkelsesfunktion () bruges, indstiller den faktisk timer og tælleregistreringsbitene på ATmega-mikrocontrolleren.
I denne arduino timer-tutorial vil vi undgå brugen af denne delay () -funktion og i stedet faktisk behandle Registerene selv. Det gode er, at du kan bruge den samme Arduino IDE til dette. Vi indstiller vores timerregistreringsbits og bruger Timer Overflow Interrupt til at skifte en LED hver gang afbrydelsen opstår. Timerbitens forudindlæsningsværdi kan også justeres ved hjælp af trykknapper til at kontrollere varigheden, hvor afbrydelsen opstår.
Hvad er TIMER i Embedded Electronics?
Timer er en slags afbrydelse. Det er som et simpelt ur, der kan måle tidsintervallet for en begivenhed. Hver mikrokontroller har et ur (oscillator), siger i Arduino Uno, det er 16Mhz. Dette er ansvarlig for hastighed. Højere urfrekvens højere vil være behandlingshastigheden. En timer bruger tæller, der tæller ved en bestemt hastighed afhængigt af urfrekvensen. I Arduino Uno tager det 1/16000000 sekunder eller 62 nano sekunder at foretage en enkelt optælling. Betydning Arduino flytter fra en instruktion til en anden instruktion for hvert 62 nano-sekund.
Timere i Arduino UNO:
I Arduino UNO er der tre timere, der bruges til forskellige funktioner.
Timer0:
Det er en 8-bit timer og bruges i timerfunktion såsom forsinkelse (), millis ().
Timer1:
Det er en 16-bit timer og bruges i servobibliotek.
Timer2:
Det er en 8-bit timer og bruges i tone () -funktion.
Arduino-timeregistre
For at ændre konfigurationen af timerne bruges timerregistre.
1. Timer / Counter Control Registers (TCCRnA / B):
Dette register indeholder timerens hovedkontrolbit og bruges til at styre timerens prescalers. Det giver også mulighed for at styre timeren med WGM-bits.
Rammeformat:
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:
CS12-, CS11-, CS10-bitene i TCCR1B indstiller forkalkningsværdien. En prescaler bruges til at indstille timeren til urets hastighed. Arduino Uno har prescalers på 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | BRUG |
0 | 0 | 0 | Ingen ur-timer STOP |
0 | 0 | 1 | CLCK i / o / 1 Ingen forskalning |
0 | 1 | 0 | CLK i / o / 8 (fra prescaler) |
0 | 1 | 1 | CLK i / o / 64 (fra prescaler) |
1 | 0 | 0 | CLK i / o / 256 (fra prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (fra prescaler) |
1 | 1 | 0 | Ekstern urkilde på T1-pin. Ur på faldende kant |
1 | 1 | 1 | Ekstern urkilde på T1-pin. Ur på stigende kant. |
2. Timer / Counter Register (TCNTn)
Dette register bruges til at kontrollere tællerværdien og til at indstille en forudindlæsningsværdi.
Formel til forudindlæsningsværdi for krævet tid i sekund:
TCNTn = 65535 - (16x10 10 xTime in sec / Prescaler Value)
Sådan beregnes forudindlæsningsværdien for timer1 for tiden på 2 sek:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Arduino Timer afbryder
Vi har tidligere lært om Arduino Interrupts og har set, at Timer interrupts er slags softwareafbrydelser. Der er forskellige timerafbrydelser i Arduino, som forklares nedenfor.Timer Overflow Interrupt:
Når timeren når op til sin maksimale værdi, f.eks. (16 Bit-65535), opstår Timer Overflow Interrupt . Så kaldes en ISR-afbrydelsesrutine, når Timer Overflow Interrupt bit aktiveret i TOIEx til stede i timer interrupt mask register TIMSKx.
ISR-format:
ISR (TIMERx_OVF_vect) { }
Output Compare Register (OCRnA / B):
Her når Output Compare Match Interrupt opstår, kaldes interrupt-tjenesten ISR (TIMERx_COMPy_vect), og OCFxy-flagbit indstilles også i TIFRx-registeret. Denne ISR aktiveres ved at indstille aktiveringsbit i OCIExy til stede i TIMSKx-registeret. Hvor TIMSKx er Timer Interrupt Mask Register.
Optagelse af timerindgang:
Dernæst når timeren Input Capture Interrupt finder sted, kaldes interrupt-tjenesten ISR (TIMERx_CAPT_vect), og ICFx-flagbiten indstilles også i TIFRx (Timer Interrupt Flag Register). Denne ISR aktiveres ved at indstille aktiveringsbiten i ICIEx til stede i TIMSKx-registeret.
Komponenter, der kræves
- Arduino UNO
- Trykknapper (2)
- LED (enhver farve)
- 10k modstand (2), 2,2k (1)
- 16x2 LCD-skærm
Kredsløbsdiagram
Kredsløbforbindelser mellem Arduino UNO og 16x2 LCD-skærm:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Til potentiometer centerstift til kontraststyring af LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
EN |
+ 5V |
K |
GND |
To trykknapper med nedtrækningsmodstande på 10K er forbundet med Arduino-stifterne 2 & 4, og en LED er forbundet til PIN 7 i Arduino gennem en 2,2K-modstand.
Opsætningen vil se ud som under billedet.
Programmering af Arduino UNO-timere
I denne tutorial bruger vi TIMER OVERFLOW INTERRUPT og bruger den til at blinke LED TIL og FRA i en vis varighed ved at justere forudindlæsningsværdien (TCNT1) ved hjælp af trykknapper. Komplet kode til Arduino Timer er angivet i slutningen. Her forklarer vi koden linje for linje:
Da 16x2 LCD bruges i projektet til at vise forudindlæsningsværdien, bruges flydende krystalbibliotek.
#omfatte
LED- anodestiften, der er forbundet med Arduino pin 7, er defineret som ledPin .
#definer ledPin 7
Derefter erklæres objektet for adgang til Liquid Crystal-klassen med LCD-benene (RS, E, D4, D5, D6, D7), der er forbundet med Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Indstil derefter forudindlæsningsværdien 3035 i 4 sekunder. Tjek formlen ovenfor for at beregne forudindlæsningsværdien.
flydeværdi = 3035;
Dernæst i ugyldig opsætning () skal du først indstille LCD'et i 16x2-tilstand og vise en velkomstmeddelelse i få sekunder.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); forsinkelse (2000); lcd.clear ();
Indstil derefter LED-stiften som OUTPUT-stift, og trykknapperne indstilles som INPUT-stifter
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Deaktiver derefter alle afbrydelser:
noInterrupts ();
Derefter initialiseres Timer1.
TCCR1A = 0; TCCR1B = 0;
Preloader-timerværdien er indstillet (oprindeligt som 3035).
TCNT1 = værdi;
Derefter indstilles præskaleringsværdien 1024 i TCCR1B-registeret.
TCCR1B - = (1 << CS10) - (1 << CS12);
Timeroverløbsafbrydelsen er aktiveret i registeret Timer Interrupt Mask, så ISR kan bruges.
TIMSK1 - = (1 << TOIE1);
Endelig er alle afbrydelser aktiveret.
afbryder ()
Skriv nu ISR for Timer Overflow Interrupt, som er ansvarlig for at tænde og slukke for LED ved hjælp af digitalWrite . Tilstanden ændres, hver gang timeroverløbsafbrydelsen opstår.
ISR (TIMER1_OVF_vect) { TCNT1 = værdi; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
I tomrumsløbet () øges eller formindskes værdien af forudlæseren ved hjælp af trykknapindgangene, og værdien vises også på 16x2 LCD.
hvis (digitalRead (2) == HIGH) { værdi = værdi + 10; // Incement preload value } if (digitalRead (4) == HIGH) { value = value-10; // Reducer forspændingsværdi } lcd.setCursor (0,0); lcd.print (værdi); }
Så dette er, hvordan en timer kan bruges til at producere forsinkelse i Arduino-programmet. Tjek videoen nedenfor, hvor vi har demonstreret ændringen i forsinkelse ved at øge og formindske forudindlæsningsværdien ved hjælp af trykknapper.