Tajmer na ATmega8 i LED indikatorima. Programiranje AVR mikrokontrolera Tajmer na mikrokontroleru atmega8 s LCD zaslonom

Lekcija 10

Brojači vremena. Prekida

Danas ćemo saznati što je to mjerači vremena-brojači u mikrokontrolerima i čemu služe, kao i čemu služe prekidima a za ono što su i potrebni.

Brojači vremena- to su uređaji ili moduli u mikrokontroleru, koji, kao što naziv implicira, stalno nešto broje. Oni računaju ili do određene vrijednosti, ili do takve vrijednosti, koliko bitova imaju. Broje se stalno istom brzinom, brzinom takta frekvencije mikrokontrolera, korigiranom za djelitelje frekvencija, što ćemo konfigurirati u određenim registrima.

Ovi mjerači vremena se neprestano broje, ako ih inicijaliziramo.

Mjerači vremena u MK Atmega8 tri.

Dvije od njih su osmobitni mjerači vremena, odnosno oni koji mogu brojati samo do 255. Ova nam vrijednost neće biti dovoljna. Čak i ako primijenimo maksimalni razdjelnik frekvencija, tada nećemo računati ni sekundu, nećemo moći odbrojati ni pola sekunde. Naš je zadatak upravo takav da brojimo do 1 sekunde kako bismo kontrolirali povećanje broja LED indikatora. Naravno, možete primijeniti još jednu izgradnju varijable na određenu vrijednost, ali želio bih imati potpuno hardverski račun.

Ali postoji još jedan mjerač vremena - ovo je punopravni 16-bitni mjerač vremena. On nije samo 16-bitni, ali ima i određene čari koje drugi mjerači vremena nemaju. Kasnije ćemo se upoznati s tim opcijama.

Danas ćemo proučavati i koristiti ovaj 16-bitni mjerač vremena. Također, nakon što ste se upoznali s ovim mjeračem vremena, neće vas ništa koštati samostalno proučavanje rada druge dvojice, jer su mnogo jednostavniji. No, ipak ćemo u budućnosti razmatrati i 8-bitne mjerače vremena, jer nam jedan mjerač vremena neće biti dovoljan za postizanje složenijih zadataka.

Sada, ukratko o prekidima.

Prekida (Prekida) Jesu li takvi mehanizmi koji prekidaju kôd ovisno o određenim uvjetima ili određenoj situaciji, što će diktirati neki uređaji, moduli i sabirnice smještene u mikrokontroleru.

U našem kontroleru Atmega8 postoji 19 vrsta prekida. Ovdje su svi u tablici u tehničkoj dokumentaciji za kontroler.

Kakvi uvjeti mogu postojati? U našem slučaju, na primjer, mjerač vremena je odbrojio do određene vrijednosti, ili su, na primjer, bajt i drugi uvjeti došli do neke sabirnice.

Trenutno ćemo obraditi prekid koji se nalazi u tablici koja se nalazi 7 pozicija više - TIMER1 COMPA nazvano na adresu 0x006.

Pogledajmo sada naš 16-bitni mjerač vremena, ili TIMER1.

Ovdje je njegov strukturni dijagram.

Tamo vidimo registar TCNTn, u kojem se broj stalno mijenja, odnosno stalno povećava. U praksi je ovo brojač. Odnosno, ovaj registar pohranjuje broj na koji je odbrojavanje računalo.

I u registre OCRnA i OCRnB(slova n su brojčanik vremena, u našem slučaju to će biti 1) - to su registri u koje unosimo broj s kojim će se broj u registru TCNTn usporediti.

Na primjer, unijeli smo neki broj u OCRnA registar i čim se taj broj poklopi s vrijednošću u registru odbrojavanja, dogodit će se prekid i to možemo riješiti. Odbrojavači s prekidima vrlo su slični uobičajenom kašnjenju u kodu, samo kad smo u kašnjenju, tada ne možemo izvršiti bilo koji kôd u ovom trenutku (dobro, opet, figurativno "mi", zapravo ALU). A kad se mjerač vremena odbroji, tada se sav kôd našeg programa u ovom trenutku tiho izvršava. Tako dobivamo ogromne dobitke, ne dopuštajući da ogromni resursi kontrolera miruju sekundu ili čak pola sekunde. U ovom trenutku možemo rukovati pritiscima na gumbe, koje također možemo kontrolirati u mjeraču vremena i još mnogo toga.

