Sânziana-Aurelia VOICU (78277) - Ceas cu alarma

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

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.:-D

Descriere generală

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;

Hardware Design

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 butoanelor1
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:

  • 1 pin pentru input (DS)
  • 1 pin pentru ceas folosit dupa fiecare setare a pinului DS (SHCP)
  • 1 pin de zavor (latch) folosit petru a semnala trimiterea bitilor din “buffer” catre output (STCP)

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.

Software Design

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]);
		}


	}
}

Rezultate Obţinute

Partea principala a proiectului, adica LCD-ul, nu am putut sa o controlez. Difuzorul si butoanele sunt singurele componente hardware care functioneaza.

Concluzii

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.

Download

Jurnal

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.

Bibliografie/Resurse

pm/prj2018/astratulat/284578.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0