Turinys:

AVR mikrovaldiklis. Šviesos diodai mirksi naudojant laikmatį. Laikmačiai pertraukia. Laikmačio CTC režimas: 6 žingsniai
AVR mikrovaldiklis. Šviesos diodai mirksi naudojant laikmatį. Laikmačiai pertraukia. Laikmačio CTC režimas: 6 žingsniai

Video: AVR mikrovaldiklis. Šviesos diodai mirksi naudojant laikmatį. Laikmačiai pertraukia. Laikmačio CTC režimas: 6 žingsniai

Video: AVR mikrovaldiklis. Šviesos diodai mirksi naudojant laikmatį. Laikmačiai pertraukia. Laikmačio CTC režimas: 6 žingsniai
Video: LDmicro 18: Ublox NEO-6M GPS Alarm Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Liepa
Anonim
Image
Image

Sveiki visi!

Laikmačiai yra svarbi sąvoka elektronikos srityje. Kiekvienas elektroninis komponentas veikia pagal laiką. Ši laiko bazė padeda sinchronizuoti visus darbus. Visi mikrovaldikliai veikia tam tikru iš anksto nustatytu laikrodžio dažniu, jie visi turi galimybę nustatyti laikmačius. AVR gali pasigirti laikmačiu, kuris yra labai tikslus, tikslus ir patikimas. Jame yra daugybė funkcijų, todėl tai yra plati tema. Geriausia tai, kad laikmatis yra visiškai nepriklausomas nuo procesoriaus. Taigi, jis veikia lygiagrečiai procesoriui ir nėra CPU įsikišimo, todėl laikmatis yra gana tikslus. Šiame skyriuje paaiškinu pagrindines AVR laikmačių sąvokas. Aš rašau paprastą programą C kodu, kad valdyčiau LED blykstę, naudodamas laikmačius.

1 žingsnis: aprašymas

1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m
1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m

„ATMega328“yra trijų tipų laikmačiai:

Laikmatis/skaitiklis0 (TC0) - yra bendrosios paskirties 8 bitų laikmačio/skaitiklio modulis, turintis du nepriklausomus „OutputCompare“įrenginius ir PWM palaikymą;

Laikmatis/skaitiklis1 (TC1) - 16 bitų laikmatis/skaitiklis leidžia tiksliai atlikti programos vykdymą (įvykių valdymą), bangų generavimą ir signalo laiko matavimą;

Laikmatis/skaitiklis2 (TC2) -tai bendrosios paskirties kanalas, 8 bitų laikmačio/skaitiklio modulis su PWM ir asinchroniniu valdymu;

2 veiksmas: 1 problemos teiginys: pirmiausia mirksi LED (žalia) kas 50 ms

1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m
1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m
1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m
1 problemos teiginys: pirmą kartą užsidega šviesos diodas (žalias) kas 50 m

Metodika:

- naudojant „Timer0“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant pertraukimą kiekvieną kartą, kai Timer0 perpildo;

Laikmatis0 (8 bitai) po to skaičiuojamas nuo 0 iki 255, jie perpildomi, ši vertė keičiasi kiekvienu laikrodžio impulsu.

F_CPU = 16MHz: Laikrodžio laikotarpis = 1000ms / 16000000Hz = 0.0000625ms

Laikmačio skaičius = (būtinas atidėjimas / laikrodžio laiko periodas) -1 = (50 ms / 0,0000625 ms) = 799999

Laikrodis jau tiksėjo 799999 kartus, kad vėluotų tik 50 ms!

Norėdami sumažinti laikmačio skaičių, galime naudoti dažnio padalijimo techniką, vadinamą prescaling. AVR siūlo šias iš anksto parinktas skalės reikšmes: 8, 64, 256 ir 1024. Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai.

Skaitiklio vertė visada turi būti sveikasis skaičius. Rinkimės prescaler 256!

Daugelyje mikrovaldiklių yra kažkas, kas vadinama pertraukimu. Šis pertraukimas gali būti paleistas, kai įvykdomos tam tikros sąlygos. Dabar, kai tik įjungiamas pertraukimas, AVR sustoja ir išsaugo pagrindinės rutinos vykdymą, pasirūpina pertraukimo skambučiu (vykdydamas specialią procedūrą, vadinamą pertraukimo paslaugų tvarka, ISR), ir kai tai atliekama, grįžta į pagrindinė rutina ir toliau ją vykdyti.

Kadangi reikalingas vėlavimas (50 ms) yra didesnis nei didžiausias galimas uždelsimas: 4, 096 ms = 1000 ms / 62500 Hz * 256, akivaizdu, kad laikmatis perpildys. Ir kai laikmatis perpildomas, nutraukiamas pertraukimas.

Kiek kartų pertrauka turi būti atleista?

50 ms / 4,096 ms = 3125/256 = 12,207 Jei laikmatis perskrido 12 kartų, praėjo 12 * 4,096 ms = 49,152 ms. 13 -oje iteracijoje mums reikia 50 ms delsos - 49,152 ms = 0,848 ms.

Esant 62500 Hz dažniui (prescaler = 256), kiekviena erkė užtrunka 0,016 ms. Taigi, norint pasiekti 0,848 ms vėlavimą, reikės 0,848 ms / 0,016 ms = 53 erkių. Taigi, 13 -oje iteracijoje leidžiame tik laikmačiui suskaičiuoti iki 53, o tada jį iš naujo nustatyti.

Inicijuoti laikmatį0/skaitiklį (žr. Paveikslėlį):

TCCR0B | = (1 << CS02) // nustatyti laikmatį su prescaler = 256 TCNT0 = 0 // inicijuoti skaitiklį TIMSK0 | = (1 << TOIE0) // įgalinti perpildymo pertraukimą sei () // įgalinti visuotinius pertraukimus tot_overflow = 0 // inicijuoti perpildymo skaitiklio kintamąjį

3 veiksmas: 2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę

2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
2 problemos teiginys: mirksėkime antrą šviesos diodą (mėlynas) kas 1 sekundę
2 problemos teiginys: mirksėkime antrą šviesos diodą (mėlynas) kas 1 sekundę

Metodika:

- naudojant „Timer1“prescalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant „Clear Timer on Compare“(CTC) režimą;

- naudojant pertraukas su CTC režimu;

Laikmatis1 (16 bitų) jis skaičiuojamas nuo 0 iki 65534, po to jie perpildomi. Ši vertė keičiasi kiekvienu laikrodžio impulsu.

F_CPU = 16MHz: Laikrodžio trukmė = 1000ms / 16000000Hz = 0.0000625ms

Laikrodis jau tiksėjo 15999999 kartus, kad būtų atidėtas 1 s!

Norėdami sumažinti laikmačio skaičių, galime naudoti dažnio padalijimo techniką, vadinamą prescaling. AVR siūlo šias iš anksto parinktas skalės reikšmes: 8, 64, 256 ir 1024. Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai. Skaitiklio vertė visada turi būti sveikasis skaičius. Rinkimės prescaler 256!

„Clear timer on Compare“(CTC) režimu OCR1A arba ICR1 registras naudojamas manipuliuoti skaitiklio raiška. CTC režimu skaitiklis išvalomas iki nulio, kai skaitiklio vertė (TCNT1) atitinka OCR1A arba ICR1. OCR1A arba ICR1 apibrėžia didžiausią skaitiklio vertę, taigi ir jo skiriamąją gebą. Šis režimas leidžia geriau kontroliuoti rungtynių išvesties dažnį. Taip pat supaprastinamas išorinių įvykių skaičiavimas. Turime pasakyti AVR, kad iš naujo nustatytų laikmatį1/skaitiklį, kai tik jo vertė pasieks 62500 vertę, kad būtų pasiektas 1 s atidėjimas.

Inicijuoti laikmatį1/skaitiklį (žr. Paveikslėlį):

TCCR1B | = (1 << WGM12) | (1 << CS12) // nustatyti laikmatį su prescaler = 256 ir CTC režimu TCNT1 = 0 // inicijuoti skaitiklį TIMSK1 | = (1 << OCIE1A) // įgalinti palyginimo pertraukimą OCR1A = 62500 // inicijuoti palyginimo vertę

