Sunteți pe pagina 1din 24

Universitatea Tehnica a Moldovei

Facultatea CIM
Catedra Microelectronica si Dispozitive Semiconductoare

la Microprocesoare si interfete

Tema: Amperimetru Digital

A elaborat: st.gr.ISBM-081
Serbenco Ion
A verificat: lector superior
Bragarenco Andrei

Chisinau 2011
Cuprins
1. Definirea problemei ...................... Error! Bookmark not defined.
2. Consideratii teoretice ................................................................... 3
2.1. Structura interna: .................................................................... 4
2.2. Descrierea pinilor: ................................................................... 4
2.3. Organizarea memoriei: ........................................................... 5
2.4. Memoria de date SDRAM: ..................................................... 6
2.5. Porturile I/O ............................................................................ 6
2.6. Sistemul de intreruperi: ........................................................... 7
2.7. Subrutina ................................................................................. 9
2.8. Modulul Timer/Counter0 pe 8 biti .......................................... 9
2.9. Modulul de conversie A/D .................................................... 10
3. Schema Electrica ........................................................................ 13
4. Schema bloc ............................................................................... 14
5. Listingul programului ................................................................ 18
6. Rezultatul simularii ....................... Error! Bookmark not defined.
7. Descrierea programului ................. Error! Bookmark not defined.
8. Comenzile utilizate: ................................................................... 23
9. Concluzii: ................................................................................... 24
10. Bibliografie ................................. Error! Bookmark not defined.
Scopul proiectului:

S se elaboreze un program pentru microcontrolerul Atmega16 (pe baza lui e


confecionat dispozitivul), pentru un amprimetru digital, care va executa
masurarea valorii curentului si afisarea acesteia pe un afisor cu 7 segmente
Consideratii teoretice
ATmega 16 este un microcontroler CMOS de 8 bii de mic putere bazat pe arhitectura
RISC AVR imbunataita.
Dispune de un set de 131 instruciuni i 32 de regitri de uz general. Cele 32 de registre
sunt direct adresabile de Unitatea Logica Aritmetica (ALU), permind accesarea a doua
registre independente intr-o singura instruciune. Se obine astfel o eficiena sporita in
execuie (de pana la zece ori mai rapide decat microcontrorelerele convenionale CISC).
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 bii
-un numrtor/temporizator de 16 bii
-conine un convertor analog digital de 10 biti, cu intrri multiple
-conine un comparator analogic
-conine un modul USART pentru comunicaie serial (port serial)
-dispune de un cronometru cu oscilator intern
-ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).
Structura intern general a controlerului. Se poate observa c exist o magistral
general de date la care sunt conectate mai multe module:
-unitatea aritmetic i logic (ALU)
-registrele generale
-memoria RAM i memoria EEPROM
-liniile de intrare (porturile I/O Lines) i celelalte blocuri de intrare/ieire. Aceste ultime
module sunt controlate de un set special de registre, fiecare modul avnd asociat un numr de
registre specifice.
Memoria Flash de program mpreun cu ntreg blocul de extragere a instruciunilor,
decodare i execuie comunic printr-o magistral proprie, separat de magistrala de date
menionat mai sus. Acest tip de organizare este conform principiilor unei arhitecturi Harvad
i permite controlerului s execute instruciunile foarte rapid.
Modul Power-down salveaza coninutul registrelor, dar blocheaza Oscilatorul,
dezactivnd toate celelalte funcii al chip-ului pan la urmatoarea Intrerupere Externa sau
Reset hardware. In modul Power-save, timer-ul asincron continua sa mearga, permiind user-
ului sa menina o baza de timp in timp ce restul dispozitivului este oprit.
In modul Standby , Oscilatorul funcioneaz n timp ce restul despozitivului este oprit.
Acest lucru permite un start foarte rapid combinat cu un consum redus de energie. In modul
standby extins(Extended Stanby Mode), atat Oscilatorul principal cat i timer-ul asincron
continu s funcioneze.
Memoria flash (On-chip) permite s fie reprogaramat printr-o interfa serial SPI , de
catre un programator de memorie nonvolatil convenional, sau de ctre un program de boot
On-chip ce ruleaza pe baza AVR. Programul de boot poate folosi orice interfata pentru a
incarca programul de aplicaie in memoria Flash .
Combinnd un CPU RISC de 8 bii cu un Flash In-system auto programabil pe un chip
monolithic, ATmega 16 este un microcontroler puternic ce ofera o solutie extrem de flexibil
i cu un cost redus n comparaie cu multe altele de pe piaa.
ATmega 16 AVR este susinut de o serie completa de instrumente de program i de
dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe debug/
simulare etc.

1.1.Structura interna :

1.2.Descrierea pinilor:
VCC Sursa de curent
GND Masa
Port A (PA7 .. PA0)
Port-ul A servete drept port de intrri analogice pentru Convertorul A/D. Port-ul A
serveste de asemenea i ca un port bidirecional I/O de 8 bii,n cazul n care Convertorul A/D
nu este folosit. Pinii de port pot fi conectai opional la VCC prin rezistori interni, (selectai
pentru fiecare bit). Buffer-ele de ieire ale Portului A au caracteristici de amplificare .
Port B (PB7.. PB0)
Portul B este un port I/O de 8 bii bidirecional cu rezistori interni (opionali). Buffer-ele
de ieire ale Port-ului B au caracteristici de amplificare. Port-ul B indeplinete de asemenea
funcii speciale ale microcontrolerului ATmega 16.
Port C (PC7PC0)
Portul C este un port I/O de 8 bti bidirecional cu rezistori interni (opionali). Buffer-ele
de ieire ale Port-ului C au caracteristici de amplificare. Daca interfaa JTAG (de depanare)
este activat, rezistorii pinilor PC5(TDI), PC3(TMS) si PC2(TCK) vor fi activai, chiar daca
are loc o resetare. Port-ul C indeplinete de asemenea funcii ale interfeei JTAG i alte funcii
speciale ale ATmega 16.
Port D (PD7PD0)
Portul D este un port I/O de 8 bii bidirecional cu rezistori interni conectai optional la
VCC (selectai pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de
amplificare. Port-ul D indeplinete de asemenea funcii speciale ale ATmega 16.
Reset
Un nivel sczut la acest pin mai mare ca durat decat o valoare prestabilit, va genera o
iniializare.
XTAL 1: Intrare pentru amplificatorul inversor al Oscilatorului;
XTAL 2: Ieire pentru amplificatorul inversor al Oscilatorului.
AVCC: AVCC este pin de alimentare pentru Port-ul A si Convertorului A/D. Trebuie
conectat extern la Vcc, chiar dac ADC nu este folosit. Daca ADC este folosit , ar trebui
conectat la Vcc printr-un filtru trece -jos.
AREF :AREF este pinul de referina analogica pentru Convertorul A/D

1.3.Organizarea memoriei:
ATmega 16 AVR are dou spaii de memorie principal, spaiul pentru Memoria de Date
i pentru Memoria de Program. n plus, ATmega16 are i o memorie nevolatil EEPROM
pentru memorarea datelor. Toate cele trei tipuri de memorie sunt cu adresare liniar.
ATmega 16 conine o memorie flash reprogramabil (In-system On-chip) de 16 Ko
pentru programe. Deoarece toate comenzile pentru AVR sunt de 16 i 32 bii, Flash-ul este
organizat ca 8Kx16. Pentru securitatea software-ului , spaiul pentru memoria de programe
Flash este mparit n doua seciuni: seciunea de program boot i seciunea pentru programe
de aplicaie.
Memoria Flash suport cel putin 10000 de cicluri de scriere/ tergere. Counter-ul
programului de la ATmega 16 (PC) are o lungime de 13 bii, ceea ce permite adresarea unei
memorii de 8*1024 locaii de 16 bii.
1.4.Memoria de date SDRAM:
Figura de mai jos arat cum este organizat memoria SDRAM ATmega 16. Primele 96 de
locaii se refer la Fiierul de Registre, i urmatoarele 1024 de locaii sunt dedicate datelor
interne SDRAM.
Registrele generale 26, 27, 28, 29, 30, 31 pot fi utilizate cu denumiri specifice:
R26: X octet inferior R27: X octet superior
R28: Y octet inferior R29: Y octet superior
R30: Z octet inferior R31: Z octet superior

1.5.Porturile I/O
Toate porturile AVR , utilizate ca porturi digitale I/O ndeplinesc funciile de
citire/scriere i pot fi modificate.Cu instruciunile SBI i CBS direcia unui port-pin poate fi
schimbat fr ca acest lucru s afecteze ceilali pini.Aceste caracteristici se pstreaz i n
cazul modificrii valorii de driver(dac este configurat ca o ieire) sau de activare/dezactivare
dac rezistorii sunt dezactivai(dac este configurat ca o intrare).Fiecare buffer de ieire are
caracteristici de drive simetrice cu ambele capaciti ale sursei.Pinul driver-ului are suficient
putere pentru o afiare direct.Toi pinii porturilor au fiecare rezistori de pull-up selectabili cu
rezerve de putere.Toi pinii I/O au diode de protecie la ambele surse de curent digitale si
mpmntare.
Fiecare port este alctuit din trei regitrii : DDxn, PORTxn,i PINxn.biii DDxn sunt
adresai de DDRx I/O , biii PORTxn sunt adresai de PORTx I/O , biii PINxn sunt adresai
de PINx I/O.
Bitul DDxn din registrul DDRx selecteaz direcia acestui pin.Dac DDxn este setat 1
logic atunci Pxn este configurat ca pin de ieire.Daca DDx este setat 0 logic Pxn este
configurat ca pin de intrare.
Daca PORTxn este configurat 1 logic atunci cnd pinul este setat ca pin de intrare ,
rezistorul pull-up este activat.Pentru ca rezistorul pull-up sa treac n poziia off , PORT xn
trebuie s fie setat n 0 logic sau pinul trebuie s fie configurat ca un pin de ieire.Atunci
cnd funcia Reset devine activ,portul pinilor are trei stri,chiar dac ceasul nu funcioneaz.
Dac PORTxn este configurat 1 logic atunci cnd pinul este setat ca pin de ieire portul
pinilor este unu. Dac PORTxn este setat 0 logic atunci cnd pinul este configurat ca pin de
ieire portul pinilor este zero.
La schimbarea ntre cele trei stri ({DDxn, PORTxn} = 0b00) i ieirea pe nivel nalt
({DDxn,PORTxn} = 0b11), o stare intermediar cu posibilitatea pull-up ({DDxn, PORTxn}
=0b01)sau ieirea la nivel sczut ({DDxn, PORTxn} = 0b10) trebuie sa apar.n mod normal
posibilitatea strii de pull-up este total acceptat,la fel cum o impedan nalt nu va sesiza
diferena ntre un driver puternic i un pull-up.Dac nu se ntmpl acest lucru bitul PUD n
registrul SFIOR poate fi setat pentru dezactivarea tuturor pull-ups din toate porturile.
Schimbul dintre o intrare cu pull-up i o ieire cu nivel sczut va genera aceeai
problem.Utilizatorul trebuie s foloseasc oricare din cele trei stri ({DDxn, PORTxn} =
0b00) sau ieirea de nivel nalt ({DDxn, PORTxn} = 0b11) ca o etap intermediar.

Tabelul rezum controalele semnalelor pentru valorile pinilor :

1.6.Sistemul de intreruperi:
O intrerupere reprezinta un semnal sincron sau asincron de la un periferic ce
semnalizeaza aparitia unui eveniment care trebuie tratat de catre procesor. Tratarea
intreruperii are ca efect suspendarea firului normal de executie al unui program si lansarea in
executie a unei rutine de tratare a intreruperii (RTI). Intreruperile hardware au fost introduse
pentru a se elimina buclele pe care un procesor ar trebui sale faca in asteptarea unui
eveniment de la un periferic. Folosind un sistem de intreruperi, perifericele pot atentiona
procesorul in momentul producerii unei intreruperi (IRQ), acesta din urma fiind liber sa-si
ruleze programul normal in restul timpului si sa isi intrerupa executia doar atunci cand este
necesar.
Inainte de a lansa in executie o RTI, procesorul trebuie sa aiba la dispozitie un mecanism
prin care sa salveze starea in care se afla in momentul aparitiei intreruperii. Aceasta se face
prin salvarea intr-o memorie, de cele mai multe ori organizata sub forma unei stive, a
registrului contor de program (Program Counter), a registrelor de stare precum si a tuturor
variabilelor din program care sunt afectate de executia RTI. La sfarsitul executiei RTI starea
anterioara a registrelor este refacuta si programul principal este reluat din punctul de unde a
fost intrerupt.
Pentru a asocia o intrerupere cu o anumita rutina din program, procesorul foloseste tabela
vectorilor de intrerupere (TVI). Fiecarei intreruperi ii este asociata o adresa la care programul
va face salt in cazul aparitiei acesteia. Aceste adrese sunt predefinite si sunt mapate in
memoria de program intr-un spatiu contiguu care alcatuieste TVI. Adresele intreruperilor in
TVI sunt setate in functie de prioritatea lor, cu cat adresa este mai mica cu atat prioritatea este
mai mare.
Pentru ATMega16, TVI este data in tabelul de mai jos:

Intreruperile pot fi activate sau dezactivate de utilizator in


program prin setarea individuala a bitilor de interrupt enable
pentru fiecare periferic folosit si prin setarea flagului de
Global Interrupt Enable (I) din Status Register (SREG).

Tratarea unei intreruperi pentru ATMega16 se face ca in


figura alaturata. Sa presupunem ca programul nostru primeste
intreruperea externa INT0 in timp ce executa instructiunea ldi
R16,0xFF. Dupa efectuarea instructiunii, registrul contor program (PC) este automat salvat in
stiva si apoi initializat la valoarea corespunzatoare adresei lui INT0 ($002). Acest lucru se
traduce prin saltul programului de la adresa curenta ($123) la adresa $002. Aici, programul
gaseste instructiunea jmp $2FF care-i permite sa sara la rutina efectiva de tratare a
intreruperii. La sfarsitul oricarei RTI trebuie sa existe instructiunea reti care reface din stiva
registrul PC (programul sare inapoi la adresa de unde ramasese inainte de intrerupere).
In timpul executiei unei intreruperi, bitul I din SREG este setat la 0 si resetat la iesire,
adica orice alta intrerupere care poate aparea in timpul intreruperii curente nu va fi luata in
seama. Cu toate acestea, utilizatorul poate sa reseteze bitul I din software, permitand astfel
executia de intrerupere in intrerupere.

1.7.Subrutina
n informatic, o subrutina este o poriune de cod ncadrul unui program mai larg, care
incepe cu o eticheta,care tot odata este si numele subrutinei. O subrutin este adesea
codificata astfel nct s poat fi pornit , de mai multe ori i / sau din mai multe locuri n
timpul executie simpla a programului, inclusiv din alte subrutine, iar apoi filiala din spate
(retur). Subrutinele sunt un instrument de programare puternic, i sintaxa de multe limbaje de
programare include suport pentru scriere ifolosire.Subrutine, sunt colectate n biblioteci, sunt
un mecanism important pentru schimbul de informaii .

1.8.Modulul Timer/Counter0 pe 8 biti


Modulul Timer/Counter pe 8 biti poate fi utilizat pentru realizarea de temporizari,
numararea de evenimentelor externe sau generarea de forme de unda. Dintre cele mai
importante caracteristici se pot mentiona:
- Un prag independnt de comparatie
- Poate numara impulsuri externe
- Posibilitate de autoinitializare
- Posibilitate de generare a semnalelor Pulse Width Modulation (PWM)
Schema bloc a modulului Timer/Counter0 pe 8 biti:

Registrii alocati acestui timer pot fi impartiti in trei mari categorii:


- Registrul de numarare : TCNT0
- Registrul de comparare: OCR0
- Registrii de comanda si control: TCCRO, TIMSK, TIFR
Modurile principale de functionare a Timer/Counter0 sunt:
- Functionare normala
- Re-initializare la atingerea valorii de prag (CTC)
- Semnal PWM rapid
- Semnal PWM corect in faza
Bitii care selecteaza modul de functionare se regasesc in registrul TCCR0.

Toate regimurile de functionare se bazeaza pe incrementare/decrementare registrului de


numarare TCNT0. Frecventa de incrementare/decrementare este controlata de combinatia
bitilor CS00, CS01, CS02 din registrul TCCR0 conform tabelului de mai jos ( cu fosc este
notat frecventa ceasului microcontrolerului).

CS02 CS01 CS00 Frecventa de inc/dec


0 0 0 Timer oprit
0 0 1 fosc/1
0 1 0 fosc/8
0 1 1 fosc/64
1 0 0 fosc/256
1 0 1 fosc/1024
1 1 0 Frecventa semnalului de pe pinul T0,
frontul descendent
1 1 1 Frecventa semnalului de pe pinul T0,
frontul ascendent

Unitatea timer compara in permanenta valoarea registrului TCNT0 cu valoarea registrului


OCR0. In modurile de functionare normala si re-initializare la atingerea valorii de prag,
valoarea 1 a bitului OCIE din registrul TIMSK determina generarea unei intreruperi cand
TCNT0 atinge valoarea registrului de prag OCR0.
1.9.Modulul de conversie A/D
Modulul de conversie A/D (ADC analog digital converter) permite transformarea
semnalelor analog aplicate pe anumiti pini ai controlerului in valori numerice. Principalele
caracteristici sunt:
- Modul de lucru pe baza de aproximatii succesive
- Alimentare separata pe pinul AVCC
- Viteza maximala de 15 kSPS
- Rezolutie de 10 biti
- 8 canale multiplexate ADC0...ADC7 corespunzatoare pinilor PA0...PA7
- Rezultatul conversiei poate fi aliniat la stinga simplificand calculele cu pretul
reducerii rezolutiei la 8 biti
- Poate genera intreruperea la finalizarea conversiei
- Se pot selecta trei tipuri de nivele de referinta
- Se pot selecta mai multe surse pentru initierea unei conversii incluzind un mod de
functionare permanenta.
Schema bloc a modului ADC:

Rolul oricarui modul de conversie A/D este de a transforma o tensiune analogica in


valoare numerica. Cele mai importante elemente care definesc aceasta transformare sunt
valoarea tensiunii de referinta si rezolutia convertorului. Astfel, rezolutia stabileste numarul
maxim de trepte in care se poate cuantiza tensiunea de intrare iar tensiunea de referinta
stabileste valoarea maxima a tensiunii de intrare.
Daca notam cu N rezolutia si Vref tensiunea de referinta atunci trapta unui convertor
A/D sau 1 LSB se defineste ca: 1 LSB = Vref / 2N (V).
Valoarea treptei se exprima in volti si in functie de aceasta si rezultatul conversiei C, se
poate afla tensiunea de intrare in convertor Vin dupa relatia: Vin = C * 1 LSB (V).
Valoarea maxima a tensiunii de intrare care poate fi masurata este intotdeuna Vref 1
LSB.
Modulul ADC din Atmega16 poate avea trei surse de referinta:
- Valoarea de pe pinul AVCC
- Valoarea de pe pinul AREF
- O tensiune generata intern cu valoarea 2,56V
Pentru a comanda si a utiliza modulul ADC, trebuie de initializat urmatorii registri:
- Registrii ADCL si ADCH pentru stocarea rezultatului unei conversii
- Registrii generali de configurare: ADMUX si ADCSRA
- Registrul special de configurare SFIOR, utilizat si de alte module ale controlerului
La finalul unei conversii rezultatul acesteia se va regasi in registrii ADCH si ADCL. In
mod normal se citeste mai intii ADCL si apoi ADCH pentru a utiliza precizia completa de 10
biti.
Convertorul poate masura tensiunea aplicata pe oricare din cele opt canale reprezentate
de pinii ADC0...ADC7 dar nu simultan. De aceea numai unul dintre acestea va fi activ la un
moment dat selectia realizinduse pe baza unuor biti din registrul ADMUX. Trebuie de avut in
vedere ca acesti biti pot fi oricand modificati insa la nivel hardware selectia unui nou canal se
face imediat numai daca nici o conversie nu este in desfasurare. Altfel selectia se va realiza
dupa ce se termina conversia curenta.
Registrul ADMUX:

ADCL si ADCH in cazul alinierii la dreapta a rezultatului conversiei

ADCL si ADCH in cazul alinierii la stinga a rezultatului conversiei

Registrul ADCSRA:

Bitii 5 (ADTS0), 6 (ADTS1), 7 (ADTS2) din registrul SFIOR selecteaza evenimentul


care declanseaza o noua conversie in modul de functionare automat (ADATE = 1). Aceste
evenimente sunt defapt semnale de intrerupere si utilizarea lor va determina activarea flagului
corespunzator. Acesta trebuie sa fie dezactivat dupa ce sa realizat o conversie pentru a permite
o noua autodeclansare la respectivul eveniment.
1. Schema Electrica

Descrierea sistemului de ampermetru dispozitivului

Dispozitivul se compune din:

- Microcontroller AVR ATMega16 U1, aici are loc conversia de tensiune analogice care se
da la intrarea la ADC care converteaza in forma digitala,conversia pe un segment digital de
cod 7, precum i generarea semnalului PWM care este necesar pentru amplificatorul de
putere de tensiune care culege curentul de pe acesta.
- U2 amplificator de semnal pentru a amplificatorului operaional 741, amplifica semnalul de
indicatorul de curent R1

Scurt descriere amudului de functionare:

De la o surs de alimentare extern BAT1 RV3 de sarcin i un amperimetru de control se


transmite la SH1(unt 1) unde are loc cdere de tensiune proporional cu curentul pe o
rezistenta variabila RV3,Semnalul slab de pe unt este luat si amplificat cu amplificatorul
U2,unde coeficientul amplificariieste determinat prin raportul a doua rezistoare R2 i R3 .R1
este necesar pentru balansarea amplificatorului,De la iesirea amplificatorului,tensiunea
ajunge la pinul PA0 a ADC-ului a microcontrolerului.Apoi semnalul prelucrat este transmis la
un afisor de cod-7 segmente.

Fiecare segment al display-ului este de fapt un LED, notat cu o liter de la a la g.


Combinnd n mod convenabil segmentele care lumineaz se poate afia orice cifr de la 0 la
9. De exemplu pentru a afia numrul 3 se
aprind simultan LED-urile a,b,c,d i g. n
figura data este prezentat un afiaj cu 7
segmente i punct zecimal realizat din 8
LED-uri cu catodul comun.Pentru ca un
segment al unuia din cele 4 afioare sa fie
aprins trebuie ca, in acelai moment de
timp, linia comuna de segment sa fie
comandata in 0 si comanda de anod
individuala sa fie in 1.

Schema bloc
Listingul programului
.include"m16def.inc"; se include fisierul de descriere a controlerului
.def temp=r16
.cseg
.org 0x000 ;vectorul intreruperii RESET
rjmp start
.org 0x012 ;vectorul intreruperii TIMER0
rjmp timer0_isr
.org 0x01c ;vectorul intreruperii ADC Complete
rjmp adc_complet
;################################################
;Programul principal
;################################################

.org 0x030 ;setam o adresa mai mare de 20 pentru


;a fi siguri ca am iesit din vectorii
;de intreruperi
;================================================
;Rutina de initializare
;================================================
start:
ldi temp,high(RAMEND) //init stiva
out SPH,TEMP
ldi temp,low(RAMEND) //init stiva
out SPL,TEMP

call port_init
call adc_init
call timer_init
sei //activarea globala a intreruperilor
;================================================

;================================================
;Ciclul Principal
;Aici se asteapta declansarea unei intreruperi:
;ADC sau Timer
;================================================
main:
nop
rjmp main
;================================================

;################################################

;################################################
;Prelucrarea Intreruperilor
;################################################

;================================================
;Intreruperea ADC
;================================================
adc_complet:
in R27, ADCH
in R26, ADCL
call adc2rez
call separate
reti
;================================================

;================================================
;Intreruperea Timer
;================================================
timer0_isr:

push r16
mov r16,r9
T1: cpi r16,0x01
brne T2
out PORTD,r16
out PORTC,r10
lsl r16
rjmp end
T2: cpi r16,0x02
brne T3
out PORTD,r16
out PORTC,r11
lsl r16
rjmp end
T3: cpi r16,0x04
brne T4
out PORTD,r16
out PORTC,r12
lsl r16
rjmp end
T4: cpi r16,0x08
brne T
out PORTD,r16
out PORTC,r13
T: ldi r16,0x01
rjmp end

end:mov r9,r16
pop r16
reti
;================================================
;################################################

;################################################
;Initializarile
;################################################

;================================================
;Initializarea Porturilor
;================================================
port_init:
clr temp
out PORTA,temp
out DDRA,temp
out PORTB,temp
out PORTC,temp
out PORTD,temp
out DDRD,temp

ser temp
out DDRB,temp
out DDRC,temp
ret
;================================================

;================================================
;Initializarea ADC-ului
;================================================
adc_init:
clr temp ;ADCH - 2 biti, AREF
out ADMUX,temp ;intrarea 0 port A
ldi temp,0xEB ;ADEN, ADSC
out ADCSRA,temp ;prescaler CK/8, ADIE,
ret
;================================================

;================================================
;Initializarea Timer-ului
;================================================
timer_init:
ldi temp, 0xB5
out TCNT0, temp
ldi temp, 0x04 ;start timer
out TCCR0, temp ;prescaler CK/256
ldi temp, 0x01
out TIMSK, temp ;TCOIE
ret
;================================================
;################################################

;################################################
;Functiile principale
;################################################
;================================================
;Conversia valorii ADC in Ohmi
;================================================
adc2rez:
mov r14,r16 ;
mov r15,r17 ;
ldi r16,0xFF ;verificam daca nu a fost
mov r2,r16 ;intrecuta limita de masurare
mov r16,r14 ;egala cu 511 a valorii ADC
ldi r17,0x01 ;
mov r3,r17 ;
mov r17,r15 ;
cp R26,r2 ;
cpc R27,r3 ;
brlo next ;
ldi YH,0x00 ;
ldi YL,0x01 ;
ret
next:
mov r14,r16 ;rez=(2000*1023)/(1023-ADC)
mov r15,r17 ;
ldi r16,0xFF ;rez=(7D0*3FF)/(3FF-ADC)
mov r2,r16 ;
mov r16,r14 ;rez=(1F3830)/(3FF-ADC)
ldi r17,0x03 ;
mov r3,r17 ;
mov r17,r15 ;
sub r2,r26 ;3FF-ADC
sbc r3,r27 ;

movw r20,r2
clr r19
ldi r16,0x30
ldi r17,0x38
ldi r18,0x1F
call division
ldi r18,0x07
subi r16,0xD0
sbc r17,r18
mov YL,r16
mov YH,r17
ret
;================================================

;================================================
;Conversia valorii Y in Ohmi in cod 7 segmente
;================================================
dec27seg:
L0: cpi r23,0x00
brne L1
ldi r24,0b11000000
ret
L1: cpi r23,0x01
brne L2
ldi r24,0b11111001
ret
L2: cpi r23,0x02
brne L3
ldi r24,0b10100100
ret
L3: cpi r23,0x03
brne L4
ldi r24,0b10110000
ret
L4: cpi r23,0x04
brne L5
ldi r24,0b10011001
ret
L5: cpi r23,0x05
brne L6
ldi r24,0b10010010
ret
L6: cpi r23,0x06
brne L7
ldi r24,0b10000010
ret
L7: cpi r23,0x07
brne L8
ldi r24,0b11111000
ret
L8: cpi r23,0x08
brne L9
ldi r24,0b10000000
ret
L9: cpi r23,0x09
brne L
ldi r24,0b10010000
ret
L: ldi r24,0b11000000
ret
;================================================

;================================================
;Separarea valorii in Ohmi in 4 cifre aparte
;Daca Y=1789, atunci r10=9,r11=8,r12=7 si r13=1
;================================================
separate:
call appnot

mov r13,r24
call appnot

mov r12,r24

call appnot
andi r24, 0x7f
mov r11,r24

call appnot
mov r10,r24
ret

appnot:
movw r16,YL
clr r18
clr r19
clr r21
ldi r20,0x0A
call division
mov r23,r18
call dec27seg
movw YL,r16
ret

;================================================

;================================================
; Impartirea fara semn a unui nr de 4 bytes
; la un nr. de 2 bytes
;================================================
;
; Parametri:
;; R19:R16 - ceea ce impartim
; R21:R20 - la ce impartim
;
; Rezultatul returnat:
; C=1 - eroare
; C=0 - impartire corecta
; R17:R16 - partea intreaga
; R19:R18 - restul
;
; Registrii care variaza: R16-R19, R22

division:
ldi R22, 17
cp R21, R19
brcs _DWRet
brne _DW10
cp R18, R20
brcc _DWCS
clc
_DW10: rol R16
rol R17
dec R22
breq _DWRet
rol R18
rol R19
brcs _DW20
sub R18, R20
sbc R19, R21
brcc _DW30
add R18, R20
adc R19, R21
clc
rjmp _DW10
_DW20: sub R18, R20
sbc R19, R21
_DW30: sec
rjmp _DW10
_DWCS: sec
_DWRet: ret
;================================================
;################################################

Comenzile utilizate:

LDI-incarcarea constantei
BRNE-salt daca nu este egalitate
CPI-compara cu o constanta
RJMP-salt relativ la k
BREQ-salt la egalitate
SBC-scadere cu transport
SUB-scadere fara transport
BRCC-salt daca transportul este sters
CPC-compara cu bitul de transport
CP-comparare
RET-returnare din subrutina
RETI-returnare din intrerupere
INC-incrementare
RCALL-salt relativ la subrutina
MOV-copierea registrului
BRLO-sare daca este mai mic
ST(x+)-Stoceaz indirect apoi post incrementare
ST(x-)-Stocheaza indirect apoi pre decrementare
ADD-adunarea aritmetica fara transport
ADC-adunare cu transport
RET-returnare din subrutina
CLR-curatirea registrului
Out-Stocheaz datele din registru n Portul I/O
Concluzii:
n aceast lucrare am proiectat un amperimetru digital. L-am implementat pe un
microcontroler Atmega16 dar programul este compatibil si cu alte MC din aceasta familie(de
exemplu Atmega8). Am utilizat modulul ADC pentru detectarea nivelului semnalului de
intrare si modulul TIMER pentru afisare.

In urma efecturii acestui proiect am facut cunostinta in profunzime cu implementarea si


determinarea algoritmilor necesari, precum si reuniunea acestor algoritmi.

Bibliografie:

1.M.Mitescu I.Susnea "Microcontrollers in practice"


2.Jhon Morton "Microcontrolere AVR"
3.www.alldatasheet.com - Datasheet Atmega16
4.http://radiokot.ru/start/mcu_fpga/avr/

S-ar putea să vă placă și