Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Retele calculatoare


Qdidactic » stiinta & tehnica » informatica » retele calculatoare
Microcontroler ATMEGA8 al firmei ATMEL - manual de utilizare



Microcontroler ATMEGA8 al firmei ATMEL - manual de utilizare




DOCUMENTATIE


CUPRINS



I.            MANUAL DE UTILIZARE

1.Prezentarea produsului

2.Caracteristicile produsului

3.Indicatii de utilizare

4. Performante

5. Mod de intretinere

II.          DOCUMENTATIA TEHNICA

Descrierea produsului



Prezentare hardware

Prezentare software

Utilizare





MANUAL DE UTILIZARE



1.PREZENTAREA PRODUSULUI




Produsul este un sistem cu microcontroler ATMEGA8 al firmei ATMEL, care indeplineste urmatoarele functii:



-sa programeze memoria FLASH de program,pe portul paralel al unui PC de uz general, pe magistrala SPI


-sa citeasca temperatura de la un senzor LM335 si sa aprinda un led rosu cand temperatura depaseste 37 de grade Celsius


-sa aprinda si sa stinga un led galben cu frecventa de 1 secunda


-sa transmita temperatura pe linie seriala catre PC si sa afiseze aceasta temperatura printr-un program ce va fi furnizat de conducatorul de proiect


-sa aprinda si sa stinga un led verde cand de la tastatura PC se tasteaza A ,respectiv B




2.CARACTERIZAREA

PRODUSULUI





Sistemul cu microcontroler ATMEGA8 are urmatoarele caracteristici :


-nivel de zgomot 0db


- temperatura normala de functionare 18-20 de grade celsius


- umiditate 70%


-interfata cu computerul RS232


-modulul nu necesita reglare


-toate modulele sunt testate si verificate.


-tensiunea de alimentare este de 5V , curent continuu stabilizat ;


-functioneaza cu un motor de tip servo cu semnale de comanda intre 1 si 2 ms ;


-greutatea placii este de :     ;


-dimensiunile placii sunt urmatoarele :





CONECTORII:


DB9 serial:





Port paralel






CABLURII :



  1. de la placa la DB9

dimensiune : 3*0,45mm

tipul  : rigid




2.de la placa la LT P

dimensiune  :5*0,45mm

tipul  :litat, panglica



3.de la servomotor la placa

dimensiune : 3*0,45mm

tipul :litat

firul negru - e legat la 0V

firul rosu -e legat la 5V

firul alb -e legat la PWM





3. INDICATII DE UTILIZARE


Utilizare hard :

-se conecteaza motorul

-se conect la portul serial

-se verifica daca au fost corect realizate conexiunile si un conforme cu schema (fig.1)

-se alimenteaza


Utilizare soft :

Incarcare program :

se conecteaza la potul paralel al computerului

-Se ia fisierul hex generat de avr studio

-se lanseaza pony prog

se citesc biti de configurare d e la micro pt a vedea dak avem o conexiune corecta si nu sunt erori de comunicare

se deschide fisierul hex open flash memory

si apoi de da writh device




INITIALIZARE 


Initializarea microcontrolerului se realizeaza cu ajutorul unei functii care este folosita in program. . Functia se executa o singura data, la pornirea sistemului.     

Operatiile efectuate in aceasta functie sunt:

In ceea ce priveste pinii microcontrolerului:

se seteaza pinii 1, 2, 3 ai portului B ca pini de iesire (DDRC=14). Acestia sunt cei 3 pini la care sunt legate ledurile, conform modului anterior mentionat.

se seteaza pinul 1 al portului B ca pin de iesire (DDRB=2). La acest pin se va lega motorul servo.

In ceea ce priveste convertorul analog-numeric:

se seteaza referinta de 5V pentru convertorul analog-numeric (bitii 6 si 7), se impune rotunjirea prin adaos a rezultatului conversiei (bitul 5) si se selecteaza canalul 0 ca si canal de pe care se ia semnalul analogic si se converteste la valoare numerica (bitii 3-0) = > ADMUX=0.

se seteaza convertorul in mod “ Free Run ”(bitul 5) – in acest mod are loc o conversie continua a semnalului prezent pe canalul de intrare iar rezultatul conversiei este depus in registrii de date ADCH si ADCL, dar acesti sunt modificati simultan, astfel ca nu este posibila o citire gresita a rezultatului conversiei; se dezactiveaza intreruperile pentru convertorul analog-numeric (bitul 3), se seteaza o divizare cu 8 a tactului microcontrolerului astfel ca frecventa tactului de conversie este 125 KHz (bitii 2-0); se “porneste” microcontrolerul (bitul 7) si se starteaza prima conversie (bitul 6)             => ADCSRA=227.

In ceea ce priveste timerul T1:

se foloseste canalul A al timerului pentru generarea semnalului PWM cu o frecventa de 50Hz. Bitii 4 si 3 din registrul TCCR1B impreuna cu bitii 1 si 0 din registrul TCCR1A stabilesc modul de lucru al timerului. S-a optat pentru folosirea timerului in modul “ PWM, Phase and Frequency Correct ” (combinatia 1 0 0 0). In acest mod de functionare timerul numara de la valoarea 0 pana la valoarea inscrisa in registrul ICR1, iar la atingerea acestei valori, timerul inverseaza sensul de numarare si numara inapoi pana la 0. Totodata prin bitii 7 si 6 din registrul TCCR1A se stabileste ca semnalul de la iesire (portul B, bitul 1) sa se inverseze de fiecare data cand exista coincidenta intre registrii timerului T1 (T1H si T1L) si valoarea registrului OCR1A. Se mai impune de asemenea ca frecventa de tact a timerului T1 sa fie data prin divizarea cu 8 a frecventei microcontrolerului (bitii 2-0 din registrul TCCR1B), prin urmare foscT1=125KHz. Aceste setari se fac prin: TCCR1A=128 si TCCR1B=18.


se reseteaza toate sursele de intrerupere ale timerului T1 (bitii 5-3) prin aplicarea unei masti registrului TIMSK => TIMSK=TIMSK&195

avand in vedere ca freceventa de tact a timerului este 125KHz, prin calcul rezulta pentru registrul ICR1 valoarea ICR1=1250, iar pentru registrul OCR1A valorile pot varia in intervalul OCR1A=145 (full left) si OCR1A=25 (full right).


In ceea ce priveste timerul T2:

se specifica faptul ca timerul este setat in mod normal de functionare (bitul 3 si bitul 6 in combinatie 0 0 si bitul 7 setat pe 1) si se impune ca frecventa de tact sa fie obtinuta prin divizarea cu 1055 a frecventei de tact a microcontrolerului => TCCR2=135;

se invalideaza intreruperile la comparare (bitul 7) si se valideaza intreruperile la overflow (bitul 6) prin aplicare succesiva de masti => TIMSK=TIMSK&127; TIMSK=TIMSK|64;

In ceea ce priveste interfata seriala USART:

se seteaza viteza de transmisie ca fiind VUSART = 2400 baud/sec => UBRRH=0; si UBRRL=25 in situatia in care microcontrolerul are un tact de 1 MHz;

se valideaza intreruperile la receptie (bitul 7), se valideaza receptia (bitul 5) si transmisia (bitul 4) prin aplicarea unei masti registrului UCSRB                                 => UCSRB=UCSRB|152;





4.PERFORMANTA



1.Circuitul care ne ajuta sa programam memoria flash a microcontrolerului isi indeplineste sarcina fara a se pierde date pe parcursul scrierii.



2. Microprocesorul primeste in timp util informatia despre temperatura exterioara prin intermediul senzorului LM335.Microcontrolerul converteste aceasta informatie cu ajutorul adc-ului , o proceseaza si actioneaza corespunzator elementul de executie care in acest caz e servomotorul si ledul rosu.



3.Ledul galben de pe cablaj se va aprinde o data pe secuna cu o eroare de

+5 - -5%.



4.datele vor fi transmise pe portul serial cu bit rate 2400 parity bits non, biti de stop 1.temperatura va fi afisata pe ecranul computerului cu ajutorul unui program wind mill






5.MODUL DE INTRETINERE



