- Kaj je TIMER v vgrajeni elektroniki?
- Registri časovnika Arduino
- Prekinitve časovnika Arduino
- Potrebne komponente
- Shema vezja
- Programiranje Arduino UNO časovnikov
Razvojna platforma Arduino je bila prvotno razvita leta 2005 kot enostavna programljiva naprava za umetniške projekte. Njegov namen je bil pomagati neinženirjem pri delu z osnovno elektroniko in mikrokrmilniki brez veliko znanja programiranja. Potem pa so ga zaradi enostavne narave kmalu prilagodili začetniki elektronike in ljubitelji po vsem svetu, danes pa je celo bolj primeren za razvoj prototipov in razvoj POC.
Čeprav je v redu začeti z Arduinom, je pomembno, da se počasi premaknete v jedro mikrokrmilnikov, kot so AVR, ARM, PIC, STM itd., In ga programirate z uporabo njihovih izvornih aplikacij. Razlog za to je, da je programski jezik Arduino zelo enostaven za razumevanje, saj večino dela opravijo vnaprej vgrajene funkcije, kot so digitalWrite (), AnalogWrite (), Delay () itd., Medtem ko je strojni jezik nizke ravni skrit za njimi. Programi Arduino niso podobni drugim vgrajenim C kodiranjem, kjer imamo opravka z registrskimi biti in jih glede na logiko našega programa določimo za visoke ali nizke.
Arduino časovniki brez odlašanja:
Da bi razumeli, kaj se dogaja znotraj vnaprej vgrajenih funkcij, se moramo poglobiti v te izraze. Na primer, ko se uporablja funkcija delay (), dejansko nastavi bitov časovnika in števca mikrokrmilnika ATmega.
V tej vadnici za arduino timer se bomo izognili uporabi te funkcije delay () in namesto tega dejansko obravnavali same registre. Dobra stvar je, da lahko za to uporabite isti Arduino IDE. Nastavili bomo bite registra časovnika in s pomočjo prekinitve prekinitve časovnika preklopili lučko LED vsakič, ko pride do prekinitve. Vrednost prednaloževalnika bitov časovnika lahko nastavite tudi s pomočjo tipk za nadzor trajanja prekinitve.
Kaj je TIMER v vgrajeni elektroniki?
Časovnik je nekako prekinitev. Je kot preprosta ura, ki lahko meri časovni interval dogodka. Vsak mikrokrmilnik ima uro (oscilator), recimo v Arduino Uno znaša 16 MHz. To je odgovorno za hitrost. Višja kot je frekvenca ure, bo večja hitrost obdelave. Časovnik uporablja števec, ki šteje pri določeni hitrosti, odvisno od frekvence ure. V programu Arduino Uno traja 1/16000000 sekund ali 62nano sekund, da lahko izvedete eno samo štetje. To pomeni, da se Arduino vsakih 62 nano sekund premika od enega do drugega.
Časovniki v Arduino UNO:
V Arduino UNO obstajajo trije merilniki časa, ki se uporabljajo za različne funkcije.
Časovnik0:
Je 8-bitni časovnik in se uporablja v funkciji časovnika, kot so zakasnitev (), milis ().
Časovnik1:
Je 16-bitni časovnik in se uporablja v servo knjižnici.
Časovnik2:
Je 8-bitni časovnik in se uporablja v funkciji tone ().
Registri časovnika Arduino
Za spreminjanje konfiguracije časovnikov se uporabljajo registri časovnikov.
1. Registri časovnika / števca (TCCRnA / B):
Ta register vsebuje glavne krmilne bite časovnika in se uporablja za nadzor prednapenjalnikov časovnika. Omogoča tudi nadzor načina časovnika z uporabo bitov WGM.
Oblika okvira:
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 |
Predgretje:
Bit CS12, CS11, CS10 v TCCR1B nastavi vrednost prednapetostnega znaka. Prednapenjalec se uporablja za nastavitev takta časovnika. Arduino Uno ima prednapenjalnike 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | UPORABA |
0 | 0 | 0 | Brez časovnika STOP |
0 | 0 | 1. | CLCK i / o / 1 Brez predkaliranja |
0 | 1. | 0 | CLK i / o / 8 (iz prednapenjalnika) |
0 | 1. | 1. | CLK i / o / 64 (iz prednapenjalnika) |
1. | 0 | 0 | CLK i / o / 256 (iz prednapenjalnika) |
1. | 0 | 1. | CLK i / o / 1024 (iz prednapenjalnika) |
1. | 1. | 0 | Zunanji vir ure na T1 Pin. Ura na padajočem robu |
1. | 1. | 1. | Zunanji vir ure na T1 zatiču. Ura na naraščajočem robu. |
2. Časovnik / števec (TCNTn)
Ta register se uporablja za nadzor vrednosti števca in za nastavitev vrednosti prednalaganja.
Formula za vrednost prednaložnika za zahtevani čas v sekundi:
TCNTn = 65535 - (16x10 10 xTime v sec / vrednost prednapenjalnika)
Za izračun vrednosti prednaložnika za timer1 za čas 2 Sec:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Prekinitve časovnika Arduino
Pred tem smo že izvedeli za prekinitve Arduino in videli smo, da so prekinitve s časovnikom nekakšne programske prekinitve. V Arduinu obstajajo različne prekinitve časovnika, ki so razložene spodaj.Prekinitev prelivanja časovnika:
Kadar koli časovnik doseže svojo največjo vrednost, recimo na primer (16 Bit-65535), pride do prekinitve časovnega prelivanja . Torej, poklicna servisna prekinitev ISR se pokliče, ko je bit prekinitve prekinitve časovnika omogočen v TOIEx, ki je prisoten v registrski maski prekinitvenega časa TIMSKx.
Oblika ISR:
ISR (TIMERx_OVF_vect) { }
Izhodni primerjalni register (OCRnA / B):
Tukaj, ko pride do prekinitve ujemanja primerjave izhodov, se pokliče ISR storitve prekinitve (TIMERx_COMPy_vect) in v registru TIFRx bo nastavljen tudi bit zastavice OCFxy. Ta ISR je omogočen z nastavitvijo bita za omogočanje v OCIExy, ki je prisoten v registru TIMSKx. Kjer je TIMSKx register maske prekinitve s časovnikom.
Zajem vnosa s časovnikom:
Nato, ko pride do prekinitve zajema vnosa s časovnikom, se pokliče ISR storitve prekinitve (TIMERx_CAPT_vect) in tudi bit zastavice ICFx bo nastavljen v TIFRx (Timer Interrupt Flag Register). Ta ISR je omogočen z nastavitvijo bita za omogočanje v ICIEx, ki je prisoten v registru TIMSKx.
Potrebne komponente
- Arduino UNO
- Tipke (2)
- LED (poljubna barva)
- 10k upor (2), 2,2 k (1)
- LCD zaslon 16x2
Shema vezja
Vezja med Arduino UNO in 16x2 LCD zaslonom:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Na sredinski zatič potenciometra za nadzor kontrasta LCD-ja |
RS |
8. |
RW |
GND |
E |
9. |
D4 |
10. |
D5 |
11. |
D6 |
12. |
D7 |
13. |
A |
+ 5V |
K |
GND |
Dva potisna gumba z uporovnimi upori 10K sta povezana z Arduino zatičema 2 in 4, LED-dioda pa je na utor PIN 7 Arduino prek 2.2K upora.
Namestitev bo videti kot spodnja slika.
Programiranje Arduino UNO časovnikov
V tej vadnici bomo uporabili PREKINITEV ČASOVNEGA PRETOKA in z njo utripali LED VKLOPLJENO in IZKLOPLJENO za določeno trajanje s prilagoditvijo vrednosti prednaložnika (TCNT1) s pomočjo tipk. Popolna koda za Arduino Timer je podana na koncu. Tukaj razlagamo kodo po vrsticah:
Ker se v projektu za prikaz vrednosti prednalagalnika uporablja LCD 16x2, se uporablja knjižnica s tekočimi kristali.
#include
Anodni zatič LED, ki je povezan z zatičem Arduino 7, je opredeljen kot ledPin .
#define ledPin 7
Nato je predmet za dostop do razreda Liquid Crystal prijavljen z zatiči LCD (RS, E, D4, D5, D6, D7), ki so povezani z Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Nato za 4 sekunde nastavite vrednost prednalagalnika 3035. Preverite zgornjo formulo, da izračunate vrednost prednaložnika.
float vrednost = 3035;
Naslednja void setup (), najprej LCD nastavite v način 16x2 in nekaj sekund prikažite pozdravno sporočilo.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); zamuda (2000); lcd.clear ();
Nato nastavite zatič LED kot OUTPUT zatič, potisni gumbi pa za vhod INPUT
pinMode (ledPin, IZHOD); pinMode (2, INPUT); pinMode (4, INPUT);
Nato onemogočite vse prekinitve:
noInterrupts ();
Nato se časovnik1 inicializira.
TCCR1A = 0; TCCR1B = 0;
Nastavljena je vrednost časovnika prednaložnika (sprva 3035).
TCNT1 = vrednost;
Nato je v registru TCCR1B nastavljena vrednost 1024
TCCR1B - = (1 << CS10) - (1 << CS12);
Prekinitev prelivanja časovnika je omogočena v registru maske prekinitve časovnika, tako da je mogoče uporabiti ISR.
TIMSK1 - = (1 << TOIE1);
Končno so omogočene vse prekinitve.
prekinitve ();
Zdaj napišite ISR za Timer Overflow Interrupt, ki je odgovoren za vklop in izklop LED s pomočjo digitalWrite . Stanje se spremeni vsakič, ko pride do prekinitve prelivanja časovnika.
ISR (TIMER1_OVF_vect) { TCNT1 = vrednost; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
V void loop () se vrednost prednaloževalnika poveča ali zmanjša z uporabo vhodov s potisnimi gumbi, vrednost pa se prikaže tudi na LCD zaslonu 16x2.
if (digitalRead (2) == HIGH) { vrednost = vrednost + 10; // Vrednost prednalaganja vložka } if (digitalRead (4) == HIGH) { value = value-10; // Zmanjšaj vrednost prednalaganja } lcd.setCursor (0,0); lcd.print (vrednost); }
Tako lahko s časovnikom uporabimo zakasnitev programa Arduino. Oglejte si spodnji video, kjer smo s pritiskom na gumbe pokazali spremembo zakasnitve tako, da smo povečali in zmanjšali vrednost prednaložnika.