În acest proiect vom proiecta un ceas de alarmă simplu folosind cronometre ATMEGA32. Microcontrolerul ATmega32A are un temporizator de 16 biți și îl vom folosi pentru a număra secundele și a dezvolta un ceas digital.
Toate ceasurile digitale au în interior un cristal, care este inima ceasului. Acest cristal nu este prezent doar în ceas, ci este prezent în toate sistemele de calcul în timp real. Acest cristal generează impulsuri de ceas, care sunt necesare pentru calculele de sincronizare. Deși există și alte modalități de a obține impulsuri de ceas, dar pentru precizie și frecvență mai mare, majoritatea preferă ceasul pe bază de cristal. Vom conecta un cristal la ATMEGA32 pentru a obține un ceas precis.
Componente necesare
Hardware: microcontroler ATmega32, cristal 11.0592MHz, condensator 22pF (2 bucăți), sursă de alimentare (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2 LCD), condensator 100uF (conectat la sursa de alimentare), butoane (patru bucăți), rezistor de 10KΩ (șase bucăți), 100nF capacito r (patru bucăți), comutatoare cu trei pini (2 bucăți), tranzistor 2N2222, buzzer, rezistor 200Ω.
Software: Atmel studio 6.1, progisp sau flash magic.
Diagrama circuitului și explicația de lucru
Pentru o sincronizare exactă, am conectat un cristal de 11,0592 MHz pentru ceas. Acum, pentru a dezactiva ceasul intern al ATMEGA, trebuie să-i schimbăm LOW FUSE BITS. Amintiți-vă că nu atingem biții de siguranță mari, astfel încât comunicația JTAG ar fi încă activată.
Pentru a spune ATMEGA să dezactiveze ceasul intern și să lucreze la extern, trebuie să setăm:
BYTE DE UTILIZARE SCĂZUT = 0xFF sau 0b11111111.
În circuitul PORTB al ATMEGA32 este conectat la portul de date LCD. Aici ar trebui să vă amintiți să dezactivați comunicarea JTAG în PORTC din ATMEGA prin schimbarea octeților de siguranță mare, dacă doriți să utilizați PORTC ca un port de comunicație normal. În ecranul LCD 16x2 există 16 pini peste toate dacă există o lumină neagră, dacă nu există lumină de fundal vor exista 14 pini. Se poate alimenta sau lăsa pinii luminii din spate. Acum, în cele 14 pinii există 8 pini de date (7-14 sau D0-D7), 2 pini de alimentare (1 & 2 sau VSS & VDD sau gnd & + 5v), 3 rd pini pentru controlul contrastului (VEE-control cât de gros personajele ar trebui să fie afișat) și 3 pini de control (RS & RW & E)
În circuit, puteți observa că am luat doar doi pini de control. Acest lucru oferă flexibilitatea unei mai bune înțelegeri, bitul de contrast și READ / WRITE nu sunt adesea utilizate, astfel încât acestea pot fi scurtcircuitate la sol. Acest lucru pune LCD în cel mai mare contrast și modul de citire. Trebuie doar să controlăm ENABLE și pinii RS pentru a trimite caractere și date în consecință.
Conexiunile care se fac pentru LCD sunt date mai jos:
PIN1 sau VSS la masă
PIN2 sau VDD sau VCC la + 5v putere
PIN3 sau VEE la sol (oferă un contrast maxim optim pentru un începător)
PIN4 sau RS (Selectare înregistrare) la PD6 de uC
PIN5 sau RW (citire / scriere) la masă (pune LCD în modul de citire facilitează comunicarea pentru utilizator)
PIN6 sau E (Activare) la PD5 de uC
PIN7 sau D0 la PB0 de uC
PIN8 sau D1 la PB1 de uC
PIN9 sau D2 până la PB2 de uC
PIN10 sau D3 până la PB3 de uC
PIN11 sau D4 la PB4 de uC
PIN12 sau D5 până la PB5 de uC
PIN13 sau D6 la PB6 de uC
PIN14 sau D7 la PB7 de uC
În circuit puteți vedea că am folosit comunicația pe 8 biți (D0-D7), totuși acest lucru nu este obligatoriu, putem folosi comunicația pe 4 biți (D4-D7), dar cu programul de comunicație pe 4 biți devine un pic complex. Așa cum se arată în tabelul de mai sus, conectăm 10 pini LCD la controler, în care 8 pini sunt pini de date și 2 pini pentru control.
Comutarea unuia este pentru activarea funcției de reglare între alarmă și oră. Dacă pinul este scăzut, putem regla timpul de alarmă prin apăsarea butoanelor. Dacă butoanele sale înalte sunt pentru ajustarea doar TIME. Există patru butoane prezente aici, primul este pentru incrementarea MINUTELOR în alarmă sau oră. Al doilea este pentru decrement MINUTE în alarmă sau timp. Al treilea este pentru creșterea HOUR în alarmă sau oră. A PATRA este pentru decrement ORE în alarmă sau timp.
Condensatorii prezenți aici sunt pentru a anula efectul de săritură al butoanelor. Dacă sunt eliminate, controlerul poate conta mai mult de unul de fiecare dată când este apăsat butonul. Rezistențele conectate pentru pini sunt pentru limitarea curentului, atunci când butonul este apăsat pentru a trage în jos pinul la pământ.
Ori de câte ori este apăsat un buton, știftul corespunzător al controlerului este tras în jos și astfel controlerul recunoaște că este apăsat un anumit buton și că se iau măsuri corespunzătoare.
În primul rând, ceasul pe care îl alegem aici este 11059200 Hz, împărțindu-l la 1024 dă 10800. Deci, pentru fiecare secundă primim 10800 de impulsuri. Deci, vom începe un contor cu 1024 prescaler pentru a obține ceasul contorului la 10800 Hz. În al doilea rând vom folosi modul CTC (Clear Timer Counter) al ATMEGA. Va exista un registru pe 16 biți în care putem stoca o valoare (compara valoarea), atunci când contorul contează până la valoarea de comparare pe care o întrerupere este setată să o genereze.
Vom seta valoarea de comparare la 10800, deci practic vom avea un ISR (Interrupt Service Routine la fiecare comparație) pentru fiecare secundă. Deci, vom folosi această rutină în timp util pentru a obține ceasul de care aveam nevoie.
MARO (WGM10-WGM13): Acești biți sunt pentru selectarea modului de funcționare pentru temporizator.
Acum, din moment ce dorim modul CTC cu valoarea de comparare în octet OCR1A, trebuie doar să setăm WGM12 la unul, rămânând rămân, deoarece sunt zero în mod implicit.
ROȘU (CS10, CS11, CS12): Acești trei biți sunt pentru alegerea prescalarului și, astfel, pentru obținerea unui ceas de contor adecvat.
Deoarece dorim un 1024 ca prescalare, trebuie să setăm atât CS12, cât și CS10.
Acum există un alt registru pe care ar trebui să îl luăm în considerare:
VERZ (OCIE1A): Acest bit trebuie setat pentru a obține o întrerupere la compararea potrivirii dintre valoarea contorului și valoarea OCR1A (10800) pe care am setat-o.
Valoarea OCR1A (valoarea de comparare a contorului), este scrisă în registrul de mai sus.
Explicație de programare
Funcționarea ceasului cu alarmă este explicată pas cu pas în codul de mai jos:
#include // antet pentru a permite controlul fluxului de date peste pini #define F_CPU 1000000 // indicând frecvența cristalului controlerului atașată #include