1.Inainte de utilizare cititi cu atentie indicatiile de utilizare si indeplinici cerintele care sunt specificate in acestea.Nu incercati sa montati echipamentul altfel decat cel indicat .


2.Manevrati sistemul cu microcontroler ATMEGA8 cu grija .Nu-l scapati din mana si nu-i cauzati nici o alta stricaciune.Acestea determina functionarea sa defectuasa.


3.Nu dezasamblati niciodata sistemul.Pastrati-l corespunzator.


4.Nu expuneti echipamentul la umiditate,caldura,frig in exces,la praf sau murdarie.


5.Nu utilizati echipamentul daca l-ati scapat in apa,sau daca a patruns apa inauntrul sau.Chear daca l-ati uscat, sa nu-l utilizati deoarece pot sa apara functionarii gresite.


6.Atunci cand nu utilizati echipamentul pastratil in locuri uscate si ferite de interperii.


7.Respectati tensiunea de alimentare , toate modulele sunt testate si verificate.


8. Nu aruncati echipamentul pe foc .


9.Nu aruncati echipamentul electornic la gunoiul menajer. In concordanta cu Directiva Europeana 2002/96/EC privind utilizarea echipamentelor electrice si electronice si implementarea acesteia in legislatia nationala, echipamentul electric uzat , a carui durata de utilizare a expirat , trebuie colectat separat si predat unui centru specializat de reciclare.


10.Nu lasati echipamentul la indemana copiilor.



DOCUMENTATIA TEHNICA


DESCRIEREA PRODUSULUI



Produsului este un sistem cu microcontroler ATMEGA8 al firmei ATMEL, care indeplineste urmatoarele functii:



-sa programeze memoria FLASH de program,pe portul paralel al unui PC de uz general, pe magistrala SPI


-sa citeasca temperatura de la un senzor LM335 si sa aprinda un led rosu cand temperatura depaseste 37 de grade Celsius


-sa aprinda si sa stinga un led galben cu frecventa de 1 secunda


-sa transmita temperatura pe linie seriala catre PC si sa afiseze aceasta temperatura printr-un program ce va fi furnizat de conducatorul de proiect


-sa aprinda si sa stinga un led verde cand de la tastatura PC se tasteaza A ,respectiv B



2.PEZENTARE HARD



Sunt 3 tipuri de scheme si anume :

schema electronica – in aceasta schema sunt prezente toate componentele cat si conexiunile dintre ele sub o forma logica functionala

harta fizica a placii – amplasarea componentelor ,poza placii cu toate componentele pe ea(nu ne intereseaza conexiunile).

schema cu conexiunile- in care sunt prezentate doar componentele pincipale si                

legaturile intre ele

Schemele sunt prezentate in figurile de mai jos:


  1. Schema electronica

IC- circuit integrat

IC1-microcontorler ATMEGA8

IC2-MAX232

R1,R2,R3,R4,R5,R6- rezistente

C1,C2,C3,C4,C5- condensatoare

GND- masa

VCC- +5V

T1-senzor de temperatura LM335

L1,L2,L3-leduri

M-servomotor





2.Harta placii



  1. Schema cu conexiuni


PC- calculatorul


Lista de componente

R1= 1kW

R2= 1kW

R3= 1kW

R4= 1kW

R5= 1kW

R6= 6kW

C1=1mF              

C2=1mF

C3=1mF

C4=1mF

C5=1mF

IC1- ATMEGA8

IC2- MAX232

T1-LM335


MICROCONTROLER ATMEGA8


SENZOR DE TEMPERATURA LM335





CONECTORII:


DB9 serial:





Port paralel









CABLURII :



  1. de la placa la DB9

dimensiune : 3*0,45mm

tipul  : rigid




2.de la placa la LT P

dimensiune  :5*0,45mm

tipul  :litat, panglica



3.de la servomotor la placa

dimensiune : 3*0,45mm

tipul :litat

firul negru - e legat la 0V

firul rosu -e legat la 5V

firul alb -e legat la PWM


Facilitatii de testare :

se alimenteaza cu 5V curent continuu la conectorul X1

se leaga la PC pe portul serial

se porneste windmill

se trimite caracterul A -> se aprinde ledul verde

se trimite caracterul B-> se stinge ledul verde

se primeste temperatura

se observa led clipind

se vizualizeaza cu osciloscopul semnalul PWM





3.PREZENTARE SOFT




Consideratii generale asupra programului

Programul implementeaza urmatoarele functionalitati cu ajutorul microcontrolerului Atmel ATmega8:

ledul galben clipeste cu frecventa de 1 secunda. Ledul este legat la portul C pe pinul 3.

ledul verde se aprinde sau se stinge, in functie de comanda primita pe serial – caracteru


l “a” sau caracterul “s”. Ledul este legat la portul C pe pinul 4.

ledul rosu se aprinde daca temperatura citita de senzorul de temperatura depaseste o anumita valoare impusa de programator.

la fiecare secunda se trimite pe interfata seriala temperatura citita de senzorul de temperatura. In functie de aceasta temperatura se comanda motorul servo legat la portul B, pe pinul 1.

Pentru implementarea functionalitatilor anterior amintite microcontrolerul are doua surse de intreruperi:

una provenita de la timerul T2, cu ajutorul caruia se realizeaza temporizarea de 1 secunda. S-a optat pentru utilizarea timerului T2 in obtinerea temporizarii deoarece pentru comanda motorului servo se va folosi timerul T1 intrucat acesta dispune de capabilitatea de a genera semnal PWM. Totusi, pentru a se folosi aceasta capabilitatea, tactul de 1 MHz primit de la generatorul de tact al microcontrolerului trebuie divizat, dar divizorul de tact este comun timerelor T1 si T0, prin urmare daca se impune o anumita divizare pentru generarea semnalului PWM cu ajutorul timerului T1, aceeasi divizare se va utiliza si de catre timerul T0. Dezavantajul situatiei este dat de faptul ca pentru generarea semnalului PWM nu se foloseste o divizare puternica a tactului. In aceasta situatie in intervalul unei secunde s-ar fi generat un numar mare de intreruperi, fapt care ar fi dus la o precizie scazuta a temporizarii.

una provenita de la interfata seriala RS232. S-a optat pentru operarea cu intreruperi la receptie seriala deoarece aparitia unei comenzi de aprindere respectiv stingere a ledului verde este complet asincrona in raport cu executia programului iar lucrul in polling ar fi insemnat un timp suplimenatar de executie a programului.

Pentru citirea temperaturii s-a optat pentru operarea in mod “ Free Run ” a convertorului analog-numeric si citirea continua in polling a temperaturii.



Codul sursa al programului




Se prezinta in continuare codul sursa al programului utilizat:

#include <stdio.h>

#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/signal.h>

#include <avr/delay.h>

unsigned int contor=0;

unsigned char tmp;


void initializare(void)



void transmit(unsigned char temperatura)




void pwm_command(unsigned char tmp_pwm)

}




void citire_temp(void)


medie=medie/500;

tmpgr=((medie*500)/1023)-273;

tmp=(unsigned char)tmpgr;

if(tmp>20)

PORTC=PORTC|4; //aprinde led rosu

else

PORTC=PORTC&251; //stinge led rosu }


SIGNAL(SIG_OVERFLOW2)



SIGNAL(SIG_UART_RECV)



void main (void)






Functii folosite in program


void initializare(void)

Functia are rolul de a initializa microcontrolerul. Ea se executa o singura data, la pornirea sistemului. Operatiile efectuate in aceasta functie sunt:

In ceea ce priveste pinii microcontrolerului:

se seteaza pinii 1, 2, 3 ai portului B ca pini de iesire (DDRC=14). Acestia sunt cei 3 pini la care sunt legate ledurile, conform modului anterior mentionat.

se seteaza pinul 1 al portului B ca pin de iesire (DDRB=2). La acest pin se va lega motorul servo.

In ceea ce priveste convertorul analog-numeric:

se seteaza referinta de 5V pentru convertorul analog-numeric (bitii 6 si 7), se impune rotunjirea prin adaos a rezultatului conversiei (bitul 5) si se selecteaza canalul 0 ca si canal de pe care se ia semnalul analogic si se converteste la valoare numerica (bitii 3-0) = > ADMUX=0.

se seteaza convertorul in mod “ Free Run ”(bitul 5) – in acest mod are loc o conversie continua a semnalului prezent pe canalul de intrare iar rezultatul conversiei este depus in registrii de date ADCH si ADCL, dar acesti sunt modificati simultan, astfel ca nu este posibila o citire gresita a rezultatului conversiei; se dezactiveaza intreruperile pentru convertorul analog-numeric (bitul 3), se seteaza o divizare cu 8 a tactului microcontrolerului astfel ca frecventa tactului de conversie este 125 KHz (bitii 2-0); se “porneste” microcontrolerul (bitul 7) si se starteaza prima conversie (bitul 6)             => ADCSRA=227.

In ceea ce priveste timerul T1:

se foloseste canalul A al timerului pentru generarea semnalului PWM cu o frecventa de 50Hz. Bitii 4 si 3 din registrul TCCR1B impreuna cu bitii 1 si 0 din registrul TCCR1A stabilesc modul de lucru al timerului. S-a optat pentru folosirea timerului in modul “ PWM, Phase and Frequency Correct ” (combinatia 1 0 0 0). In acest mod de functionare timerul numara de la valoarea 0 pana la valoarea inscrisa in registrul ICR1, iar la atingerea acestei valori, timerul inverseaza sensul de numarare si numara inapoi pana la 0. Totodata prin bitii 7 si 6 din registrul TCCR1A se stabileste ca semnalul de la iesire (portul B, bitul 1) sa se inverseze de fiecare data cand exista coincidenta intre registrii timerului T1 (T1H si T1L) si valoarea registrului OCR1A. Se mai impune de asemenea ca frecventa de tact a timerului T1 sa fie data prin divizarea cu 8 a frecventei microcontrolerului (bitii 2-0 din registrul TCCR1B), prin urmare foscT1=125KHz. Aceste setari se fac prin: TCCR1A=128 si TCCR1B=18.

se reseteaza toate sursele de intrerupere ale timerului T1 (bitii 5-3) prin aplicarea unei masti registrului TIMSK => TIMSK=TIMSK&195

avand in vedere ca freceventa de tact a timerului este 125KHz, prin calcul rezulta pentru registrul ICR1 valoarea ICR1=1250, iar pentru registrul OCR1A valorile pot varia in intervalul OCR1A=145 (full left) si OCR1A=25 (full right).


In ceea ce priveste timerul T2:

se specifica faptul ca timerul este setat in mod normal de functionare (bitul 3 si bitul 6 in combinatie 0 0 si bitul 7 setat pe 1) si se impune ca frecventa de tact sa fie obtinuta prin divizarea cu 1055 a frecventei de tact a microcontrolerului => TCCR2=135;

se invalideaza intreruperile la comparare (bitul 7) si se valideaza intreruperile la overflow (bitul 6) prin aplicare succesiva de masti => TIMSK=TIMSK&127; TIMSK=TIMSK|64;

In ceea ce priveste interfata seriala USART:

se seteaza viteza de transmisie ca fiind VUSART = 2400 baud/sec => UBRRH=0; si UBRRL=25 in situatia in care microcontrolerul are un tact de 1 MHz;

se valideaza intreruperile la receptie (bitul 7), se valideaza receptia (bitul 5) si transmisia (bitul 4) prin aplicarea unei masti registrului UCSRB                                 => UCSRB=UCSRB|152;

se seteaza dimensiunea caracterului transmis ca fiind caracter de 8 biti (bitii 2 si 1) prin aplicarea unei masti registrului UCSRC => UCSRC=UCSRC|134;

Se armeaza sistemul de intreruperi globale (bitul 7) => SREG=128.


void transmit(unsigned char temperatura)

Functia are rolul de a transmite pe interfata seriala parametrul de tip char “temperatura”. Valoarea acestui parametru reprezinta chiar valoarea in grade Celsius a temperaturii citite de la senzorul de temperatura prin intermediul convertorului analog-numeric.

