Timer pe indicatori ATMEGA8 și LED. Programarea microcontrolerelor AVR Timer pe microcontroler ATMEGA8 cu afișaj LCD

Lecția 10.

Timeri contoare. Întrerupe

Astăzi aflăm ce contoare de cronometre în microcontrolere și ceea ce au nevoie și ce este Întrerupe Și de ce sunt, de asemenea, necesare.

Contoare de cronometre - Acestea sunt astfel de dispozitive sau module într-un microcontroler, care, după cum se vede din nume, ia în considerare în mod constant ceva. Ei consideră fie la o anumită valoare, fie la o asemenea amploare ca și cum ar fi. Acestea sunt considerate a fi constant la o viteză, cu viteza frecvenței ceasului microcontrolerului, corectată pe divizorii de frecvență, pe care o vom configura în anumite registre.

Și aceste contoare de cronometre sunt considerate constant dacă le inițializăm.

Cronometre în Mk. ATMEGA8. Trei.

Doi dintre ei sunt oCTME. Cronometrele, adică cele care pot maximiza doar până la 255. Această valoare nu va fi suficientă pentru noi. Chiar dacă aplicăm divizorul de frecvență maximă, nu numărăm al doilea, nici măcar nu putem număra jumătate awend. Și avem o astfel de sarcină să luăm până la o secundă pentru a controla contul de creștere al indicatorului LED. Puteți, desigur, să aplicați încă o extindere la o variabilă la o anumită sumă, dar aș dori să conturi pe deplin hardware.

Dar există un alt cronometru - este un deplin 16-bit.temporizator. El nu este numai 16-bit.Dar există încă anumite farmece în el, care nu sunt din alte cronometre. Cu aceste opțiuni, vom cunoaște mai târziu.

Aici este acest cronometru pe 16 biți, vom studia și vom folosi astăzi. De asemenea, după ce vă familiarizați cu acest cronometru, nu vă veți costa singur să explorați lucrarea celorlalte două, deoarece acestea sunt mult mai ușoare. Dar, totuși, se vor lua în considerare, de asemenea, cronometrele pe 8 biți, deoarece pentru a obține sarcini mai complexe, un cronometru nu va fi de ajuns.

Acum pe scurt despre întreruperi.

Întrerupe (Întrerupe.) Acestea sunt mecanismele care întrerupe codul în funcție de anumite condiții sau un anumit mediu care va dicta unele dispozitive, module și anvelope care sunt în microcontroler.

În controlerul nostru ATMEGA8 există 19 tipuri de întreruperi. Aici sunt toate în tabel în documentația tehnică pentru controler

Ce tip poate fi condițiile? În cazul nostru, de exemplu, a luat un cronometru la o anumită sumă sau, de exemplu, octetul și alte condiții au venit la un autobuz.

În momentul în care vom procesa întreruperea în tabelul plasat peste 7 poziții - Timer1 compa.Numit la 0x006.

Acum, să ne uităm la cronometrul nostru pe 16 biți sau Timer1..

Iată schema sa structurală

Vedem să înregistrez acolo Tcntn.În cazul în care numărul se schimbă în mod constant, adică este în continuă creștere. Aproape acesta este contorul. Adică, acest registru stochează numărul la care a numărat și cronometrul.

Și în registre Ocrna. și OCNNB. (Scrisori n este un număr de cronometru, în cazul nostru va fi 1) - acestea sunt registrele în care intrăm numărul cu care Chilo va fi comparat în Registrul TCNTN.

De exemplu, am enumerat un număr în Registrul OCNNA și, de îndată ce acest număr a coincis cu valoarea în registrul de cont, întreruperea va apărea și vom putea procesa acest lucru. Timerii cu întreruperi sunt foarte asemănătoare cu întârzierea obișnuită din cod, numai atunci când suntem într-o întârziere, atunci în acest moment nu putem efectua niciun cod (bine, "noi", de fapt, alu). Și când cronometrul crede, întregul cod al programului nostru este efectuat calm în acest moment. Așa că câștigăm colosal, fără a permite să mai ușureze resurse uriașe ale controlorului într-o a doua sau chiar o jumătate de secundă. În acest moment, putem gestiona presa de butoane pe care le putem procesa și în cronometru și mult mai mult.

Există, de asemenea, un registru TCCR. Acest registru este un registru de registru. Există biți definiți care sunt responsabili pentru configurația temporizatorului.

De asemenea, cronometrul are mai multe moduri pe care le vom întâlni și o mică întrebare.

Se compune din două jumătăți, deoarece avem un confrlanz de 8 biți și nu pot fi registre pe 16 biți. Prin urmare, într-o jumătate din registru (și fizic într-un registru), partea mai veche a registrului este stocată, iar în cealaltă - cea mai tânără. De asemenea, puteți să-i numiți o pereche de registru formată din două registre separate TCCR1A și TCCR1B. Numărul 1 înseamnă că registrul aparține cronometrului 1.

Registrul TCCR este responsabil pentru instalarea unui divizor, astfel încât cronometrul să nu contabilizeze atât de repede, el răspunde, de asemenea, (sau mai degrabă anumiți biți) pentru instalarea unui mod specific.

Bitii WGM sunt responsabili pentru setarea modului

Vedem aici o mulțime de varietăți de moduri.

Normal - Acesta este un mod normal, cronometrul consideră la sfârșit.

PWM. - aceasta este Shim. Numai varietăți diferite, adică cronometrul poate juca un rol pulse modulator.. Vom familiariza cu această tehnologie în clasele ulterioare.

CTC. - Aceasta este o coincidență resetată, doar că avem nevoie. Aici sunt comparate registrele TCNT și OCR. Două astfel de moduri, avem nevoie de prima, a doua lucrează cu un alt registru.

Toate soiurile de regimuri nu vom studia în această lecție. Când avem nevoie de aceste moduri, atunci o vom da seama.

Ei bine, să nu vă întoarcem mâine și să încercați în cele din urmă ceva în unele registre pentru a pune.

Codul, ca întotdeauna, a fost creat din proiectul trecut. Pentru Proteus, codul a fost copiat și redenumit din ocupația trecută, calea către noul firmware a fost, de asemenea, specificată în proprietățile controlerului. Proiecte pe care le numim Test07..

Să încercăm să comprimă codul și să-l rulați în Proteus. Dacă totul funcționează bine, începeți să adăugați un nou cod.

Vom adăuga o altă funcție, beneficiul adăugării funcțiilor pe care le-am învățat în trecut. Codul funcției va fi plasat după funcția Segchar și la funcția principală. După datorită faptului că vom numi în interiorul noii noastre caracteristici, funcția Segchar.

Mai mult decât atât, nu vom crea nici o funcție, ci mai mult. Într-o singură funcție, vom plasa tot codul de inițializare al cronometrului nostru, iar cealaltă funcție va fi un manipulator de întrerupere de la cronometru și nu sunt specifice acestor funcții. Când devine necesar, ei se vor determina în funcție de anumite condiții care au fost stipulate mai sus.

Deci prima funcție pe care am sunat-o timer_ini.

//———————————————

nulă.timer_ini.( nulă.)

{

}

//———————————————

De asemenea, să folosim funcțiile noastre, precum și câteva blocuri complete cu anunțuri de variabile globale, ne vom separa unul de celălalt cu prototipuri de funcții, care, datorită prezenței a două straturi înainte, compilatorul nu va procesa și nu va lua la comentarii. Datorită acestor negocieri, vom vedea unde se termină o funcție și cealaltă începe.

Această funcție, după cum vedem că nu are argumente - fără intrare, nu returnat. Să numim această caracteristică imediat în funcția principală ()

nesemnatchar.butount \u003d 0,butoane \u003d 0;

timer_ini.();

Acum vom începe o deteriorare a codului.

Să începem cu registrul de control al temporizatorului, de exemplu, cu TCCR1B. Folosind operațiunea noastră preferată "sau", vom intra într-un anumit pic din registru

nulă.timer_ini.( nulă.)

Tccr1b.|= (1<< WGM12.);

Din comentariu, vedem că lucrăm cu bătăliile modului și vom instala doar biții WGM12, restul va lăsa zerouri. Pe baza acestui lucru, am configurat acest mod:

De asemenea, cronometrul are încă un astfel de registru - TIMSK.. Acest registru este responsabil pentru măștile de întrerupere - Masca de întrerupere.. Acest registru este disponibil pentru toate cronometrele, nu numai pentru prima dată, este obișnuit. În acest registru, vom instala biți Ocie1a.care va porni tipul de întrerupere de care aveți nevoie Timer1 compa.

Tccr1b.|= (1<< WGM12.); // Instalați modul STS (resetați coincidența)

TIMSK.|= (1<< Ocie1a.);

Acum, să jucăm cu registrele de comparație în sine OCR1A (H și L). Căci acest lucru va trebui să numere puțin. Inregistreaza-te OCR1AH. Stochează partea mai veche a numărului de comparație și registrul OCR1AL. - mai tanar.

Dar înainte de a calcula, să observăm codul cu orice valori ale acestui registru și apoi vom corecta, deoarece vom inițializa separatorul și va participa, de asemenea, la calcularea timpului de cont necesar. Fără un divizor, cronometrul va dura prea repede.

TIMSK.|= (1<< Ocie1a.); // Instalați un pic de permisiune a întreruperii primei coincidență a OCR1A (H și L)

OCR1AH.= 0B10000000;

OCR1AL.= 0B00000000;

Tccr1b.|= ( ); // Instalați divizorul.

Până acum, nici un divizor nu este stabilit, deoarece încă nu ne-am gândit. Să o facem.

În timp ce avem în registru OCR1A. Există un număr 0B1000000000000000, care corespunde numărului zecimal 32768.

Microcontrolerul funcționează așa cum am convenit la 80.000.000 Hz.

Împărțăm 8000000 până la 32768, primim aproximativ 244.14. Aici, cu o astfel de frecvență în Hertz și cronometrul nostru va funcționa dacă nu aplicăm un divizor. Adică numerele noastre se vor schimba de 244 de ori pe secundă, așa că nici nu le vom vedea. Prin urmare, se va aplica divizorul de frecvență temporizator. Alegem un divizor la 256. Se va potrivi doar cu noi și chiar până la 1 Hz, adunăm apoi numărul de comparații.

Iată câteva divizoare pentru 1 cronometru

Am alocat un divizor în masă. Vedem că trebuie să instalăm numai biți CS12..

Deoarece divizorul de frecvență este de 256, atunci vom împărtăși 80.000.000 pe acest divider, se va dovedi a fi 31250, acesta este ceea ce trebuie să punem numărul în TCNT. Pentru un astfel de număr, cronometrul nostru va lua în considerare numărul de o secundă. Numărul 31250 este în reprezentarea binară 0B0111101000010010. Să aducem acest număr la perechea de registru și să aplicăm și un divizor

OCR1AH.= 0b. 01111010 ; // Scrieți un număr în registru pentru comparație

OCR1AL.= 0b. 00010010 ;

Tccr1b.|= (1<< CS12. ); // Instalați divizorul.

Cu această funcție, totul.

Acum, următoarea funcție este manipulatorul de întrerupere din coincidență. Ea este scrisă așa

ISR.( Timer1_compa_vect.)

{

}

Și corpul acestei caracteristici va fi realizat în competența numărului de numere.

Avem nevoie de o variabilă. Vom declara la nivel global, la începutul dosarului

#Include.

//———————————————

nesemnatchar.i.;

//———————————————

În consecință, din codul din funcția principală (), vom elimina aceeași variabilă

int.principal.( nulă.)

nesemnatchar.i.;

De asemenea, plângem tot codul într-un ciclu infinit. Rolul său acum vom efectua un cronometru și, cred că va face față cu ea nu este mai rău, dar chiar mai bine, "nimeni" nu interferează cu asta.

in timp ce(1)

{

// pentru (i \u003d 0; i<10;i++)

// {

// în timp ce (butstate \u003d\u003d 0)

// {

// dacă (! (PINB & 0B00000001))

// {

// dacă (butount< 5)

// {

// butount ++;

// }

// altfel.

// {

// i \u003d 0;

// butstate \u003d 1;

// }

// }

// altfel.

// {

// dacă (butount\u003e 0)

// {

// butount-;

// }

// altfel.

// {

// butstate \u003d 1;

// }

// }

// }

// segchar (i);

// _delay_ms (500);

// butstate \u003d 0;

// }

Acum, de fapt, corpul funcției de manipulare. Aici vom numi funcția segchar. Apoi vom crește pe o variabilă i.. Și astfel încât să nu depășească numărul unic, îl vom reseta în această condiție

ISR.( Timer1_compa_vect.)

dacă.( i.>9) i.=0;

Segchar.( i.);

I.++;

Acum voi corecta un mic cod la începutul funcției principale (). Port D.Ceea ce este responsabil pentru starea segmentelor, vom lua unul, astfel încât atunci când porniți, indicatorul nu strălucește, așa cum este cu un anod comun. Apoi aducem un număr 0 la o variabilă globală, doar pentru comandă. În general, de regulă, atunci când începeți în variabile nespecificate și astfel întotdeauna zerouri. Dar încă o inițializăm. Și, cel mai important, întreruperea din cronometrul a funcționat, nu este suficient să o includeți în inițializarea cronometrului. De asemenea, în general, întreruperile globale trebuie rezolvate pentru toate întreruperile. Pentru aceasta există o caracteristică specială sEI () - Setați întreruperea.

Acum codul va fi acesta

DDRB.= 0x00;

Portd.= 0b. 11111111 ;

Portb.= 0B00000001;

i.=0;

sei.();

in timp ce(1)

De asemenea, trebuie să conectăm fișierul bibliotecii de întrerupere la începutul fișierului

#Include.

#Include.

#Include.

De asemenea, variabilele pentru buton nu ar trebui să fie necesare pentru noi, deoarece nu vom lucra astăzi cu butonul. Să le angajeze

int.principal.( nulă.)

// caractere nesemnate \u003d 0, butonate \u003d 0;

timer_ini.();

Ne colectăm codul și verificăm mai întâi performanța sa în Proteus. Dacă totul funcționează bine, verificați și într-o schemă de trai

Totul funcționează pentru noi. Excelent!

Aici este un astfel de cronometru. Dar din moment ce nu avem nici măcar un rezonator de cuarț, atunci acest cronometru nu poate fi numit corect.

Cu toate acestea, astăzi am învățat foarte mult cu tine. Am aflat despre întreruperi, au învățat, de asemenea, să le proceseze, au învățat să lucreze cu cronometrele, să configureze mai mulți registre noi de microcontroler, înainte de a lucra doar cu registrele portuare. De asemenea, în detrimentul tuturor acestor lucruri, am descărcat semnificativ dispozitivul aritmetic-logic al microcontrolerului nostru.

Urmăriți tutorialul video

Post Vizualizări: 17 258

Timerul este proiectat să pornească sarcina la un moment dat și la altul, adică Munca de lucru la anumite cadre de timp.

Designul ceasului PCF8583 în timp real este aplicat într-un pachet cu o baterie de urmărire de rezervă pentru orele de lucru în absența puterii. Ca creier al dispozitivului, se aplică un microcontroler ATMEGA8 cu un tact de 16MHz.
Dispozitivul a fost planificat de la încărcarea telefonului - de aceea nu există stabilizator 5V în sistem - există o sursă de alimentare cu energie electrică 5V și 220V pentru BP.
Încărcarea este comutată la releu - cu tipul specificat în diagrama la 10A.
Există 3 LED-uri în diagramă:
Opțiuni. - Se aprinde când intri în setările ceasului.
Timp. - clipește când funcționează cronometrul - nu arde când cronometrul este dezactivat.
Out. - Afișează starea releului sau dezactivată.
Butoane:
SW1. - Buton. H..
SW2. - Buton. M..
Setări:
Setarea orelor.
Pentru a personaliza ceasul, trebuie să țineți apăsat butonul SW1. Înainte de LED-ul de plajă Opțiuni..
Punctul se aprinde și nu clipește - butonul SW1. Ceasul sunt instalate și butonul SW2. Minute.


Pentru a ieși din setările, trebuie, de asemenea, să țineți apăsat butonul. SW1. până când LED-ul iese Opțiuni..
Setarea cronometrului.
Pentru a configura cronometrul de care aveți nevoie în modul de afișare (modul Duty - Basic) set SW1. - pornirea încărcăturii, SW2. - Timpul pentru a opri încărcătura. După apelarea temporizatorului, acesta va intra în modul de afișare a timpului dacă butoanele nu sunt apăsate în decurs de 2-3 secunde.


Dezactivarea temporizatorului.
Pentru a dezactiva cronometrul, trebuie să țineți apăsat butonul SW2. - Dispozitivul va porni sarcina și temporizatorul nu va opri.
Sistem.


În diagramă este aplicată un conector ISP standard:
1 - VCC.
2 - Mosi.
3 - miso.
4 - SCK.
5 - Resetați.
6 - GDN.

Plăci de circuite imprimate.



În placa de circuite imprimate, se aplică un indicator cu un anod comun E40361 - dar este posibil ca altor, cu o pinout și dimensiuni similare.

Unele modele 3D.




O schemă simplă a unui cronometru bun pe ATMEGA8 MK, navigare convenabilă în meniu, ecran LCD LCD, ceas în timp real, piese minime.

Lucru foarte util, de exemplu, pentru sere, este posibilă organizarea de udare sau circulație în hidroponică, puteți ajusta alimentatoarele și băutorii pentru animale, păsări și multe altele pentru ceea ce.


Inima acestui cronometru este un microcontroler de microcontroler foarte popular și nu mai scump.

Desigur, pentru firmware, vom avea nevoie de un programator, dar dacă nu este necesar, puteți face doar 4 cabluri conectate la portul LPT conform acestei scheme.

De ce avem nevoie:

Schema temporizatorului

Așa cum se poate vedea pe el, nu există nici un circuit de putere și un dispozitiv de acționare, acest lucru se datorează faptului că ați putea decide să utilizați un BP stabilizat la distanță și, de asemenea, nu este cunoscut ce încărcătură să vă conectați, astfel încât toată lumea să aleagă dispozitivul de acționare sub cerințele sale tehnice .

Alternativ, servomotorul pe triaje, tiristori și simistori este prezentat mai jos.



Opțiunea de la aspectul Sprint.

O atenție deosebită trebuie plătită la instalarea cipului elementului de ceas și cuarț. Lungimea pieselor dintre ele ar trebui să fie minimă și este mai bine să utilizați micro cuarț de la ceasuri de mână și să-l lipite direct la picioarele MS de ceas. Toate spațiul liber lângă ceas este umplut cu cupru pe corp. Bateria este necesară pentru a menține orele în starea de lucru în timp ce deconectează de la rețea. Dacă din anumite motive nu ați instalat această baterie, apoi puneți firul Plus pe corp, altfel ceasul pur și simplu nu va merge.

Microcontrolerul este cusut de un programator sau folosind 5 fire simple.

Autorul firmware-ului (Descărcare - Multitimer) a încercat și nu a schimbat FUB-urile, ceea ce face mult mai ușor, fără probleme, firmware pentru un radio de novice amator. Dacă MK nu a fost încă folosit, unul nou din magazin, atunci pur și simplu turnați firmware-ul și totul, dar dacă există deja schimbări în siguranțe, atunci trebuie să le stabiliți ca cksel \u003d 0001. Orice altceva este simplu și nu are nevoie de o explicație.

Pentru carcasa este foarte convenabil să se utilizeze dozatoarele din plastic, ele sunt de diferite dimensiuni și forme.

În tăierea cuțitului de tăiere, cu ajutorul unei arme dintr-o armă, fixați ecranul LCD., Tăiați găurile sub butoanele de comandă și butonul de alimentare.

Punem toate nodurile din interiorul carcasei, verificând în mod constant modul în care capacul este închis, dacă este necesar, purtăm sau măturăm interferarea.

Pe schema colectată, oferim mese, ar trebui să apară o astfel de imagine.

Controlul este realizat de patru butoane. Meniul este alcătuit din trei elemente, instalarea ceasului ceasului, slot-slot toate seturile de cronometre, cronometru - Instalare de cronometre.

Vino mai întâi în (*) în meniul ceasului și expoziției (\u003e) (<)(#) точное время.


Sugestie peste butoanele de control la linia de jos a afișajului, fiecare meniu este diferit, deci nu este necesar să descrieți butoanele.

Acum, totul este gata să seteze corect poziția temporizatorului, după apăsarea grilajului, programul este înregistrat în memoria permanentă a MK.

Timerul de numărătoare inversă vă va ajuta să măsurați cu precizie intervalul de timp cuprins între 1 și 24 de ore.

Astăzi, nimeni nu va surprinde designul temporizatorului, pentru că În vânzare și pe Internet aceste dispozitive pe care le doriți. Și toate cronometrele par să pară unii pe alții. Și când începeți să luați în considerare funcțiile schemei, veți găsi orice neplăcere pentru dvs.

Aici, din aceste considerente, am făcut un program de cronometru care îndeplinește următorii parametri:
- design compact și circuite simple;
- butonul de utilizare operațională;
- când gestionați butoanele, duplicarea acțiunilor pe ecranul LCD;
- timpul de sarcină de până la o secundă;
- numărătoarea inversă de la 1 secundă la 24 de ore;
- funcția de pornire, pauză;
- funcția de resetare a referințelor și valorile expuse de timp;
- când valoarea este atinsă 00.00.00, servomotorul este pornit;

Toate sarcinile stabilite au fost implementate în acest proiect.

Timerul de numărătoare inversă vă va ajuta să măsurați cu precizie intervalul de timp cuprins între 1 și 24 de ore.

Astăzi, nimeni nu va surprinde designul temporizatorului, pentru că În vânzare și pe Internet aceste dispozitive pe care le doriți. Și toate cronometrele par să pară unii pe alții. Și când începeți să luați în considerare funcțiile schemei, veți găsi orice neplăcere pentru dvs.

Aici, din aceste considerente, am făcut un program de cronometru care îndeplinește următorii parametri:
- design compact și circuite simple;
- butonul de utilizare operațională;
- când gestionați butoanele, duplicarea acțiunilor pe ecranul LCD;
- timpul de sarcină de până la o secundă;
- numărătoarea inversă de la 1 secundă la 24 de ore;
- funcția de pornire, pauză;
- funcția de resetare a referințelor și valorile expuse de timp;
- când valoarea este atinsă 00.00.00, servomotorul este pornit;

Toate sarcinile stabilite au fost implementate în acest proiect.

Descrierea modurilor de operare temporizator

După pornirea cronometrului, puteți seta timpul de care avem nevoie. Scopul butoanelor este vizibil în diagramă. După instalare, apăsați butonul de pornire a butonului de pornire. Timp maxim de timp 23.59.59.

Corecția timpului de numărătoare inversă poate fi produsă în orice moment al cronometrului, după sursa de alimentare a circuitului.

De îndată ce timpul ajunge la 00.00.00, LED-ul se aprinde (în momentul imitare a incluziunii actuatorului sau pur și simplu poate fi o scârțâit cu generatorul).

Dacă faceți clic pe butonul Start-Pause când lucrați, cronometrul se oprește, dublu apăsând butonul de pornire-pauză duce la reluarea opririi.

Pentru a dezactiva sarcina după pornire, trebuie să apăsați Reset, datele cronometrului vor fi instalate 00.00.01 - Încărcarea se oprește. Sau setați o nouă perioadă de referință și dublu apăsând butonul de pornire-pauză.

Afișați pe caractere LCD< ! \u003e Înseamnă că sarcina este dezactivată (PD3) și timpul de pornire al timpului setat va începe să apăsați butonul Start.

Cuarț extern 8 MHz, pentru precizia contului.

Lista elementelor radio

Desemnare Un fel Nominal număr NotăScorCaietul meu
MK AVR pe 8 biți

ATMEGA8.

1 În notebook.
Regulator liniar

LM7805.

1 În notebook.
Diode rectificatoare

1N4148.

1 În notebook.
Condensator22 pf.2 În notebook.
Condensator0,1 mkf.1 În notebook.
100 μF.1 În notebook.
Condensator electrolitic470 μF.1 În notebook.
Rezistor.

470 Oh.

1 În notebook.
Rezistență puternică5 COM.1 În notebook.
Rezistor.

10 COM.

1 În notebook.
Resonator de cuarț8 MHz.1