Tu je i TCCR registar. Ovaj registar je kontrolni registar. Tamo su konfigurirani određeni bitovi koji su odgovorni za konfiguraciju timera.

Također, mjerač vremena ima nekoliko načina rada, s kojima ćemo se također upoznati nešto kasnije.

Sastoji se od dvije polovice, budući da je naš kontroler 8-bitni i ne može imati 16-bitne registre. Stoga je u jednoj polovici registra (i fizički u jednom registru) pohranjen gornji dio registra, a u drugoj - donji dio. Možete ga nazvati i registarskim parom koji se sastoji od dva odvojena registra TCCR1A i TCCR1B. Znamenka 1 znači da registar pripada mjeraču vremena 1.

Ovaj registar TCCR odgovoran je za postavljanje razdjelnika tako da se mjerač vremena ne broji tako brzo, već je također odgovoran (ili bolje rečeno njegovi određeni bitovi) za postavljanje određenog načina rada.

WGM bitovi su odgovorni za postavljanje načina rada

Ovdje vidimo mnogo načina.

Normalan- ovo je uobičajeni način rada, odbrojavanje se računa do kraja.

PWM- Ovo PWM samo različite sorte, odnosno mjerač vremena može igrati ulogu modulator širine impulsa... Ovu ćemo tehnologiju upoznati u kasnijim lekcijama.

CTC- ovo je slučajni reset, upravo ono što nam treba. Tu se uspoređuju TCNT i OCR registri. Postoje dva takva načina, prvi nam treba, drugi radi s različitim registrom.

U ovoj lekciji nećemo proučavati sve vrste načina rada. Kad nam zatrebaju ti načini, onda ćemo to shvatiti.

Pa nemojmo se mučiti s dokumentacijom i napokon pokušati nešto staviti u neke registre.

Kôd je, kao i uvijek, generiran iz prethodnog projekta. Za proteus, kôd je također kopiran i preimenovan iz posljednje lekcije, a put do novog firmvera naveden je u svojstvima kontrolera. Nazvat ćemo projekte Test07.

Pokušajmo, kao i uvijek, sastaviti kôd i pokrenuti ga u proteusu. Ako sve radi dobro, tada počinjemo dodavati novi kôd.

Dodajmo još jednu funkciju jer smo u prošloj lekciji naučili dodavati funkcije. Kod funkcije stavit ćemo nakon funkcije segchar i prije glavne funkcije. Nakon toga, zbog činjenice da ćemo pozvati funkciju segchar unutar naše nove funkcije.

Štoviše, stvorit ćemo ne jednu funkciju, već dvije. U jednu funkciju stavit ćemo sav inicijalizacijski kôd za naš timer, a druga funkcija bit će rukovatelj prekida prekidača, a takve su funkcije specifične i ne moraju se pozivati. Kad se ukaže potreba, oni će se sami zvati, ovisno o određenim uvjetima koji su gore navedeni.

Stoga ćemo pozvati prvu funkciju timer_ini

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

poništititimer_ini( poništiti)

{

}

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

Također, odvojimo naše funkcije, kao i neke cjelovite blokove s deklaracijom globalnih varijabli, s prototipima funkcija, odvojit ćemo se jedan od drugog takvim linijama, koje zbog prisutnosti dviju kosih crta naprijed kompilator neće obraditi i odvest će ih na komentare. Zbog ovih praćenja vidjet ćemo gdje jedna funkcija završava, a druga počinje.

Ova funkcija, kao što vidimo, nema argumente - niti ulazne niti povratne. Odmah pozovimo ovu funkciju u funkciji main ().

nepotpisancharbutcount = 0,butstate = 0;

timer_ini();

Sada ćemo ovu funkciju početi ispunjavati kodom.

Počnimo s registrom za upravljanje timerom, na primjer TCCR1B. Koristeći našu omiljenu operaciju "ILI" stavit ćemo jednu u određeni dio registra

poništititimer_ini( poništiti)

TCCR1B|= (1<< WGM12);

Iz komentara vidimo da radimo s bitovima načina rada, a od njih ćemo postaviti samo bit WGM12, ostalo ćemo ostaviti kao nule. Na temelju toga konfigurirali smo sljedeći način rada:

Tajmer također ima takav registar - TIMSK... Ovaj registar je odgovoran za maske prekida - Prekini masku... Ovaj je registar dostupan za sve tajmere, ne samo za prvi, uobičajen je. U ovom registru ćemo postaviti bit OCIE1A, što će omogućiti vrstu prekida koji nam je potreban TIMER1 COMPA

TCCR1B|= (1<< WGM12); // postavljanje STS moda (resetirano slučajno)

TIMSK|= (1<< OCIE1A);

Sada se poigrajmo sa samim registrima za usporedbu. OCR1A (H i L)... Da biste to učinili, morate napraviti mali izračun. Registar OCR1AH sprema vodeći dio broja za usporedbu i registar OCR1AL- Najmlađi.

No prije brojanja, napišimo kôd sa bilo kojim vrijednostima ovog registra, a zatim ga ispravimo, jer ćemo dalje inicijalizirati djelitelj i također će sudjelovati u izračunavanju potrebnog vremena odbrojavanja. Bez razdjelnika odbrojavanje će se prebrzo odbrojavati.

TIMSK|= (1<< OCIE1A); // postavljanjem bita za omogućavanje prekida za prvi brojač slučajno s OCR1A (H i L)

OCR1AH= 0b10000000;

OCR1AL= 0b00000000;

TCCR1B|= ( ); // postavljanje djelitelja.

Do sada nismo postavili nijedan djelitelj, budući da ga još nismo izračunali. Pobrinimo se mi za ovo.

Dok imamo u registru OCR1A je broj 0b1000000000000000, koji odgovara decimalnom broju 32768.

Naš mikrokontroler radi, kako smo se dogovorili, na frekvenciji od 8.000.000 Hz.

Podijelimo 8.000.000 sa 32.768, dobivamo otprilike 244.14. S takvom frekvencijom u hercima naš će mjerač vremena raditi ako ne primijenimo razdjelnik. Odnosno, naši će se brojevi mijenjati 244 puta u sekundi, pa ih nećemo ni vidjeti. Stoga ćete morati primijeniti razdjelnik frekvencije timera. Odaberimo djelitelj za 256. Sasvim će nam odgovarati, a zatim ćemo točno na 1 Hz ispraviti usporedni broj.

Ovdje su djelitelji za 1 mjerač vremena

U tablici sam istaknuo djelitelj koji nam je potreban. Vidimo da samo trebamo postaviti bit CS12.

Budući da imamo djelitelj frekvencije 256, podijelit ćemo 8000000 ovim djeliteljem, dobivamo 31250, ovako moramo unijeti broj u TCNT. Do tog broja naš će se mjerač vremena odbrojavati do 1 sekunde. Broj 31250 je 0b0111101000010010 u binarnom prikazu. Taj broj stavljamo u registarski par, a primjenjujemo i djelitelj

OCR1AH= 0b 01111010 ; // upisujemo broj za usporedbu u registar

OCR1AL= 0b 00010010 ;

TCCR1B|= (1<< CS12 ); // postavljanje djelitelja.

To je to s ovom funkcijom.

Sljedeća funkcija je rukovatelj prekida prekidača koji se podudara. Napisano je ovako

ISR( TIMER1_COMPA_vect)

{

}

Tijelo ove funkcije izvršit će se samo po nastanku podudarnosti brojeva.

Trebat će nam varijabla. Proglasimo to globalno, na početku datoteke

#uključi

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

nepotpisanchari;

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

U skladu s tim, uklonit ćemo istu varijablu iz koda u funkciji main ().

intglavni( poništiti)

nepotpisanchari;

Također ćemo komentirati sav kôd u beskonačnoj petlji. Njegovu će ulogu sada obavljati mjerač vremena, i mislim da će se s tim nositi ništa gore, pa čak i bolje, bez ometanja "nikoga".

dok(1)

{

// za (i = 0; i<10;i++)

// {

// while (butstate == 0)

// {

// ako (! (PINB & 0b00000001))

// {

// if (butcount< 5)

// {

// butcount ++;

// }

// drugo

// {

// i = 0;

// butstate = 1;

// }

// }

// drugo

// {

// if (butcount> 0)

// {

// butcount—;

// }

// drugo

// {

// butstate = 1;

// }

// }

// }

// segchar (i);

// _odgoda_ms (500);

// butstate = 0;

// }

Sada, zapravo, tijelo funkcije rukovatelja. Ovdje ćemo pozvati funkciju segchar. Tada ćemo povećati za 1 varijablu i... A kako ne bi prešao jednoznamenkasti broj, pod ovim uvjetom ćemo ga poništiti

ISR( TIMER1_COMPA_vect)

ako( i>9) i=0;

segchar( i);

i++;

Sada popravimo kod na početku funkcije main (). Luka D, koji je odgovoran za stanje segmenata, bodovat ćemo ih tako da pri uključivanju indikator ne svijetli, budući da je sa zajedničkom anodom. Zatim stavljamo broj 0 u glob varijablu i ovdje, samo radi reda. Općenito, u pravilu pri pokretanju u neinicijaliziranim varijablama uvijek postoje nule. No, ipak ćemo ga inicijalizirati. I, što je najvažnije, da bi prekid timera funkcionirao, nije ga dovoljno uključiti u inicijalizaciju timera. Također, općenito, da bi svi prekidi radili, potrebno je omogućiti globalne prekide. Za to postoji posebna funkcija sei () - Postavite prekid.

Sada će kod biti ovakav

DDRB= 0x00;

PORTD= 0b 11111111 ;

PORTB= 0b00000001;

i=0;

sei();

dok(1)

Također moramo uključiti datoteku knjižnice prekida na početak datoteke.

#uključi

#uključi

#uključi

Također, za gumb nam još neće trebati varijable, jer s gumbom danas nećemo raditi. Komentirajmo ih

intglavni( poništiti)

// nepotpisani char butcount = 0, butstate = 0;

timer_ini();

Skupimo naš kôd i prvo provjerimo njegove performanse u proteusu. Ako sve radi dobro, provjerit ćemo i u strujnom krugu

Sve radi za nas. Izvrsno!

Evo takve štoperice. No budući da nemamo čak ni kvarcni rezonator, ovu se štopericu ne može nazvati točnom.

Ipak, danas smo ti i ja naučili mnogo. Učili smo o prekidima, naučili smo i kako se s njima nositi, naučili smo raditi s mjeračima vremena, konfigurirati nekoliko novih registara mikrokontrolera, prije toga smo radili samo s registrima portova. Također, zbog svega toga značajno smo istovarili aritmetičko-logički uređaj našeg mikrokontrolera.

Pogledajte VIDEO LEKCIJU

Pregledi postova: 17 258

Mjerač vremena je dizajniran za uključivanje tereta u jednom trenutku i isključivanje u drugom, tj. radno opterećenje u određenom vremenskom okviru.

Dizajn koristi sat u stvarnom vremenu PCF8583 zajedno s rezervnom baterijom za rad sata u odsutnosti napajanja. Kao mozak uređaja koristi se mikrokontroler Atmega8 sa taktom od 16 MHz.
Planirano je da se uređaj napaja punjenjem telefona - dakle, na dijagramu nema stabilizatora od 5 V - postoji 5 V priključak za napajanje i napajanje od 220 V za PSU.
Opterećenje se uključuje pomoću releja - s tipom navedenim na dijagramu do 10A.
Na dijagramu postoje 3 LED diode:
OPCIJE- svijetli kada uđete u postavke sata.
VRIJEME- treperi kad je mjerač vremena u isključenom stanju - isključen kada je mjerač vremena deaktiviran.
OUT- prikazuje stanje releja - uključeno ili isključeno.
Gumbi:
SW1- dugme H.
SW2- dugme M.
Postavke:
Postavka sata.
Da biste postavili sat, morate pritisnuti gumb SW1 prije nego LED zasvijetli OPCIJE.
Točka svijetli i ne treperi - pomoću gumba SW1 sat je podešen, a SW2 minuta.


Za izlaz iz postavki također morate držati gumb SW1 dok se LED lampica ne ugasi OPCIJE.
Podešavanje timera.
Da biste postavili mjerač vremena, trebate postaviti u načinu prikaza (stanje pripravnosti - glavni) pomoću gumba SW1- vrijeme uključivanja opterećenja, SW2- vrijeme učitavanja. Nakon biranja mjerača vremena, on će prijeći u sam način prikaza vremena ako se tipke ne pritisnu 2-3 sekunde.


Deaktiviranje mjerača vremena.
Da biste deaktivirali mjerač vremena, morate držati pritisnutu tipku SW2- uređaj će uključiti opterećenje, a mjerač vremena ga neće isključiti.
Shema.


Dijagram koristi nestandardni ISP konektor:
1 - VCC
2 - MOSI
3 - MISO
4 - SCK
5 - RESETIRANJE
6 - GDN.

Tiskane ploče.



Indikator sa zajedničkom anodom E40361 koristi se na tiskanoj ploči - ali moguć je još jedan sa sličnim pinoutom i dimenzijama.

Nekoliko 3D modela.




Jednostavan sklop dobrog mjerača vremena na MK atmega8, laka navigacija u izborniku, LCD zaslon s tekućim kristalima, sat u stvarnom vremenu, minimalni detalji.

Vrlo korisna stvar, na primjer, za staklenik, možete organizirati zalijevanje ili cirkulaciju u hidroponi, možete postaviti hranilice i pojilice za životinje, ptice i još mnogo toga.


Srce ovog mjerača vremena je vrlo popularan i više nije skup Atmega8 mikrokontroler.

Naravno, potreban nam je programer za firmver, ali ako ga nema, tada se možete snaći sa samo 4 žice spojene na LPT port prema ovoj shemi.

Ono što nam treba:

Krug mjerača vremena

Kao što vidite, na njemu nema strujnog kruga i izvršnog uređaja, to je zato što se možete odlučiti za uporabu daljinski stabilizirane jedinice za napajanje, a također nije poznato ni kakvo opterećenje namjeravate spojiti, pa svi moraju odabrati izvršni uređaj prema svojim tehničkim zahtjevima.

Kao varijanta pogona na trijacima, dolje su prikazani tiristori i trijaci.



Varijanta iz programa Sprint Layout.

Posebnu pozornost treba posvetiti prilikom ugradnje satnog mikro kruga i kvarcnog elementa. Duljina tragova između njih trebala bi biti minimalna, ali bolje je koristiti mikro kvarc iz ručnog sata i lemiti ga izravno na nožice sata MC. Sav slobodni prostor pored sata punimo bakrom na kućištu. Baterija je potrebna kako bi sat radio dok je isključen iz električne mreže. Ako iz nekog razloga niste instalirali ovu bateriju, stavite pozitivnu žicu na kućište, inače sat jednostavno neće raditi.

Mikrokontroler se bljeska programatorom ili pomoću jednostavnih 5 žica.

Autor firmvera (preuzimanje - multitimer) pokušao je i nije promijenio osigurače, što uvelike olakšava, bez problema, firmver za početnike radio amatere. Ako MK još nije korišten, novi iz trgovine, onda samo učitajte firmver i to je to, ali ako već postoje promjene u osiguračima, morate ih postaviti kao CKSEL = 0001. Ostalo je jednostavno i samo po sebi razumljivo.

Vrlo je prikladno koristiti plastične razvodne kutije za kućište, dolaze u različitim veličinama i oblicima.

U poklopcu izrezanom nožem, vrućim ljepilom iz pištolja, popravljamo LCD zaslon., Izrežite rupe za upravljačke gumbe i gumb za uključivanje.

Sve čvorove postavljamo unutar kućišta, stalno provjeravajući kako se poklopac zatvara, ako je potrebno, prenosimo ili savijamo one koji ometaju.

Opskrbljujemo napajanje sklopljenim krugom, takva bi se slika trebala pojaviti.

Upravljanje se vrši pomoću četiri gumba. Izbornik se sastoji od tri stavke, CLOSK - postavljanje sata, RESET - poništavanje svih postavljenih mjerača vremena, TIMER - postavljanje mjerača vremena.

Prvo idite (*) na izbornik sata i postavite (>) (<)(#) точное время.


Savjet na upravljačkim gumbima u donjem retku zaslona različit je u svakom izborniku, pa nema potrebe opisivati ​​gumbe.

Sada je sve spremno za ispravno postavljanje vremenskih položaja mjerača vremena, nakon pritiska na rešetku, program se zapisuje u trajnu memoriju MK.

Odbrojavač vam pomaže da točno izmjerite vremenski interval u rasponu od 1 sekunde do 24 sata.

Danas nikoga nećete iznenaditi dizajnom timera, tk. ima što više takvih uređaja u prodaji i na internetu. Čini se da su svi mjerači vremena međusobno slični. A kad počnete detaljnije razmatrati funkcije kruga, u njemu ćete pronaći bilo kakve neugodnosti.

Na temelju ovih razmatranja napravio sam program za mjerenje vremena koji zadovoljava sljedeće parametre:
- kompaktan dizajn i jednostavno kolo;
- operativno upravljanje tipkama;
- prilikom upravljanja tipkama, dupliciranja radnji na LCD -u;
- postavljanje točnog vremena na sekundu;
- raspon brojanja od 1 sekunde do 24 sata;
- pokretanje funkcije, pauza;
- funkcija poništavanja odbrojavanja i postavljenih vrijednosti vremena;
- po dosezanju vrijednosti 00.00.00 uključuje se izvršni uređaj;

Svi postavljeni zadaci provedeni su u ovom projektu.

Odbrojavač vam pomaže da točno izmjerite vremenski interval u rasponu od 1 sekunde do 24 sata.

Danas nikoga nećete iznenaditi dizajnom timera, tk. ima što više takvih uređaja u prodaji i na internetu. Čini se da su svi mjerači vremena međusobno slični. A kad počnete detaljnije razmatrati funkcije kruga, u njemu ćete pronaći bilo kakve neugodnosti.

Na temelju ovih razmatranja napravio sam program za mjerenje vremena koji zadovoljava sljedeće parametre:
- kompaktan dizajn i jednostavno kolo;
- operativno upravljanje tipkama;
- prilikom upravljanja tipkama, dupliciranja radnji na LCD -u;
- postavljanje točnog vremena na sekundu;
- raspon brojanja od 1 sekunde do 24 sata;
- pokretanje funkcije, pauza;
- funkcija poništavanja odbrojavanja i postavljenih vrijednosti vremena;
- po dosezanju vrijednosti 00.00.00 uključuje se izvršni uređaj;

Svi postavljeni zadaci provedeni su u ovom projektu.

Opis načina rada timera

Nakon uključivanja mjerača vremena možete postaviti vrijeme koje nam je potrebno. Svrha gumba može se vidjeti na dijagramu. Nakon instalacije pritisnite gumb START - odbrojavanje počinje. Maksimalno vrijeme izlaganja je 23,59,59.

Ispravka vremena odbrojavanja može se izvršiti u bilo kojem trenutku rada mjerača vremena, nakon što se napajanje uključi u krug.

Čim vrijeme dosegne 00.00.00, LED se uključuje (trenutno je to imitacija uključivanja izvršnog uređaja ili možete jednostavno zvučnim signalom poslati generator).

Ako se pritisne tipka start-PAUSE dok je mjerač vremena u tijeku, odbrojavanje će prestati odbrojavati, dvaput pritiskom na tipku START-pauza nastavit će se zaustavljeno odbrojavanje.

Da biste isključili opterećenje nakon uključivanja, morate pritisnuti RESET, podaci mjerača vremena bit će postavljeni 00.00.01 - opterećenje je isključeno. Ili postavite novo razdoblje odbrojavanja i dvaput pritisnite gumb START-pauza.

Prikazivanje simbola na LCD -u< ! > znači da je opterećenje isključeno (PD3) i kada se tipka START pritisne jednom, podešeno vrijeme će se odbrojavati.

Vanjski kvarc 8 MHz, za točnost brojanja.

Popis radioelemenata

Oznaka Vrsta Vjeroispovijest Količina BilješkaDućanMoja bilježnica
MK AVR 8-bitni

ATmega8

1 U bilježnicu
Linearni regulator

LM7805

1 U bilježnicu
Ispravljačka dioda

1N4148

1 U bilježnicu
Kondenzator22 pF2 U bilježnicu
Kondenzator0,1 uF1 U bilježnicu
100 uF1 U bilježnicu
Elektrolitički kondenzator470 uF1 U bilježnicu
Otpornik

470 ohma

1 U bilježnicu
Trimer otpornik5 kΩ1 U bilježnicu
Otpornik

10 kΩ

1 U bilježnicu
Kvarcni rezonator8 MHz1