4 žingsnis: 3 problemos teiginys: mirksėkime trečiuoju šviesos diodu (raudonu) kas 16 ms

3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms
3 problemos teiginys: mirksi trečiasis šviesos diodas (raudonas) kas 16 ms

Metodika:

- naudojant „Timer2“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant „Clear Timer on Compare“(CTC) režimą;

- naudojant aparatūros CTC režimą be pertraukų;

Laikmatis2 (8 bitai) jis skaičiuojamas nuo 0 iki 255 po to, jie perpildomi. Ši vertė keičiasi kiekvienu laikrodžio impulsu.

F_CPU = 16MHz: Laikrodžio laikotarpis = 1000ms / 16000000Hz = 0.0000625ms

Laikmačio skaičius = (būtinas atidėjimas / laikrodžio laiko periodas) -1 = (16 ms / 0,0000625 ms) = 255999

Laikrodis jau tiksėjo 255999 kartus, kad vėluotų 16 ms!

Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai. Skaitiklio vertė visada turi būti sveikasis skaičius. Išsirinkime prescaler 1024!

CTC režimu skaitiklis išvalomas iki nulio, kai skaitiklio vertė (TCNT2) atitinka OCR2A arba ICR2. Smeigtukas PB3 taip pat yra TIMER2 - OC2A išvesties palyginimo kaištis (žr. Diagramą).

Laikmatis/Counter2 valdymo registras A - TCCR2A Bit 7: 6 - COM2A1: 0 - Palyginkite A palyginimo įrenginio išvesties režimą. Kadangi mums reikia perjungti šviesos diodą, pasirenkame parinktį: Perjungti OC2A į palyginimo rungtynes Kaskart lyginant, OC2A kaištis automatiškai perjungiamas. Nereikia tikrinti vėliavos bitų, nereikia rūpintis jokiais pertraukimais.

Inicijuokite laikmatį2/skaitiklį

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // nustatyti laikmačio OC2A kaištį perjungimo ir CTC režimu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // nustatyti laikmatį su prescaler = 1024 TCNT2 = 0 // inicijuoti skaitiklį OCR2A = 250 // inicijuoti palyginimo vertę

5 veiksmas: programos kodo rašymas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį

Programos rašymo kodas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį
Programos rašymo kodas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį
Programos rašymo kodas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį
Programos rašymo kodas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį

AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą - „Atmel Studio“.

F_CPU nustato laikrodžio dažnį hercais ir yra įprastas programose, kuriose naudojama avr-libc biblioteka. Šiuo atveju jį naudoja vėlavimo tvarka, kad nustatytų, kaip apskaičiuoti vėlavimą.

#ifndef F_CPU

#define F_CPU 16000000UL // nurodo valdiklio kristalų dažnį (16 MHz AVR ATMega328P) #endif

#include // antraštė, kad būtų galima valdyti srautų duomenų srautus. Apibrėžia kaiščius, prievadus ir kt.

Pirmasis įtraukimo failas yra avr-libc dalis ir bus naudojamas beveik bet kuriame AVR projekte, prie kurio dirbate. „io.h“nustatys jūsų naudojamą procesorių (todėl kompiliavimo metu nurodote dalį) ir savo ruožtu įtraukia atitinkamą naudojamo lusto IO apibrėžimo antraštę. Tai tiesiog apibrėžia visų jūsų kaiščių, prievadų, specialių registrų ir kt.

#include // antraštė, leidžianti pertraukti

nepastovus uint8_t tot_overflow; // pasaulinis kintamasis, kad būtų galima skaičiuoti perpildymų skaičių

Problemos aprašymo metodika: pirmiausia mirksi (žalia) šviesos diodas kas 50 ms

- naudojant „Timer0“prescalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant pertraukimą kiekvieną kartą, kai Timer0 perpildo;

void timer0_init () // inicijuoti laikmatį0, pertraukti ir kintamas

