Table of Contents

Mihaela CĂLINESCU - POV Analogic Clock

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Prezentarea pe scurt a proiectului meu:

  • ce face
  • care este scopul lui
  • care a fost ideea de la care am pornit
  • de ce cred că este util pentru alţii şi pentru mine

Descriere generală

Schema bloc pentru partea software este prezentata in figura de mai sus. Dupa cum se observa, programul consta intr-o bucla infinita in care la fiecare pas se recalculeaza timpul sub forma de ora, minute, secunde, se ordoneaza limbile conform datelor obtinute dupa care se afiseaza rezultatul.

Pentru partea hardware vom folosi cablajul imprimat din 2013 care contine controlerul ATMEGA324, vom alimenta cu ajutorul unei baterii de 9V iar output-ul va fi redirectionat pe o placuta cu LED-uri.

Hardware Design

Lista piese:

Software Design

Pentru programarea microcontrolerului ATMEGA324PA am folosit limbajul C si WinAvr. Programul consta intr-o bucla infinita in care, la fiecare pas sunt recalculate valorile pentru ora, minut si secunda. Implementarea este prezentata mai jos:

pm.c
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
 
#define HOURS 3
#define MINUTES 17
#define SECONDS 50
#define PERIOD 121
#define ON_TIME 2
 
void switch_line(double *a, double *b){
	double aux;
	aux = *a;
	*a = *b;
	*b = aux;
}
 
int angleToMs(double angle){
	return (int)(PERIOD * angle/360);
}
 
int main(){
	double h = HOURS, m = MINUTES, s = SECONDS; 
	double ms = 0;
	double angle_hour, angle_minute, angle_second;
	int current_time, aux;
 
	DDRD = 0xFF;
	PORTD = 63; 
 
	while(1){
		angle_hour = (double)360/12 * h + (double)360/(12*60) * m + (double)360/(12*60*60) * s;
		angle_minute = (double)360/60 * m + (double)360/(60*60) * s;
		angle_second = (double)360/60 * s;
 
		if(angle_minute > angle_second)
			switch_line(&angle_minute, &angle_second);
		if(angle_hour > angle_minute)
			switch_line(&angle_hour, &angle_minute);
		if(angle_minute > angle_second)
			switch_line(&angle_minute, &angle_second);
		current_time = 0;
		aux = angleToMs(angle_hour);
		_delay_ms(aux);
		PORTD = PORTD ^ 63; _delay_ms(ON_TIME); PORTD = PORTD ^ 63;
		current_time += (aux + ON_TIME);
 
		aux = angleToMs(angle_minute) - current_time;
		if(aux > 0){
			_delay_ms(aux);
			PORTD = PORTD ^ 63; 
			_delay_ms(ON_TIME); 
			PORTD = PORTD ^ 63;
			current_time += (aux + ON_TIME);
		}
		aux = angleToMs(angle_second) - current_time;
		if(aux > 0){
			_delay_ms(aux);
			PORTD = PORTD ^ 63; 
			_delay_ms(ON_TIME); 
			PORTD = PORTD ^ 63;
			current_time += (aux + ON_TIME);
		}
		aux = PERIOD - current_time;	
		if(aux > 0)
			_delay_ms(aux);
 
		ms += PERIOD;
		if(ms >= 1000){
			s ++;
			ms = ms - 1000;
		}
		if(s == 60)	{
			m ++;
			s = 0;
		}
		if(m == 60){
			h ++;
			m = 0;
		}
		if(h == 12)
			h = 0;
	}
	return 0;
}

Rezultate Obţinute

In imaginile de mai sus vedeti forma finala a proiectului, o captura din timpul functionarii, precum si LED-urile lipite incorect (cu bornele inversate) si inlocuite reprezentand daunele proiectului :-D

Concluzii

Bibliografie/Resurse