Instructiunea “ If ” are rolul de a testa daca registrul de date este gol (bitul 5 din UCSRA este setat). In caz afirmativ se inscrie in registrul de date, UDR, valoarea parametrului “temperatura”. Simpla inscriere a unei valori in registru va determina transmiterea ei pe interfata seriala.


void pwm_command(unsigned char tmp_pwm)

Functia are rolul de a calcula valoarea cu care se modifica factorul de umplere al semnalului PWM in functie de valoarea parametrului tmp_pwm.

Cu ajutorul variabilei command_pwm se va calcula valoarea care se inscrie in registrul OCR1A astfel ca pozitia indicata de motorul servo sa coincida cu temperatura indicata de senzorul de temperatura.

Se convine ca limita din stanga a motorului, cea care corespunde valorii OCR1A=145, sa corespunda unei temperaturi de 10 ̊ C (limita din stanga a intervalului de masurare) iar limita din dreapta, cea care corepunde valorii OCR1A=25, sa corespunda unei temperaturi de 40 ̊ C (limita din dreapta a intervalului de masurare). Astfel avem o posibilitate de a masura un interval de 30 ̊ C folosind 120 de pasi ai motorului servo, prin urmare se deduce ca pentru a indica o modificare cu 1 ̊ C motorul servo isi va modifica pozitia cu 4 pasi.

Instructiunea “ If ” are rolul de a testa daca parametrul primit de functie, tmp_pwm, este valid din punct de vedere al incadrarii in intervalul de masurare anterior stabilit. In caz afirmativ se continua cu calculul pozitiei la care trebuie sa se stabileasca motorul servo.

Formula de calcula a valorii variabilei command_pwm este: command_pwm=145-((tmp_pwm-10)*4);

Diferenta “ tmp_pwm-10 “ este data de faptul ca nu intereseaza temperatura propriu-zisa ci offset-ul, in grade Celsius, fata de marginea din stanga a intervalului de masurare (care este fixata la 10 ̊ C). Urmatoarea operatie, cea de multiplicare cu 4, are ca rezultat numarul de pasi care corespund offset-ului. In fine, ultima operatie, cea de scadere, va avea ca rezultat valoarea numarului care trebuie inscris in registrul OCR1A pentru a se obtine pozitia motorului servo care corespunde temperaturii masurate de senzorul de temperatura.


void citire_temp(void)

Functia are rolul de a citi valoarea numerica a temperaturii calculate de convertorul analog-numeric si de a calcula valoarea in grade Celsius a acesteia.

Pentru a se asigura o valoare cat mai corecta a temperaturii citite, se realizeaza o filtrare folosind media a 500 de masurari consecutive. Variabila “ medie ” se foloseste pentru a calcula media cele 500 de masurari, iar variabila i se foloseste pe post de contor. Variabila             “ tmpnr ” se foloseste pentru a citi rezultatul conversiei din registrii de date ai convertorului analog-numeric. Varibila “ tmpgr ” se foloseste pentru a obtine temperatura in grade Celsius a mediei celor 500 de masurari. In fine, “ tmp ” este o variabila globala de tip unsigned char care memoreaza valoarea in grade Celsius a ultimei temperaturi masurate.

Modul de functionare al functiei este urmatorul: se fac 500 de citiri consecutive din registrii de date ai convertorului analog-numeric si se insumeaza aceste numere in variabila    “ medie ”. Se mentioneaza ca rezultatul conversiei analog-numerice este situat in registrii ADCH si ADCL astfel: cei mai semnificativi 2 biti ai rezultatului sunt situati in registrul ADCH corespunzator bitilor 1 si 0, iar restul de 8 biti mai putin semnificativi sunt situati in registrul ADCL.

In continuare, dupa efectuarea celor 500 de citiri se calculeaza media lor in variabila “ medie ” , se transforma rezultatul in grade Celsius, si se inscrie in variabila “ tmp ”.

O instructiune “ If ” testeaza daca rezultatul este mai mare decat o valoare impusa de programator (in acest caz 20). In caz afirmativ se comanda aprinderea ledului rosu, iar in caz contrar se comanda stingerea lui.

SIGNAL(SIG_OVERFLOW2)