{TCCR0B | = (1 << CS02); // nustatyti laikmatį su prescaler = 256 TCNT0 = 0; // inicijuoti skaitiklį TIMSK0 | = (1 << TOIE0); // įgalinti perpildymą nterrupt sei (); // įgalinti visuotinius pertraukimus tot_overflow = 0; // inicijuoti perpildymo skaitiklio kintamąjį}

Problemos konstatavimo metodika: blykstė Antrasis šviesos diodas (mėlynas) kas 1 sekundė

- naudojant „Timer1“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant „Clear Timer on Compare“(CTC) režimą;

- naudojant pertraukas su CTC režimu;

void timer1_init () // inicijuoti laikmatį1, pertraukimas ir kintamasis {TCCR1B | = (1 << WGM12) | (1 << CS12); // nustatyti laikmatį su prescaler = 256 ir CTC režimu TCNT1 = 0; // inicijuoti skaitiklį OCR1A = 62500; // inicijuoti palyginimo vertę TIMSK1 | = (1 << OCIE1A); // įgalinti palyginimo pertraukimą}

Problemos aprašymo metodika: blykstė trečias šviesos diodas (raudonas) kas 16 ms

- naudojant „Timer2“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;

- naudojant „Clear Timer on Compare“(CTC) režimą;

- naudojant aparatūros CTC režimą be pertraukų;

void timer2_init () // inicijuoti laikmatį2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // nustatyti laikmačio OC2A kaištį perjungimo režimu ir CTC režimu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // nustatyti laikmatį su prescaler = 1024 TCNT2 = 0; // inicijuoti skaitiklį OCR2A = 250; // inicijuoti palyginimo vertę}

TIMER0 perpildymo pertraukimo paslaugų teikimo tvarka iškviečiama kaskart, kai TCNT0 perpildo:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // sekti perpildymų skaičių}

Šis ISR suaktyvinamas kiekvieną kartą, kai įvyksta rungtynės, todėl perjungimo piktograma patenka čia:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // čia perjungti

int main (niekinis)

{DDRB | = (1 << 0); // prijungti 1 (žalia) vedė prie kaiščio PB0 DDRC | = (1 << 1); // prijungti 2 (mėlyna) vedė prie kaiščio PC1 DDRB | = (1 << 3); // prijungti 3 (raudona) vedė prie kaiščio PB3 (OC2A) timer0_init (); // inicijuoti laikmatį0 timer1_init (); // inicijuoti laikmatį1 timer2_init (); // inicijuoti laikmatį2 while (1) // ciklą visam laikui {

Jei laikmatis0 perskrido 12 kartų, būtų praėję 12 * 4,096 ms = 49,152 ms. 13 -oje iteracijoje mums reikia 50 ms delsos - 49,152 ms = 0,848 ms. Taigi, 13 -oje iteracijoje leidžiame tik laikmačiui suskaičiuoti iki 53, o tada jį iš naujo nustatyti.

if (tot_overflow> = 12) // patikrinkite, ar ne. iš perpildymų = 12 PASTABA: naudojama „> =“

{if (TCNT0> = 53) // patikrinkite, ar laikmačių skaičius pasiekia 53 {PORTB ^= (1 << 0); // perjungia vedamą TCNT0 = 0; // atstatyti skaitiklį tot_overflow = 0; // iš naujo nustatyti perpildymo skaitiklį}}}}

HEX failo įkėlimas į mikrovaldiklio „flash“atmintį:

įveskite komandą DOS eilutės lange:

avrdude –c [programuotojo vardas] –p m328p –u –U „flash“: w: [jūsų šešiakampio failo pavadinimas] Mano atveju tai yra: avrdude –c ISPProgv1 –p m328p –u –U „flash“: w: Timers.hex

Ši komanda įrašo hex failą į mikrovaldiklio atmintį. Žiūrėkite vaizdo įrašą su išsamiu mikrovaldiklio „flash“atminties įrašymo aprašymu:

Įrašoma mikrovaldiklio „flash“atmintis…

Gerai! Dabar mikrovaldiklis veikia pagal mūsų programos instrukcijas. Patikrinkime!

6 žingsnis: sukurkite elektros grandinę

Elektros grandinės sukūrimas
Elektros grandinės sukūrimas
Elektros grandinės sukūrimas
Elektros grandinės sukūrimas
Elektros grandinės sukūrimas
Elektros grandinės sukūrimas

Prijunkite komponentus pagal schemą.

Rekomenduojamas: