Autorul poate fi contactat la adresa: Login pentru adresa
Scopul acestui proiect este crearea unui ceas digital, care include si functionalitate de alarma.
Ora va fi afisata pe un LCD 7 segments display.
Pentru a ajuta la procesul de trezire, difuzorul ceasului se va opri in urma apasarii unui buton de pe placa de test. De asemenea, exista un buton care incepe setarea orei pentru alarma si doua butoane pentru a creste ora, respectiv pentru a micsora ora.
Am ales acest proiect deoarece in cazul trezirii de dimineata mi se intampla constant sa opresc alarma si sa adorm la loc.
Descriere functionalitate:
- pe LCD va fi afisata ora curenta;
- cu ajutorul butoanelor trec intr-un ecran pe LCD unde setez ora la care alarma va suna;
- la ora setata, prin intermediul difuzorului se va reda o melodie, iar la apasarea unui buton, alarma nu se va opri, dar va incepe secventa de joc pe leduri;
- introduc prin intermediul butoanelor secventa de leduri, iar cand aceasta este corecta, alarma se va opri;
Lista de piese
Nume piesa | Cantitate |
---|---|
Placa de baza ATMega324 | 1 |
Baterie externa USB pentru modulul de ceas | 1 |
Placa secundara pentru montarea ledurilor si butoanelor | 1 |
LCD | 1 |
Difuzor | 1 |
Butoane | 4 |
Registrii de shiftare 74hc595 | 4 |
Circuite CD4070 (porti xor) | 8 |
Rezistente | |
Fire legatura |
Schema electrica
Hardware design
Prima problema a fost faptul ca pentru a conecta LCD-ul la placuta ATMega324 aveam de nevoie de minim 28 de pini pentru segmentele celor 4 cifre, plus inca cativa pentru pinii DP (decimal point) si L (segmentul care separa ora de minut). Pentru a rezolva acest lucru, a fost nevoie sa folosesc registrii de shiftare, care fac posibila controlarea a 28 de biti de iesire prin doar 3 pini ai ATMega324. Registrii de shiftare transforma intrarile seriale in iesiri paralele.
Cei trei pini de intrare pentru un registru de shiftare sunt:
Ca iesire, un shift register are 8 pinii (paraleli) reprezentand cei 8 pini introdusi serial.
Am folosit 4 registrii de shiftare, in principiu, cate unul pentru fiecare cifra a LCD-ului. Pentru a functiona toate trei doar cu un 3 pini de la ATMega324, un registru de shiftare are o iesire seriala, care permite trimiterea mai departe a intrarilor primite. Astfel, iesirea seriala de la primul registru este conectata la intrarea seriala (DS) a urmatorului, permitandu-mi ca printr-un singur pin de iesire de la ATMega324 sa trimit odata toti bitii pentru afisarea segmentelor.
Pentru a nu lasa pinii de la LCD “deschisi” si pentru a-i putea controla din cod, iesirile de la registrii de shiftare trec prin porti xor (cu rol de invesor) care au ca intrari unul din outputul de la registrul de shiftare si un pin COM, legat la LCD, care vine de la ATMega324. Iesirile sunt legate la segmentele cifrelor respectiv punctelor.
In pozele de mai jos este doar legarea unei singure cifre a LCD-ului la ATMega.
Pentru scrierea codului propriu zis am folosit un editor simplu, Sublime, iar pentru a scrie fisierul .hex in memoria microcontrollerului, AVRDude.
Din pacate, am avut ceva probleme cu hardware-ul in ideea ca nu am putut aprinde cifrele LCD-ului si cred ca problema vine de la lipiturile de pe spatele placutei de test. Nu am putut testa cu exacticate codul pe care l-am scris, insa voi posta mai jos cateva dintre functiile folosite.
Functia write pentru arpinderea unei cifre a LCD-ului.
#define DataHigh() (PORTB|=(1<<PB5)) #define DataLow() (PORTB&=(~(1<<PB5))) // Trimite un clock pulse pe linia SHCP // intre fiecare doi biti de DC void Pulse() { PORTB|=(1<<PB7);//HIGH PORTB&=(~(1<<PB7));//LOW } // Pinul de latch schimbat la 8 biti // de data trimisi void Latch() { PORTB|=(1<<PB2);//HIGH _delay_loop_1(1); PORTB&=(~(1<<PB2));//LOW _delay_loop_1(1); } // Functie de delay void Wait() { for(uint8_t i = 0;i < 50; i++) { _delay_loop_2(0); } } void Write(uint8_t data) { //Trimite cate 8 biti serial for(uint8_t i=0;i<8;i++) { //Trimite ca output pe linia DS in functie de valoare bit-ului //Se foloseste masca cu cel mai semnificativ BIT 1. if(data & 0b10000000) { DataHigh(); } else { DataLow(); } Pulse(); //clock pentru DS data=data<<1; //Aducerea urmatorului bit din cifra la //cel mai semnificativ bit al } //Mutarea bitilor de input ai registrului catre output. Latch(); }
Un pesudocod pentru functionalitatea de alarma pentru cazul in care se aprinde o singura cifra pe LCD.
void task() { int set = 0; int number = 0; int alarm = 0; uint8_t minutes = 0; while(1) { if ((PINA & (1 << PA0)) == 0 && set == 0) { //set set = 1; Write(digit_pattern[0]); } if ((PINA & (1 << PA0)) == 0 && set == 1) { //set set = 0; alarm = 1; set_alarm(minutes); } if ((PINA & (1 << PA1)) == 0 && alarm == 1) { //stop set = 0; Write(digit_pattern[number]); } if ((PINA & (1 << PA2)) == 0 && set == 1) { //up if (number++ == 10) { number = 0; } minutes = number; Write(digit_pattern[number]); } if ((PINA & (1 << PA3)) == 0 && set == 1) { //down if (number-- == -1) { number = 9; } minutes = number; Write(digit_pattern[number]); } } }
Partea principala a proiectului, adica LCD-ul, nu am putut sa o controlez. Difuzorul si butoanele sunt singurele componente hardware care functioneaza.
Ar trebui sa ma documentez mai mult inainte sa a-mi propune sa fac un proiect anume. Consider ca as fi avut nevoie de ceva mai multa experienta pentru a duce la bun sfarsit proiectul pe care mi l-am ales.
20 aprilie 2018 Research facut inainte de a alege tema proiectului.
21 aprilie 2018 Deadline Milestone1, stabilirea temei proiectului, aprobată de asistent.
27 aprilie 2018 Hardware placa de baza, realizata acasa, pentru ca nu am putut ajunge la laborator. A fost trimisa catre asistent deoarece am avut cateva scurturi.
4 mai 2018 Deadline Milestone2, completare sectiunii Hardware cu componentele si cantitatile necesare.
5 mai 2018 Deadline Milestone3, schema proiect realizata in Eagle, dar am mai adus cateva modificari si dupa deadline.
7 mai - 21 mai 2018 Hardware placuta de test.
21 mai - 25 mai2018 Nu am reusit sa controlez aprinderea LCD-ului.