Documente Academic
Documente Profesional
Documente Cultură
Facultatea CIM
Catedra Microelectronica si Dispozitive Semiconductoare
la Microprocesoare si interfete
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:
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.
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:
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 .
Registrul ADCSRA:
- 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
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
;################################################
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.
Bibliografie: