Sunteți pe pagina 1din 17

1.

Definirea problemei: sa scrim un program pe baza unui controller atmega 16 care


va indeplini functia de afisaj a unui indicator de tensiune si current. 2. Consideraii teoretice cu descrierea componentelor utilizate.

Modulul ADC
Modulul ADC-ului de 10 bii cu aproximare n serie intr n componena modelelor ATmega 8x, ATmega 163x, ATmega 32x, ATmega 323x, ATmega 64x i ATmega128x. Parametrii de baz al acestui ADC sunt: toleran absolut: 2 LSB; nelinearitatea integral: 5 LSB; rapiditatea: pn la 15mii probe/s; Modulul Convertor Analog-Digital este utilizat pentru conversia tensiunii analogice ntr-o valoare digital (n AVR pe 10 bii). De exemplu, poate fi utilizat pentru perceptarea ieirii de la un senzor (de temperatur, presiune, etc.) n anumite intervale, sau pentru a executa anumite aciuni n dependen de valoarea primit. Exist mai multe tipuri de convertoare, dar cele utilizate n microcontrollerele AVR sunt convertoarele cu aproximare succesiv. Mai jos urmeaz o schem simplificat a convertorului analog-digital prezent pe AVR:

Fig. 1 Schem simplificat a convertorului analog-digital La intrare avem un multiplexor analog-digital, care este utilizat la selectarea ntre opt intrri analogice diferite. Aceasta nseamn c este posibil conversia a opt semnale (bineneles c nu n acelai timp). La ieire, valoarea convertit este nscris n regitrii ADCL i ADCH, deoarece regitrii AVR au lime de 8 bii este nevoie de o pereche p-u a stoca o valoare pe 10 bii. n modelele ATmega16x, ATmega32x, ATmega64x, ATmega128x pinii ADC-ului pot fi unii n perechi pentru a obine n total pn la 13 canale cu intrare diferenial. Dou canale n aa caz au posibiliatatea de amplificare preventiv de 20 i 200 ori a semnalului de intrare. n cazul coeficienilor de amplificare 1x i 20x rezoluia efectiv a conversiei este de 8 bii, pe cnd la coeficientul 200x 7 bii. n calitate de tensiune de referin pentru ADC poate fi utilizat att tensiunea microcontrollerului ct i sursa intern sau extern de tensiune de referin. ADC-ul poate funciona n dou regime: regimul conversiei unice, cnd startul fiecrei conversii este iniializat de utilizator. regimul conversiei continue, cnd startul conversiei are loc continuu dup anumite intervale de timp. Tensiunea analogic la intrare trebuie s fie mai mare dect 0V, i mai mic dect tensiunea de referin a convertorului AREF. Tensiunea de referin este o tensiune extern care trebuie aplicat la pinul Aref a microcontrollerului. Valoarea convertit poate fi calculat folosind urmtorea formul: ADCH:L= ((Vin/Vref)*1023)

Deoarece convertorul are o rezoluie de 10 bii, avem 1024 valori posibile, adic dac tensiunea de intrare Vin este egal cu 0, atunci valoarea convertit v-a fi zero, dac Vin este egal cu Vref atunci valoarea convertit v-a fi 1023, iar dac Vin este din Vref atunci valoarea ADCH:L este 512. Acest proces de conversie se mai numete cuantificare, bineneles ce produce o eroare, numit eroare de cuantificare. Regimurile de operare a convertorului analog-digital (CAD) Convertorul Analog-Digital are dou regimuri fundamentale de funcionare: Conversie Unar (singular) i Conversie Continu. n regim de conversie unar, este necesar de a iniializa fiecare c onversie, cnd este gata rezultatul este plasat n perechea de regitri ADCH:L, i nu se pornete o alt conversie. n regim continuu, este necesar de a porni doar o dat conversia i CAD v-a porni automat urmtoarea conversie n dat ce este finisat cea actual. Conversia analog-digital nu este infptuit instantaneu, este necesar de un anumit interval de timp, care depinde de frecvena de clock folosit de CAD i este proporional cu frecvena de clock i poate fi ntre 50 -200 kHz. Dac este de ajuns o rezoluie de conversie mai mic de 10 bii, frecvena CAD poate fi mrit prin ajustarea unui prescaler prezent n CAD, care divide frecvena de clock la un anumit coeficient, setat prin intermediul biilor ADPS2:0 descrii mai jos. Pentru a afla intervalul de timp necesar unei conversii se divide numrul de cicluri necesari unei conversii la frecvena DAC. Normal, o conversie este ndeplinit n 13 cicluri CAD, dar prima conversie (deodat dup pornirea CAD) se ndeplinete n 25 cicluri de clock, i mai este numit Conversie Extins. De exemplu dac folosim un CAD la frecvena de 200kHz, o conversie normal va fi ndeplinit n 65 s, iar una extins n 125 s. Regitrii de stare i control ai CAD CAD conine 4 regitri de I/O: ADMUX ADC Multiplexer Select Register ADCSR ADC Control and Status Register ADCH:L ADC Data Register(High, Low)

Tabel 1. Regitrii de control a ADC-ului

Tab. 2. ADMUX

ADMUX
Acest registru este utilizat pentru selectarea unuia din cele 8 canale care va fi convertit. Tabelul de mai jos arat setrile posibile ale acestui registru:

Tab. 3 Setrile posibile ale ADMUX 2

Fig.2. Formatul registrului ADCSRA(ADCSR)

Tab. 4 Registrul ADCSR ADEN ADC Enable, setnd bitul dat n "1" este pornit CAD, iar n "0" CAD este oprit. Oprind CAD n timpul unei conversii va duce la anularea conversiei date. ADSC ADC Start Convertion, n regim de conversie continu va fi necesar de setat acest bit doar la prima conversie, conversiile urmtoare v-or fi pornite automat. n regim de conversie unar acest bit trebuie setat la fiecare conversie necesar. Acest bit se seteaz n "0" automat la sfritul oricrei conversii. ADFR ADC Free Running Mode, se seteaz n "1" la conversie continu. ADIF ADC Interrupt Flag, acest bit este setat automat n 1 la finisarea unei conversii, sau este setat automat n "0" doar la executarea ISR corespunztor vectorului de ntreruperi, alternativ poate fi setat n "0" nscriind "1" n acest bit. ADIE ADC Interrupt Enable, cnd este setat n "1" i SREG(I)=1 la apariia ADIF se cheam ISR corespunztoare din vectorul de ntreruperi. ADPS2:0 ADC Prescaler Select, aceti bii determin factorul de dividere a frecvenei de clock pentru CAD, tabela de mai jos arat valorile posibile:

Exactitatea maxim a conversiei se obine, dac frecvena de tact a modulului ADC e cuprins ntre 50...200kHz. respectiv coeficientul scalrii trebuie de ales n aa mod, ca frecvena ADC -ului s se afle n acest diapazon. Dac ns exactitatea conversiei e mai mic de 10 bii e destul, se poate de utilizat o frecven mai mare, mrind astfel frecvena msurrii. n modelele ATmega8x, ATmega16x, ATmega64x i ATmega128x pentru acest scop se utilizeaz bitul ASCHM din registrul SFIOR. La setarea lui n 1 viteza de conversie se mrete. ns concomitent crete i consumul de energie a microcontrollerului.

Fig.3. Formatul registrului ADCSRB 3

Fig.4. Formatul registrelor ADCH i ADCL Aceti regitri conin ultima valoare convertit, ADCH biii ADC9:8, ADCL biii ADC7:0. Cnd ADCL este citit datele din ADCH nu sunt modificate pn cind nu se citete i ADCH, adic este esenial ca ambii regitri s fie citii n acelai timp adic ADCL se citete naintea ADCH. Seria ATMEGA conin un CAD mai complex, care are aceleai funcii de baz dar i anumite posibiliti mai avansate ca: apte Canale de intrare difereniale; Dou Canale de intrare difereniale cu amplificare 10x i 200x; Ajustarea la stnga a regitrilor ADCH:L (p-u rezoluie de 8 bii); Tensiune de referin selectabil de 2.56V; Mrirea exactitii conversiei Mai jos sunt prezentate careva recomandri, care permit folosirea la maxim a posibilitilor ADC -ului. n primul rnd, pentru a minimiza erorile ADC-ului nsui, e necesar de a alege corect frecvena de tact a conversiei. Cu tot acest scop la intrarea ADC-ului se recomand de conectat un filtru de frecvene joase. n afar de aceasta, la proiectarea construciei i topologiei plcii trebuie de respectat regulile generale de proiectare a dispozitivelor analogico-digitale: pe plac trebuie prevzut o zon cu metalizare continu pentru mpmntare analogic. Partea analogic a microcontrollerului i partea analogic a ntregului dispozitiv trebuie s fie plasate deasupra la aceast zon. Pmnturile analogic i digital trebuie s se uneasc unul cu altul ntr-un singur punct a plcii; conductorii, prin intermediul crora sunt transmise semnalele analogice, trebuie s fie ct mai scurte i s fie amplasate deasupra pmntului analogic. n afar de aceasta, ei trebuie s fie amplasai ct mai departe de ciruitele digitale rapide; pinul AVCC a microcontrollerului trebuie s fie unit la sursa de alimentare prin filtru LC, cu e artat n fig.5 dac careva din pinii de intrare a ADC se utilizeaz ca pini de ieire digitali, ei nu trebuie s-i schimbe starea n timpul conversiei.

Fig. 5.Conectarea alimentrii la ADC Pentru a micora la minim zgomotele electromagnetice, induse de nucleul procesorului, n toate microcontrollerele analizate, exist un regim adugtor de somn - ADC Noise Reduction. n acest regim, din toate periferiile lucreaz doar ADC i watchdog-ul. Cu acelai scop, dar efectivitate mai mic poate fi folosit regimul Idle. Pentru utilizarea ADC-ului n oricare din regimele indicate, e necesar de a se convinge c ADC-ul este conectat i nu e ocupat cu vre-o conversie, dup care de conectat ADC-ul n 4

regim de conversie unic i de permis intreruperile de la ADC, dup care de pus microcontrollerul n regim ADC Noise Reduction (sau Idle). Imediat dup oprirea procesorului se va ncepe ciclul de conversie. Dup finisarea conversiei o s fie generat o ntrerupere, care va readuce microcontrollerul n regim de lucru, i se va ncepe executarea subrutinei de prelucare a ntreruperii date.

Fig. 6.Parametrii de baz a ADC

Modulul Timer
Microcontrollerele familiei AVR au de la 2 la 4 contoare de timp de uz general, n dependen de model (tab.1)

Tabel 1. Timere/contoare de uz general Dup cum se observ din tabel, n toate modelele familiei ATmega exist, cel puin, dou timere/contoare T0 i T1. Timer/contor T0 are setul minimal de funcii, care ns depinde de modelul micorcontrollerului. n unele modele el poate fi utilizat doar pentru numrarea i msurarea intervalelor de timp sau contor de evenimente externe. n unele modele la aceste funcionaliti se adaug i posibilatea generrii de semnale cu modulare n lungimea pulsului (PWM - Pulse Width Modulation) cu o rezoluie fix, i posibilitatea de lucru n regim asincron n calitate de ceas al timpului real. Timer/contor-ul T1 de asemenea poate fi utilizat pentru numrarea intervalelor de timp i ca contor al evenimentelor externe. n afar de aceea, el poate memora starea sa n dependen de semnale externe. Ca i timer/contor-ul T0, el poate lucra n regim PWM, dar deja cu o rezoluie variabil i cu mai multe canale (numrul de canale depinde de model). Timer/contor-ul T2 e absolut analogic timer/contor-ului T0. Dac n microcontroller sunt prezeni ambii timer/contori, unul poate lucra n regim asincron, altul n calitate de contor a evenimentelor externe. Timer/contor-ul T3 dup posibilitile funcionale e identic timer/contor-ului T1.

ntreruperea TIMER
Modulul de ntrerupere timer este un modul periferic inclus n majoritatea controllerelor seriei AVR, care la rndul su poate conine de la 1 pn la 3 module TIMER. Modulul TIMER de regul se folosete pentru msurarea timpului. n cazul cnd avem nevoie de msurat frecvena, generarea unui semnal de o anumit frecven i alte efecte ce presupun folosirea timpului, se recomand aplicarea modului TIMER. Componen a principal al acestui modul este registrul numrtor TCNT.

Modulele Timer/Conters
Modulul de timer este cel mai fregvent modul utilizat. Un microntroller poate conine de la 1 3 timere. Un modul timer are la baz un numrtor care incrementeaz un registru, acest registru numrtor poate fi de 8 sau 16 bii. Modulul timer 0 se poate utiliza pentru formarea intervalelor ntre generarea ntreruperii de timp. Situaia de ntrerupere va fi provocat la suprancrcarea registrului contor. Odat ntreruperea generat poate chema o funcie de prelucrare a ei. ATmega16 dispune de dou numrtoare/timere de uz general, unul de 8 bii i unul de 16 bii. Fiecruia i se poate selecta o valoare individual pentru prescaler din acelai prescaler de 10 bii. Ambele module pot fi folosite ca timere cu un clock generat intern sau ca numrtoare cu un clock extern de la un pin I/O. Cele 4 valori pentru prescaler sunt CK/8, CK/64, CK/256 i CK/1024 unde CK este clock-ul dat de oscilatorul extern. Ambele timere pot genera ntreruperi ale cror bii de validare se afl n registrul Timer/Counter Interrupt Mask Register (TIMSK) i ale cror flaguri de ntrerupere se afl in registrul Timer/Counter Interrupt Flag Register (TIFR). Timer/Counter0 este un numrtor pe 8 bii. Registrul de control al acestuia este Timer/Counter0 Control Register (TCCR0) din care se seteaz valoarea prescalerului, ceasul intern sau extern i starea por nit/oprit a modulului. La trecerea din 0xFF n 0x00 flagul overflow este setat i este generat ntreruperea TMR0_OVR dac aceasta este validat. Ceasul extern este sincronizat cu oscilatorul microcontrollerului. Pentru a asigura o numrare corect a impulsurilor externe, durata dintre dou tranziii ale clock-ului extern trebuie s fie mai mare ca perioada oscilatorului microcontrolerului. Timer/Counter1 este un numrtor pe 16 bii. Registrele de control ale acestuia sunt Timer/Counter1 Control Registers (TCCR1A and TCCR1B). Diferite flaguri de stare (overflow, captura unui eveniment, etc) se afl n registrul Timer/Counter Interrupt Flag Register (TIFR). De asemenea ceasul extern trebuie s ndeplineasc condiia ca perioada dintre dou tranziii s fie mai mare dect perioada oscilatorului microcontrollerului pentru a asigura o funcionare corect a modulului. Modulul Timer/Counter1 suport funcia de comparare folosind registrele Output Compare Register 1 A i B (OCR1A i OCR1B) pe care le compar cu registrul TCNT1. Funciile de comparare includ resetarea numrtorului la egalitatea cu registrul OCR1A sau alte aciuni pe pinii de ieire la egalitatea cu ambele registre A i B. Modulul poate fi utilizat i ca modulator de impulsuri n durat pe 8, 9 sau 10 bii. De asemnea funcia Input Capture poate salva coninutul TCNT1 n registrul Input Capture Register (ICR1) la apariia unui eveniment extern pe pinul de captur ICP. Setrile evenimentului de captur sunt definite de registrul Timer/Counter1 Control Registers B (TCCR1B). n plus modulul Analog Comparator poate genera evenimentul de captur. Pentru configurarea modulului Timer/Counter0 se utilizeaz registrul TCCR0, iar pentru a configura frecvena apariiilor situaiilor de ntrerupere se va seta prescalerul ce se afl n TCCR0.

CS02, CS01, CS00 - cu ajutorul lor vom seta viteza de progresie a timerului. 6

Tabelul de adevr:

T0 - frontul negativ a pinului T0. Situaia de ntrerupere va fi generat la suprancrcarea registrului TCNT0.

Fig.1 Prezentarea grafic a funcionrii Timerului. Pentru a configura fregvena apariiei situaiei de intrerupere se va seta prescalerul care se configura n TCCR0. Pentru a seta mai fin ntreruperea trebuie de reiniializat registrul TCNT la fiecare ntrerupere. Pentru a organiza un sistem care va utiliza ntreruperea de Timer trebuie s: validm utilizarea modulului ntreruperii din registrul TIMSK; nregistrm n vectorul de ntreruperi chemarea funciei de prelucrare a ntreruperii; descriem subrutina de prelucrare a ntreruperii; Fiecare modul periferic are regitri in spaiu de 64 I/O. Comunicaia modulelor periferice are loc prin intermediul acestor regitri. Exist 3 tipuri de regitri periferice: TCNT0 - de date (transfer de date dintre nucleu i periferie) TCCR0 - de configurare (se utilizeaz pentru configurarea modulului periferic) TIFR, TIMSK - de fanioane(reprezint starea curenta a modulului periferic) Regitri de multe ori sunt combinai cei de configurare i fanioane. Registrul TCNT (timer counter) conine 8 bii. Trecerea valorii registrului de numrare de la valoarea maximal n zero, se numete suprancrcare/depire (overflow). Evenimentul de suprancrcare este legat cu modulul de ntrerupere a timer -ului. Cnd are loc depirea , se seteaz un bit TIFR.TOUF0 n 1. Frecvena apariiei ntreruperii Timer overflow poate fi reglat prin: Reglarea prin setarea divizorului de la semnalul de clock pentru sursa de ncrementare. Setarea valorii iniiale.

Regimurile de lucru ale Modulul TIMER


Modulul TIMER poate lucra n mai multe regimuri: 1) Numrtor destinat lucrului cu timpul. 2) Imput Capture capturarea intrrii care presupune determinarea apariiei unui eveniment extern. Principala sarcin a unitii de capturare la intrare este de a pune la dispoziie suficient memorie din cea a procesorului pentru apariia de evenimente eventuale. Timpul dintre dou evenimente este critic. Dac procesorul nu a citit valoarea asociat capturii n Registrul ICR1, nainte de apariia unui nou eveniment ICR1 va fi suprascris cu o nou valoare. n acest caz valoarea asociat capturii va fi incorect. Utiliznd input capture interrupt, registrul ICR1 poate fi citit naintea producerii rutinei ntreruperilor. Chiar dac input capture interrupt are prioritate ridicat, timpul maxim de rspuns la ntrerupere depinde de numrul maxim de cicluri necesare tratrii unei cereri de ntrerupere. Durata unui ciclu pentru un semnal extern impune ca declanatorul de nivel s fie schimbat dup fiecare captur. 3) Output Capture modul n care se poate genera un semnal extern la coincidena registrului timer cu o valoare prestabilit. Comparatorul pe 16 bii compar TCNT1 cu ieirea registrului Output Compare Register (OCR1x). Dac TCNT este egal cu OCR1x comparatorul semnalizeaz o potrivire. Aceasta seteaz Output Compare Flag (OCF1x) pentru urmtorul ciclu de ceas. Dac OCIE1x =1, Output Compare flag genereaz o ieire output compare interrupt. OCF1x flag este dezactivat automat atunci cnd se execut o ntrerupere. OCF1x flag poate fi de asemenea dezactivat prin trecerea n 1 logic a bitului I/O. innd cont c scrierea lui TCNT1 n orice mod de operare va bloca orice comparare pentru un singur ciclu de ceas, exist riscuri la schimbarea unuia din canalele output compare ale lui TCNT1 indiferent dac Timer/Counter este pornit sau oprit. Dac TCNT1 este egal cu OCR1x rezultatul comparrii va fi pierdut, generndu-se o form de und greit. 4) Puls Width Modulation (PWM) modulaia impulsurilor de durat. Permite modularea unui semnal cu band reglabil, modulat. Watch Dog Timer Microcontrollerul seriei AVR are inclus n componena sa modulul Watch Dog, ce permite resetarea sistemului n caz de un comportament de ciclare al su.

Alegerea tipului de microcontroller utilizat intr-un proiect ATmega 16 este un microcontroler CMOS de 8 biti de mica putere bazat pe arhitectura RISC AVR
imbunatatita. Dispune de un set de 131 instructiuni si 32 de registre de uz general. Cele 32 de registre sunt direct adresabile de Unitatea Logica Aritmetica (ALU), permitand accesarea a doua registre independente intr-o singura instructiune. Se obtine astfel o eficienta sporita in executie (de pana la zece ori mai rapide decat microcontrorelerele convetionale CISC). ATmega16 este un microcontroler RISC pe 8 biti realizat de firma Atmel. Caracteristicile principale ale acestuia sunt: - 16KB de memorie Flash reinscriptibil pentru stocarea programelor - 1KB de memorie RAM - 512B de memorie EEPROM - dou numrtoare/temporizatoare de 8 biti - un numrtor/temporizator de 16 biti - contine un convertor analog digital de 10 biti, cu intrri multiple - contine un comparator analogic - contine un modul USART pentru comunicatie serial (port serial) - dispune de un cronometru cu oscilator intern - ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).

3.Descrierea componentelor electronice


Componentul principal este controleru atmega-16:
ATmega16 - redus de energie CMOS de 8 bii microcontroler bazat pe mai mari AVR RISC Arhitectura. ndeplinirea o declaraie puternic pentru un singur ciclu de ceas, ATmega16 realizeaza aproape un transfer la 1 milion de comenzi pe secund MHz, care permit designer de sistem pentru a optimiza consumul de energie la viteza de procesare.

Schema atmega-16

Nucleu AVR combina un set bogat de instruciuni cu 32 de obiective generale, registre de lucru. Toate cele 32 de registre sunt direct legate de o unitate aritmetic logic (ALU), care permite dou registre independente sa fie accesate de ctre o singur instruciune executat n ciclu de ceas. Arhitectura rezultate - cod mai eficient, ajungnd la o capacitate de pn la zece ori mai rapid decat microcontrolerele CISC conventionale. ATmega16 ofer urmtoarele caracteristici: 16 bytes K a Sistemului programabile Programul de memorie flash cu capacitatea de Reed-Vil-Wright, EEPROM 512-octet, 1 K SRAM octet, 32 linii I / O de uz general, 32 de registre de uz general de lucru, un interfa JTAG pentru Boundary-scan, suport depanare on-chip i de programare, trei flexibil Timer / Contoare cu compara metodele, ntreruperi interne i externe, seria programabil USART, byte orientate dou fire interfata seriala, pe 8 canale, 10-bit ADC cu o etap suplimentar de intrare distinctiv cu castig programabil (TQFP pachet numai) timer programabil cu oscilator intern de protecie, un serial SPI, i ase moduri de software-ul selectabil pentru a economisi energie. modul Repaus oprete CPU, permind USART, dou fire de interfa, convertor A / D, SRAM, Timer / Contoare, port SPI, i sistemul de ntrerupere, pentru a continua s funcioneze. Mod de la putere n jos salveaz coninutul registrului, dar ingheata oscilatorul, dezactivarea toate celelalte funcii chip pana la urmatoarea masa sau un hardware extern Reset. La putere - mod de economisire a timer asincron continu s mearg, permind utilizatorului s menin un timer bazat, n timp ce restul dispozitivului doarme. Metoda de ADC Noise Reduction opreste CPU si toate modulele I / O cu exceptia timer asincron i ADC, pentru a minimiza zgomotul de comutare n timpul schimbrii ADC. Metoda de rezerv, cristal generator / ruleaza rezonator, n timp ce restul dispozitivulu i doarme. Acest lucru permite ncepe foarte repede, combinate cu un consum redus de energie. Extins n modul de ateptare, i generator i asincron cronometrul continu s funcioneze. Dispozitivul este fabricat folosind Atmel memorie de mare densitate tehnologie nevolatila. ISP-ul de memorie flash pe cip permite programului s fie re-programate n sistem printr-o interfata seriala SPI, programator conventional de memorie nevolatila, sau program, on-chip Boot, care ruleaz pe nucleul AVR. Programul poate folosi orice interaciune pantof pentru a descrca o aplicaie n memoria Flash Application. Software-ul in sectiunea Boot Flash va continua s ruleze, n timp ce Aplicat seciunea actualizare Flash, care ofer funcionarea real a Reed-Vil-Wright. Prin combinarea de 8-bit RISC CPU cu bli Samoprogrammiruemoy n sistem pe un cip monolitic Atmel ATmega16 microcontroller puternic care ofer o soluie extrem de flexibile i eficiente pentru multe aplicaii de control embedded.

Componentul lm358n:
Schema lm358n:

Aceste amplificatoare au mai multe avantaje distincte pentru tipurile standard amplificatorului operaional n aplicaii de aprovizionare singur. Ele pot funciona n tensiunea de alimentare ct mai mic de 3. 0 V sau de 32 V, cu fluxurile de fix aproximativ o cincime din legate de MC1741 (pe o per amplificator). gama de intrare de regimul general include furnizarea negativ, eliminnd astfel nevoia de componentele externe ale deplasare n multe aplicaii. gama de tensiune de ieire include, de asemenea negativ a tensiunii de alimentare. 10

4.Schema electric a sistemului:

5.Listingul programului:
. #include<avr/io.h> #include<avr/interrupt.h> //current PORTC #define seg1_a 0x20 #define seg1_b 0x80 #define seg1_c 0x02 #define seg1_d 0x08 #define seg1_e 0x10 #define seg1_f 0x40 #define seg1_g 0x01 #define seg1_h 0x04 //voltage PORTD #define seg2_a 0x01 #define seg2_b 0x04 #define seg2_c 0x10 #define seg2_d 0x40 #define seg2_e 0x80 #define seg2_f 0x02 #define seg2_g 0x08 #define seg2_h 0x20
11

unsigned char digit=0, channel = 0; unsigned int voltage, current; void port_init() { DDRA = 0xFC; PORTA = 0x00; DDRB = 0xFF; PORTB = 0x00; DDRC = 0xFF; PORTC = 0x00; DDRD = 0xFF; PORTD = 0x00; } //-------------------------------------------//decodificarea 7 segmente unsigned char current_dec7seg(unsigned char code) { switch(code) { case 0: return seg1_a|seg1_b|seg1_c|seg1_d|seg1_e|seg1_f; break; case 1: return seg1_b|seg1_c; break; case 2: return seg1_a|seg1_b|seg1_d|seg1_e|seg1_g; break; case 3: return seg1_a|seg1_b|seg1_c|seg1_d|seg1_g; break; case 4: return seg1_b|seg1_c|seg1_f|seg1_g; break; case 5: return seg1_a|seg1_c|seg1_d|seg1_f|seg1_g; break; case 6: return seg1_a|seg1_c|seg1_d|seg1_e|seg1_f|seg1_g; break; case 7: return seg1_a|seg1_b|seg1_c; break; case 8: return seg1_a|seg1_b|seg1_c|seg1_d|seg1_e|seg1_f|seg1_g; break; case 9: return seg1_a|seg1_b|seg1_c|seg1_d|seg1_f|seg1_g; break; } return seg1_a|seg1_d|seg1_e|seg1_f|seg1_g|seg1_h; } //-------------------------------------------//decodificarea 7 segmente unsigned char voltage_dec7seg(unsigned char code) { switch(code) { case 0: return seg2_a|seg2_b|seg2_c|seg2_d|seg2_e|seg2_f; break; case 1: return seg2_b|seg2_c; break; case 2: return seg2_a|seg2_b|seg2_d|seg2_e|seg2_g; break; case 3: return seg2_a|seg2_b|seg2_c|seg2_d|seg2_g; break;
12

case 4: return seg2_b|seg2_c|seg2_f|seg2_g; break; case 5: return seg2_a|seg2_c|seg2_d|seg2_f|seg2_g; break; case 6: return seg2_a|seg2_c|seg2_d|seg2_e|seg2_f|seg2_g; break; case 7: return seg2_a|seg2_b|seg2_c; break; case 8: return seg2_a|seg2_b|seg2_c|seg2_d|seg2_e|seg2_f|seg2_g; break; case 9: return seg2_a|seg2_b|seg2_c|seg2_d|seg2_f|seg2_g; break; } return seg2_a|seg2_d|seg2_e|seg2_f|seg2_g|seg2_h; } //-------------------------------------------void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 10; //set count OCR0 = 246; //set compare TCCR0 = 0x02 ; //start timer } //-------------------------------------------ISR(TIMER0_OVF_vect) { TCNT0 = 10; //set count PORTB = 0xFF; switch(digit) { case 0:{ PORTD = voltage_dec7seg(voltage/10000); PORTB = 0x7F; digit++; }break; case 1:{ PORTD = voltage_dec7seg(voltage%10000/1000)|seg2_h; PORTB = 0xBF; digit++; }break; case 2:{ PORTD = voltage_dec7seg(voltage%1000/100); PORTB = 0xDF; digit++; }break; case 3:{ PORTD = voltage_dec7seg(voltage%100/10); PORTB = 0xEF; digit++; }break;
13

case 4:{ PORTC = current_dec7seg(current/1000)|seg1_h; PORTB = 0xFB; digit++; }break; case 5:{ PORTC = current_dec7seg(current%1000/100); PORTB = 0xFD; digit++; }break; case 6:{ PORTC = current_dec7seg(current%100/10); PORTB = 0xFE; digit++; }break; case 7:{ PORTC = current_dec7seg(current%10); PORTB = 0xF7; digit=0; }break; } } //-------------------------------------------//ADC initialize void adc_init(void) { ADCSRA = 0x00; //disable adc ACSR |= (1<<ACD); ADMUX = 0x40; //select adc input ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); } //-------------------------------------------ISR(ADC_vect) { switch(channel) { case 0:{ voltage = ADCL; //Read 8 low bits first (important) voltage |= (int)ADCH << 8; //Read 2 high bits and shift into top byte voltage = voltage*33.26; channel++; }break; case 1:{ current = ADCL; //Read 8 low bits first (important)
14

current |= (int)ADCH << 8; //Read 2 high bits and shift into top byte current = current*4.5; channel=0; }break; } ADMUX = (ADMUX&0xF0)|channel; ADCSRA |= (1<<ADSC); } //-------------------------------------------void init_devices() { cli(); port_init(); adc_init(); timer0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x01; //timer interrupt sources sei(); //re-enable interrupts } //-------------------------------------------int main() { init_devices(); return 0; }

15

START

Initializarea MCU cseg .org 0 Setarea porturilor de intrare/iesire

Inscrierea in RAM

Initializarea TIMERILOR

Ciclu infinit

ADC_INT

Citirea ADC

Deconecteaza digit 1

DA

ADC0XFE

NU

Conecteaza digit 1

START DA
Deconecteaza digit 2

ADC0XFD E

NU

Conecteaza digit 2

Deconecteaza digit 3

DA

ADC0XFB

NU

Conecteaza digit 3

16

DA
Deconecteaza digit 4

ADC0XF7

NU

Conecteaza digit 4

Deconecteaza digit 5

DA

ADC0XEF

NU

Conecteaza digit 5

DA
Deconecteaza digit 6

ADC0XDF

NU

Conecteaza digit 6

RETI

8.Concluzie:
Efectun acesta lucrare de curs, am obtinut cunostinte mai profunde despre lucrul cu programarea unui microcontroller pentru diferite cerinte practice. Prin configurarea si utilizarea diferitor comenzi noi am realizat un program cu ajutorul caruia am derijat cu reglarea tensiuni si curent si afisarea pe un indicator cu 7segmente si 4 digiti.

9. Bibliografie:
a)Carti programare Assembler; b)www.atmel.ru

17