SUMAR In cadrul acestui proiect s-a realizat implementarea unui ceas digital complet ce permite pe langa afisarea ceasului normal si afisarea datei calendaristice si ziua corespunzatoare a saptamanii si un termometru digital, cu ajutorul unui microcontroller AVRAtmel ATMega16 si un afisaj alfanumeric cu cristale lichide, 16x2 caractere.
DESCRIERE
Dispozitivul a fost proiectat pentru a fi montat in interiorul unui autoturism pentru afisarea informatiilor mentionate in sumar, dar poate fi utilizat cu usurinta in diverse alte locuri cu aceeasi functionalitate. Caracteristici de functionare: Intreg montajul fiind proiectat pentru un autoturism, LCD-ul este activ atata timp cat motorul autovehiculului este pornit, la fiecare pornire, ecranul initializandu-se prin afisarea unui mesaj de START , revenind apoi la afisarea standard(ceas, temperatura, data, ziua saptamanii);
Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 2
Afisarea se face dupa cum urmeaza: pe primul rand se afiseaza alternativ, la interval de 5 secunde, ziua saptamanii impreuna cu data calendaristica si apoi temperatura in grade Celsius; pe cel de-al doilea rand al ecranului se afiseaza in permanenta ceasul in format hh:mm:ss ; Dispozitivul este prevazut cu un panou de butoane ce permite setarea ceasului,a datei si a zilei saptamanii, cu ajutorul meniului de setare. Panoul de butoane este prezentat in imaginea de mai jos, cu semnificatia aferenta fiecarui buton:
Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 3
SCHEMA CIRCUITUILUI
Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 4
MONTAJ ELECTRONIC
COMPONENTE
Microcontroler ATmega16 ATmega16 este un microcontroler de 8-biti de inalta performanta din familia AtmelAVR Mega cu un consum redus de energie. Atmega16 se bazeaza pe cresterea arhitecturii RISC (Reduced Instruction Set Computing), arhitectura cu 131 instructiuni puternice. Cele mai multe dintre instructiunile sale se executa intr-un singur ciclu de ceas. Atmega16 poate lucra pe o frecventa maxim de 16MHz. ATmega16 are 16 KB de memorie flash programabila, 1 KB de memoria RAM static si 512 Bytes EEPROM. Numarul de cicluri de viata pentru memoria flash si EEPROM sunt 10.000 si respective 100.000. Este un microcontroler cu 40 de pini. Exist 32 de pini de I / O (intrare / iesire). Pinii sunt impartiti 4 linii a cate 8 biti:porturile desemnate ca PORTA, PORTB, PORTC si PORTD. Are diverse componente periferice inglobate: USART, ADC, Analog Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 5
Comparator, SPI, JTAG etc. Fiecare pin de I/O are o sarcina alternativa in functie de aceste component periferice.
Convertorul de nivel MAX232 Rolul acestuia este sa converteasca nivelurile TTL (0..5V) in niveluri RS232, si viceversa; practic, tensiunile +10V si -10V se obtin prin dublarea tensiunii de alimentare a circuitului, folosind un convertor intern cu capacitati comutate, care folosete condensatoarele externe C6- C9. Acest circuit integrat este folosit pentru programarea microcontroler- ului, ajutand la comunicarea seriala intre placuta de circuit si PC. Programarea clasica a procesorului foloseste fie un programator dedicat, fie conectorul ISP la care se conecteaza un programator. O varianta mai ieftina si mai comoda este sa nu se foloseasca nici un fel de programator ! Pentru aceasta, in flash-ul procesorului se incarca mai intai un soft numit bootloader (evident, pentru aceasta trebuie un programator, dar operatia se face o singura data). Dupa aceea, bootloader-ul comunica prin serial cu un program de PC numit PC-loader pentru a transfera softul de aplicatie si a-l programa in flash. Prin urmare, odata bootloader-ul incarcat, tot ce mai este necesar este un port serial, iar dispozitivul are deja un port serial construit si conectat la pinii procesorului! J2 este conectorul de programare ISP (In- System Programming) .
Senzor de temperatura LM35
Senzorul LM35 utilizat in acest proiect este un sensor de precizie pentru masurat temperatura care o iesire de tensiune analogica. Poate masura temperaturi intre -55C si Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 6
+150C cu o precizie de 0.5C. Tensiunea de iesire este de 10 mV/ C si este convertita de convertorul analog-digital al controler-ului ATmega16.
LM7805 - 3-Terminal 1A Positive Voltage Regulator
Acest stabilizator de tensiune este folosit pentru a produce tensiunea de 5 V, dispozitivul fiind alimentat de la un acumulator auto cu tensiunea de 12 V. Aceasta tensiune de 5 V reprezinta tensiunea de alimentare pentru toate componentele de pe placa: procesor, LCD, senzor de temperature, MAX232. Pe placa sunt montate doua astfel de stabilizatoare: unul alimentand microcontrolerul, integratul MAX232, senzorul de temperatura si LCD-ul, insa fara lumina de fundal (backlight), aceasta fiind alimentata de ce cel de-al doilea stabilizator de tensiune cu ajutorul caruia se detecteaza functionarea motorului autovehicului, controland astfel pornirea/oprirea ecranului LCD.
COD SURSA
Fisierele lcd.h si lcd.c sunt folosite pentru legatura dintre LCD si microcontroler si pot fi descarcate de pe http://jump.to/fleury .
// AVR ATMEGA32 - INTERNAL 4MHz CLK
// Include Files #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <stdlib.h> #include <util/delay.h> #include <string.h> #include "lcd.h" // THE LCD HEADER FILE TO INCLUDE
// For Bitvise Operation Simplification Defines #define CLR(port,pin) PORT ## port &= ~(1<<pin) #define SET(port,pin) PORT ## port |= (1<<pin) #define TOGL(port,pin) PORT ## port ^= (1<<pin) #define READ(port,pin) PIN ## port & (1<<pin) #define OUT(port,pin) DDR ## port |= (1<<pin) #define IN(port,pin) DDR ## port &= ~(1<<pin)
//date despre meniu..selected=pozitia pe care se afla cursorul // start= pozitia de start pentru afisarea optiunilor din meniu int selected=0,start=0; int clockon=1;//1 afiseaza ceasul la pornire //0 opreste afisarea ceasului la intrarea in meniu int set_clock=0; //1 - meniu activ pentru setarea ceasului //0 - meniu inactiv pentru setearea ceasului char *semne[5]={"ora","min","zi ","luna","an "}; char *zile[8]={"Luni","Marti","Mierc","Joi","Vineri","Smbata","Dum"}; char *zile_setare[8]={"Luni","Marti","Miercuri","Joi","Vineri","Sambata","Duminica"}; int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int day_cnt=0; // contor pentru memorarea zilelor saptamanii int disp_5_sec=0;//contor pentru afisarea alternativa pe ecran a datelor la interval de 5 secunde int adc_result; //rezultatul temperaturii int contact_reading;
int contor=0,set_clock_disp=0,set_day=0,set_date=0,display_status=1,contact_delay=0;
void InitADC() { ADMUX=(1<<REFS0); // For Aref=AVcc;
// ADCSRA=(1<<ADEN)|(1<<ADPS2)|(ADPS1)|(1<<ADPS0); //Rrescalar div factor =128 ADCSRA=0x85;
}
uint16_t ReadADC(uint8_t ch) { //Select ADC Channel ch must be 0-7 ch=ch&0b00000111; ADMUX|=ch;
//Start Single conversion ADCSRA|=(1<<ADSC);
//Wait for conversion to complete while(!(ADCSRA & (1<<ADIF)));
//Clear ADIF by writing one to it //Note you may be wondering why we have write one to clear it //This is standard way of clearing bits in io as said in datasheets. //The code writes '1' but it result in setting bit to '0' !!!
if(!(LCD_CNTRL_PIN & (1<<MENIU)))/// la apasare se intra in meniu { statemenu=1; //constanta ce mentine activ meniul LCD_update(); //se afiseaza meniul clockon=0; //se intrerupe afisarea ceasului
} _delay_ms(170);
while(statemenu) {
if(!(LCD_CNTRL_PIN & (1<<DOWN))) //actionare buton DOWN in meniul principal
if(selected<4) { selected++; LCD_update(); }
Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 12
if(!(LCD_CNTRL_PIN & (1<<UP))) //actionare buton UP in meniul principal
statemenu=0; //se opreste afisarea meniului disp_5_sec=0; //se reseteaza contorul pentru afisare alternativa, pentru ca e posibil ca timpul in meniu sa fie contact_delay=0; //se reseteaza contorul pentru oprirea alimentarii lcd_clrscr(); LCD_print_date(); //se afiseaza ecranul principal de functionare clockon=1; //se permite afisarea ceasului
case 0: { contor=0; //contorul pentru afisarea semnelor ce indica elementul curent de setat setare_ceas(); set_clock=1; //constanta ce mentine meniul de setare al ceasului activ statemenu=0; //nu se afiseaza meniul principal set_clock_disp=1; lcd_gotoxy(13,1); lcd_puts(semne[contor]); break; }
case 2: { setare_zi_sapt();//functia ce afiseaza header-ul meniului de setare==>Ziua saptamanii statemenu=0; set_day=1; break; }
case 1: { contor=2; //contorul pentru afisarea elementului ce trebuie setat-- porneste de la 2=zi lcd_clrscr(); Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 13
lcd_gotoxy(0,0); lcd_putc(1); //sageata pentru meniu lcd_puts("Setare data"); //header-ul pentru submeniu de setare data setare_data(); //se afiseaza data statemenu=0; //se opreste afisarea meniului principal set_date=1; //se permite intrarea in submeniul de setare al datei lcd_gotoxy(12,1); lcd_puts(semne[contor]); //se afiseaza elementul ce trebuie setat break; } } }
itoa(minutes/10,temp,10); lcd_puts(temp); itoa(minutes%10,temp,10); lcd_puts(temp); Catalin SERBAN Grupa 321AB Universitatea Polithenica din Bucuresti 19