Aceasta functie este rutina de tratare a intreruperii generate de overflow-ul timerului T2 si se apeleaza in mod automat la atingerea overflow-ului.

Deoarece timerul T2 utilizeaza o frecventa foscT2= 1 MHz / 1055 = 976.5625 Hz si poate numara maxim 256 de impulsuri de tact inainte sa genereze o intrerupere, deducem ca pentru a realiza o temporizare de 1 secunda va fi nevoie sa se utilizeze un contor, care este retinut in variabila globala “ contor ”.

Pentru a numara 976 de impulsuri de tact intr-o secunda, timerul va trebui sa se reseteze de 4 ori (deci aceasta va fi valoarea maxima a contorului). Acum, deoarece timerul poate sa numere 256 de impulsuri de tact, daca se reseteaza de 4 ori, el va numara 1055 de impulsuri. Intrucat dorim sa numere mai putine impulsuri, se va folosi un offset de valoare (1055-976)/4 = 12. Asadar la fiecare resetare a timerului se va seta un offset de 12 pentru a realiza corect temporizarea.

Modul de lucru al rutinei de tratare a intreruperii este urmatorul: la intrarea in rutina de taratare a intreruperii se scrie valoare 12 in registrul TCNT2 (offset-ul). Se incrementeaza valoarea variabilei “ contor ”. Se testeaza daca aceasta valoare coincide cu valoarea maxima a contorului (este nevoie de 4 resetari pentru a realiza o temporizare de 1 secunda). In caz afirmativ se reseteaza contorul, se comuta starea ledului galben (daca era aprins se stinge, iar daca era stins se aprinde), se trimite pe interfata seriala valoarea ultimei temperaturi citite (retinuta in variabila “ tmp ”) si se comanda motorul servo in functie de aceasta temperatura prin apelul functiei pwm_comand(tmp).

Daca valoarea variabilei “ contor ” nu coincide cu valoarea maxima a contorului, se paraseste rutina de tratare a intreruperii.


SIGNAL(SIG_UART_RECV)

Aceasta functie este rutina de tratare a intreruperii generata de receptia unui caracter pe interfata seriala si se apeleaza in mod automat la sfarsitul procesului de receptie seriala.

Modul de lucru al rutinei de tratare a intreruperii este urmatorul: in variabila de tip char “ a ” se citeste valoarea inscrisa in registrul UDR. In cazul in care aceasta valoare coincide cu “ a ” sau “ A ” respectiv “ s ” sau “ S ” se aprinde respectiv se stinge ledul verde. Daca valoarea variabilei “ a ” nu coincide cu nici una din valorile mentionate anterior nu se executa nici o operatie. In fine, la sfarsitul rutinei de tratare a intreruperii se reseteaza flag-ul care indica receptia unui caracter (bitul 7) prin aplicarea unei masti registrului UCSRA => UCSRA=UCSRA&127;


Functia MAIN: void main (void)

Modul de lucru al functiei main() este urmatorul: se apeleaza functia initializare() a carei functionare a fost descrisa anterior. In etapa urmatoare se introduce un delay de 1.5 sec. La sfarsitul delay-ului se starteaza o bucla infinita in care se apeleaza functia citire_temp().

De remarcat faptul ca in main() nu se realizeaza decat citirea temperaturii iar restul operatiilor sunt efectuate in intreruperi deoarece functioneaza cu frecventa de 1 secunda (cum este cazul transmisiei seriale a valorii temperaturii, comanda motorului servo si aprinderea ledului galben) sau functioneaza asincron cu executia programului – ca si in cazul receptiei unei comenzii de aprindere sau stingere a ledului verde.

4.UTILIZARE




Utilizare hard:


-se conecteaza motorul

-se conect la portul serial

-se verifica daca au fost corect realizate conexiunile si conforme cu schema cu conexiuni

-se alimenteaza


Utilizare soft :


Incarcare program

-se conecteaza la potul paralel al computerului

-se ia fisierul hex generat de AVR studio

-se lanseaza pony prog

-se citesc bitii de configurare de la microcontroler pentru a vedea daca avem o conexiune corecta si nu sunt erori de comunicare

-se deschide fisierul hex open flash memory si apoi de da writh device






Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright