Sunteți pe pagina 1din 17

Cuprins:

1. Rezumat

2. ntroducere

3. Fundamentare teoretic
3.1. Prezentarea microcontrorului Atmega16
3.2. Prezentarea modulului periferic Taimer

3.3. Prezentarea modulului de conversie A/D


3.4. Prezentarea dispozitivelor folosite

4. Proiectare i implimentare

5. Rezultate experimentale

6. Concluzii

7. Bibliografie

2
1. Rezumat
Scopul acestui proiect de an este de a modela cu ajutorul unui microcontrolerului i circuitului
electric funcionarea unui termostat, care menine o anumit temperatur a unui obiect nclzit.

2. ntroducere

n atingerea scopului vom folosi microcontrolerul Atmega16 produs de firma Atmel. n special
vom folosi portul A care are ca funcie adugtoare Convertorul Analog Digital (ADC). Semnal ce va
fi prelucrat de ADC va fi transmis la porturile de ieire B i C conectate cu un afior de 4 cifre, care
va afia temperatura. La portul D, care este deasemenea de iesire, face conexiunea cu circuitul electric
ce este format din elementul nclzitor i de rcire. De asemenea avem nevoie de un ntreruptor
electronic, care permite de a conecta sau deconecta elementului de nclzire de la sursa de tensiune i
de un amplificator operaional folosit ca un bufer.

3. Fundamentare teoretic

3.1. Prezentarea microcontrorului Atmega16

ATmega 16 este un microcontroler CMOS de 8biti 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.

Caracteristicile principale ale acestuia sunt:

1) 16KB de memorie Flash reinscriptibil pentru stocarea programelor;


2) 1KB de memorie RAM;
3) 512B de memorie EEPROM;
4) dou numrtoare/temporizatoare de 8 biti;
5) un numrtor/temporizator de 16 biti;
6) conine un convertor analog digital de 10 biti, cu intrri multiple;
7) conine un comparator analogic;
8) conine un modul USART pentru comunicaie serial (port serial);
9) dispune de un cronometru cu oscilator intern;
10) ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).

Structura intern general a controlerului conine o magistral general de date la care sunt
conectate mai multe module:
1) unitatea aritmetic si logic (ALU);
2) registrele generale;
3) memoria RAM si memoria EEPROM;
4) liniile de intrare (porturile I/O Lines) si celelalte blocuri de intrare/iesire.
Memoria Flash de program mpreun cu ntreg blocul de extragere a instruciunilor, decodare si
execuie comunic printr-o magistral proprie, separat de magistrala de date menionat mai sus.
Acest tip de organizare este conform principiilor unei arhitecturi Harvad si permite controlerului s
execute instruciunile foarte rapid.

Modul Power-down salveaza continutul registrelor, dar blocheaza Oscilatorul, dezactivand toate
celelalte functii al chip-ului pana la urmatoarea Intrerupere Externa sau Reset hardware. In modul

3
Power-save, timer-ul asincron continua sa mearga, permitind userului sa mentina o baza de timp in
timp ce restul dispozitivului este oprit.

In modul Stand-by , oscilatorul functioneaza in timp ce restul despozitivului este oprit. Acest
lucru permite un start foarte rapid combinat cu un consum redus de energie. In modul stanby
extins(Extended Stanby Mode), atat oscilatorul principal cat si timer-ul asincron continua sa
functioneze.

Memoria flash (On-chip) permite sa fie reprogaramata printr-o interfata seriala SPI , de catre un
programator de memorie nonvolatila conventional, sau de catre un program de boot On-chip ce
ruleaza pe baza AVR. Programul de boot poate folosi orice interfata, sa incarce programul aplicatie in
memoria Flash de aplicatie. Combinand un CPU RISC de 8 biti cu un Flash In-system auto
programabil pe un chip monolithic, ATmega 16 este un microcontroler puternic ce ofera o solutie
extrem de flexibila si cu un cost redus in comparatie cu multe altele de pe piata. ATmega 16 AVR este
sustinut de o serie completa de instrumente de program si de dezvoltare a sistemului, care include:
compilatoare C, macroasambloare, programe debug- simulare etc.

Figura 1: Structura general a microcontrolerului ATmega16

ATmega16 conine 32 de registre de uz general si 64 de registre speciale pentru modulele I/O.


Aceste registre sunt mapate la adrese din memoria RAM cuprinse ntre 0000h si 005Fh.

ATmega16 dispune de 32 de linii de I/O grupate n 4 porturi de 8 bii. Porturile sunt denumite
cu literele A, B, C i D. Fiecare pin al oricrui port se poate seta individual ca intrare sau ieire fr s
afecteze ceilali pini. n plus, anumii pini se pot utiliza pentru funcii speciale ale microcontrolerului.
n figura 2 este prezentat structura general a unui pin.
Toi cei 32 de pini au fiecare cte o rezisten pull - up care poate fi activat sau dezactivat.

4
Figura 2: Structura general a unui pin

Operaiile cu porturile se fac prin intermediul unui set de trei regitri alocai fiecrui port:
PORTx, PINx i DDRx; x poate fi A, B, C sau D. Aceti registri fac parte din categoria de regitri de
intrare/ieire, de aceea instruciunile care pot lucra direct cu ei sunt CBI, SBI, IN i OUT.

Descrierea pinilor

Port A (PA7 .. PA0) serveste drept port de intrari analogice pentru Convertorul A/D si ca un port
bidirectional I/O de 8 biti, in cazul in care Convertorul A/D nu este folosit. Pinii de port pot fi
conectati optional la VCC prin rezistori interni, (selectati pentru fiecare bit). Buffer-ele de iesire ale
Portului A au caracteristici de amplificare .

Port B (PB7.. PB0) este un port I/O de 8 biti bidirectional cu rezistori interni (optionali).
Buffer-ele de iesire ale Port-ului B au caracteristici de amplificare. Port-ul B indeplineste de
asemenea functii speciale ale microcontrolerului ATmega 16.

Port C (PC7PC0) este un port I/O de 8 biti bidirectional cu rezistori interni (optionali).
Indeplineste functii ale interfetei JTAG si alte functii speciale ale ATmega 16. Daca interfata JTAG
(de depanare) este activata , rezistorii pinilor PC5(TDI), PC3(TMS) si PC2(TCK) vor fi activati, chiar
daca are loc o resetare. Buffer-ele de iesire ale Port-ului C au caracteristici de amplificare.

Port D (PD7PD0) este un port I/O de 8 biti bidirectional cu rezistori interni conectati
optional la VCC (selectati pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de
amplificare. Port-ul D indeplineste de asemenea functii speciale ale ATmega 16.

3.2. Prezentarea modulului periferic Taimer

Timerul/Counterul, dupa cum ii spune si numele ofera facilitatea de a masura intervale fixe de
timp si de a genera intreruperi la expirarea intervalului masurat. Un timer, odata initializat va
functiona independent de unitatea centrala. Acest lucru permite eliminarea buclelor de delay din
programul principal.

Principiul de functionare a unui Timer poate fi descris in linii mari de cele trei unitati:

1) Registrul numarator (Timer Counter, TCNT) care masoara efectiv intervalele de timp si
care este incrementat automat cu o frecventa data.

2) Avand ceasul intern sau alt ceas conectat pentru a obtine diferite intervale folosim un
Prescaler. Acesta are menirea de a diviza in functie de necesitatile aplicatiei frecventa
de ceas si odata cu divizarea sa incrementeze registrul TCNT.
5
3) La fiecare incrementare a TCNT are loc o comparatie intre acest registru si o valoare
stocata in registrul OCRn. Aceasta valoare poate fi incarcata prin software de utilizator.
Daca are loc egalitatea se genereaza o intrerupere, in caz contrar intrementarea continua.

Timerele sunt prevazute cu mai multe canale astfel in paralel se pot desfasura diferite numaratori.
ATmega16 este prevazut cu 3 unitati de timer: doua de opt biti si una de numarare pe saisprezece
biti.

Registri TCNT1, OCR1A/B si ICR1 sunt toate registre de 16 biti. Proceduri speciale trebuie
urmate cand se acceseaza registre de 16 biti.

Registrele de control T/C(TCCR1A/B) sunt registrei de 8 biti si nu au restrictii de acces


CPU.Semnalele de cerere de intrerupere sunt vizibile la TIFR (Registrul semnal de intrerupere timer).
Toate intreruperile sunt mascate individual in TMISK, TIFR si TMISK( nu sunt prezentati in figura
deoarece aceste registre sunt folosite si de alte unitati timer). T/C poate fi masurat intern , prin
intermediul prescalei, sau de catre o sursa externa de ceas la pinul T1. Block-ul logic de selectare a
ceasului controleaza ce sursa de ceas sau limita de T/C se utilizeaza pentru a creste(sau a descreste)
valoarea sa. T/C este inactiv cand nu este selectata nici o sursa de ceas. Output-ul de la selectarea
logica a ceasului este numita cronometrarea ceasului(clkT1).

Registrele de comparare ale output-ului cu buffere duble (OCR1A/B) sunt comparate cu


valoarea T/C in permanenta. Rezultatul comparatiei poate fi folosit de catre Generatorul de Unde
pentru a genera un PWM sau o frecventa variabila de output la pinul de Comparare a Output-
ului(OC1A/B). Operatia de comparare va seta si semnalul de potrivire-comparare (OCF1A/B) care
poate fi folosit pentru a genera o cerere de intrerupere de comparare output.

Registrul de captura input poate captura valoarea T/C la o comanda data extern fie pe pinul de
captura input sau pe pinii analog de comparatie. Unitatea de captura imput include o unitate de filtru
digitala pentru a micsora posibilitatile de interferenta a zgomotului.

3.3. Prezentarea modulului de conversie A/D


Modulul de conversie A/D (ADC - Analog lo Digilal Converter) permite transformarea
semnalelor analogice aplicate pe anumii pini ai microcontrolerului n valori numerice. n Figura 1
este prezentat schema bloc a modulului ADC.
Principalele lui caracteristici sunt:
-mod de lucru pe baz de aproximaii succesive
-alimentare separat pe pinul AVCC
-vitez maxim de 15kSPS
-rezoluie de 10 bii
-8 canale multiplexate, ADC0...ADC7 corespunztoare pinilor PA0...PA7
-rezultatul conversiei poate fi aliniat la stnga, simplificnd calculele cu preul reducerii
rezoluiei la 8 bii
-poate genera ntrerupere la finalizarea conversiei
-se pot selecta trei tipuri de nivele de referin
-se pot selecta mai multe surse pentru iniierea unei conversii, incluznd un
mod de funcionare permanent

6
Figura 3: Schema bloc a modulului ADC

Rolul oricrui modul de conversie A/D este de a transforma o tensiune analogic ntr-o valoare
numeric. Cele mai importante elemente care definesc aceast transformare sunt valoarea tensiunii de
referin i rezoluia convertorului. Astfel, rezoluia stabilete numrul maxim de trepte n care se
poate cuantiza tensiunea de intrare iar tensiunea de referin stabilete valoarea maxim a tensiunii de
intrare.
Dac notm cu N rezoluia i Vref tensiunea de referin, atunci treapta unui convertor A/D sau
1 LSB se definete ca:
1 LSB = Vref/2N (V)
Valoarea treptei se exprim n voli i n funcie de aceasta i rezultatul conversiei C, se poate
afla tensiunea de intrare n convertor Vin pe baza relaiei:
Vin = C*l LSB(V)
Valoarea maxim a tensiunii de intrare care poate fi msurat este ntotdeauna Vrer - 1 LSB.
Modulul ADC din ATmegal6 poate avea trei surse ca tensiune dc referin:
- valoarea de pe pinul AVCC
- valoarea de pe pinul AREF
- o tensiune generat intern cu valoarea de 2.56V
Pentru a comanda i a utiliza modulul ADC, programatorul are la dispoziie un numr de
regitrii care pot fi grupai in urmtoarele categorii:
- regitrii ADCL i ADCH pentru stocarea rezultatului unei conversii
- regitrii generali de configurare: ADMUX i ADCSRA
7
- registrul special de configurare SFIOR, utilizat i de alte module ale microcontrolerului.

Configurarea i utilizarea modulului de conversie A/D

La finalul unei conversii, rezultatul acesteia se va regsi n regitrii ADCH i ADCL. n mod
normal, se citete mai nti ADCL i apoi ADCH pentru a utiliza precizia complet de 10 bii. Cu
toate acestea, dac s-a configurat alinierea rezultatului la stnga (Figura 4), utilizatorul poate citi
numai registrul ADCH obinnd astfel o valoare mai uor de prelucrat dar care corespunde unei
precizii a convertorului de numai 8 bii.
Convertorul poate msura tensiunea aplicat 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,
selecia realizndu-se pe baza unor bii din registrul ADMUX. Trebuie avut n vedere c aceti bii pot
fi oricnd modificai dar, la nivelul hardware, selecia unui nou canal se face imediat numai dac nici
o conversie nu este n desfurare. Altfel, selecia se va realiza dup ce se termin conversia curent.
Regitrii utilizai pentru configurare sunt ADMUX, ADCSRA i SFIOR. O descriere general a
biilor registrului ADMUX este dat n tabelul de mai jos:

Pozitia Denumirea bitului Descriere


bitului
Sursa tensiunii
7 REFSI REFSI REFS0
de referin
0 0 AREF
0 1 AVCC
6 REFSO
1 0 Ncutiluat
1 1 2,56V inleni
Valoarea 0 determin alinierea la dreapta a
rezultatului conversiei, aa cum se poate vedea n
5 ADLAR
Figura 3. Valoarea 1 determin alinierea la stnua a
rezultatului conversiei, ca n Figura 4.
4 MUX 4
3 MUX3
Combinaia acestor biti selecteaz canalul de
2 MUX2
intrare pentru ADC.
1 MUX1
o MUXO

- - - - - - ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0

Figura 4: ADCH i ADCI. n cazul alinierii Ia dreapta a rezultatului conversiei

ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2


ADC1 ADC0 - - - - - -

Figura 5: ADCH i ADCI. n cazul alinierii Ia stnga a rezultatului conversiei


8
O descriere general a biilor registrului ADCSRA este dat n tabelul de mai jos. Utilizatorul
trebuie s acorde atenie mai ales biilor ADPS0...ADPS2 care stabilesc frecvena ceasului
convertorului funcie de frecvena de tact a procesorului, f osc. Astfel, convertorul are nevoie de un semnal
de tact cuprins ntre 50kHz i 200kHz pentru a funciona corect.
Poziia
Denumirea bitului Descriere
bitului
Acest bit trebuie s fie 1 pentru ca modulul ADC s
7 ADEN
funcioneze. Altfel, acesta este oprit
Cnd acest bit devine 1 se iniiaz nceperea unei
6 ADSC
conversii
Cnd acest bit este 1, dup o prim conversie
iniial dc utilizator, convertorul va realiza automat
5 ADATE
alte conversii n funcie de evenimentele selectate n
registrul SFIOR
4 ADIF Acest bit devine 1 la terminarea unei conversii
Valoarea 1 activeaz ntreruperea la finalizarea
3 ADIE
conversiei
2 A D PS : A0PS2 ADPSI ADPSO Censul A DC
0 0 0 fosc/2
0 0 1 fosc/2
ADPSI 0 1 0 fosc/4
1
0 1 1 fosc/8
1
1 0 fosc/16
1 0 1 fosc/32
ADPSO 1 1 0 fosc/64
0
1 1 1 fosc/128

Biii 5 (ADTS0), 6 (ADTS1) i 7 (ADTS2) din registrul SFIOR selecteaz evenimentul care
declaneaz o nou conversie n modul de funcionare automat (ADATE=1). Aceste evenimente sunt
de fapt semnale de ntrerupere i utilizarea lor va determina activarea flagului corespunztor. Acesta
trebuie s fie dezactivat dup cc s-a realizat o conversie pentru a permite o nou autodeclansare la
respectivul eveniment. Deoarece acest registru este utilizat i de alte module ale microcontrolerului,
utilizatorul va avea grij sa nu modifice dect valoarea biilor 5..7 ale cror combinaii posibile sunt
descrise n tabelul de mai jos:
ADTS2 ADTS1 ADTSO Eveniment de autodeclansare
Funcionare permanent: dup terminarea unei
0 0 0
conversii se ncepe imediat alta
Semnalul de ntrerupere generat de
0 0 1 comparatorul analogic
Semnalul de ntrerupere generat de
0 1 0
ntreruperea extern 0
1 Semnalul de ntrerupere generat cnd
0 1
Timer/CounterO atinge valoarea de prag
Semnalul de ntrerupere generat cnd
1 0 0
Timer/CounterO atinge valoarea maxim
Semnalul de ntrerupere generat cnd timerul pe
1 0 1
16 bii atinge valoarea de prag B

9
Semnalul de ntrerupere generat cnd timerul
1 1 0
pe 16 bii atinge valoarea maxim
Semnalul de ntrerupere generat de unitatea de
1 1 1
captur a timerului pe 16 bii

3.4 PrezentareaDispozitivelor folosite.

vom observa c aceasta este direct proporional cu temperatura mediului n care se afl jonciunea.

Pe aceast dependen se bazeaz folosirea unor structuri integrate cu tranzistori pentru msurarea

temperaturii. La 300K mrimea raportului kT/e este de 26 mV.

4. Proiectarea i implimentarea
Pentru a realiza aceast lucrare am folosit programul de simulare Proteus v7.4, cu ajutorul
cruia am creat placa de montaj i am asamblat schema. n componena schemei intr urmtorele
component: microcontrolerul ATmega16 seriei AVR, afior de patru cifre, un amplificator operaional,
un ntreruptor electronic i un circuit electric format din rezistene i capaciti.
n special vom folosi portul A care are ca funcie adugtoare Convertorul Analog Digital
(ADC). Semnal ce va fi prelucrat de ADC va fi transmis la porturile de ieire B i C conectate cu un
afior de 4 cifre, care va afia temperatura. La portul D, care este deasemenea de iesire, face
conexiunea cu circuitul electric ce este format din elementul nclzitor i de rcire. De asemenea
avem nevoie de un ntreruptor electronic, care permite de a conecta sau deconecta elementului de
nclzire de la sursa de tensiune i de un amplificator operaional folosit ca un bufer.
Programarea microcontrolerului a nceput cu alegerea bibliotecilor, a segmentului de cod i
definirea constantelor, iniializarea porturilor.
Am iniializat Taimerul i am setat biii corespunztori, am determinat prescalerul:
; Timer0_OVF, Prescaler = 8, OffSet = 100
10
ldi r16, 0x01
out TIMSK, r16
ldi r16, 0x03
out TCCR0, r16
ldi r16, 0x80
out TCNT0, r16

n continuare am iniiat ADC-ul i am setat biii corespunztori:


; Initializam ADC
ldi r16, (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADATE)

out ADCSRA, r16

ldi r16, (1<<REFS0)|(1<<ADLAR)


out ADMUX, r16
Codul surs este ataat n Anex.

5. Rezultate experimentale
Aceasta este schema electric i rezultatul lucrrii:

11
6. Concluzii

12
n aceast proiect de curs am ncercat sa fac o recapitulare a materialului nvat pe parcursul
simestrului, n cadrul cursului Microprocesoare i Interfee. Ca microprocesor de baz am folosit
Atmega16 produs de firma Atmel, deprinznd tehnicile de lucru i funcionarea acestuia. Totui n
aceast lucrare am folosit preponderant porturile I/O, modulul Analog Digital Converter (ADC) i
modulul periferic Taimer. Scopul acestei lucrri a fost de a modela funcionarea unui termostat cu
ajutorul MCU, ADC a fcut conversia din semnalul analogic n cel digital, iar prin Taimer am fcut
posibil afiarea datelor la display. La final am cpatat o schema electric destul de volominoas, dar
care are implimentare corect i cred eu c ar fi utilizabil i n practic pentru diferite domenii.

7. Bibliografie
1) www.atmel.com;
2) www.avrfreaks.com;
3) www.avr.com;
4) D. Crstoiu Sisteme cu microprocesoare, Note de curs ;
5) M. Patrubany Totul despre microprocesorul Z80, Ed. Tehnic 1989;
6) epelea, Lupu Microprocesoare aplicaii;

Anex
.include"m16def.inc"
.dseg
tab: .byte 4
.cseg
.org 0
rjmp Reset
.org 0x12
rjmp Timer0_Ovf
.org ADCCaddr
rjmp ADC_isr

.org 0x28

Reset:
; SP <- Ramend
ldi r16, HIGH(RamEnd)
out sph, r16
ldi r16, LOW(RamEnd)
out spl, R16

; B, C : output,Value = 0x00
ldi r16, 0xFF
13
out DDRB, r16
out DDRC, r16
out DDRD, r16

ldi r16, 0x00


out PortB, r16
out PortC, r16
out PortD, r16

; Timer0_OVF, Prescaler = 8, OffSet = 100


ldi r16, 0x01
out TIMSK, r16
ldi r16, 0x03
out TCCR0, r16
ldi r16, 0x80
out TCNT0, r16

; Initializam ADC
ldi r16, (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|
|(1<<ADATE)

out ADCSRA, r16

ldi r16, (1<<REFS0)|(1<<ADLAR)


out ADMUX, r16
rcall TabInit
clr r17
sei

Main:
rjmp Main
reti
;-------------------------------------------------
Timer0_Ovf:

clr r16
out portB, r16

ldi yh, High(tab)


ldi yl, Low(tab)

ldi r16, 200


out TCNT0, r16

lsl r17
cpi r17, 0x00

brne L1
ldi r17, 0x01

L1:
cpi r17, 0b00000001
brne L2

ldd r16, y+0


14
out PortB, r16

mov r18, r17


com r18
out PortC, r18

L2:
cpi r17, 0b00000010
brne L3

ldd r16, y+1


out PortB, r16

mov r18, r17


com r18
out PortC, r18

L3:
cpi r17, 0b00000100
brne L4

ldd r16, y+2


out PortB, r16

mov r18, r17


com r18
out PortC, r18

L4:
cpi r17, 0b00001000
brne L5

ldd r16, y+3


out PortB, r16

mov r18, r17


com r18
out PortC, r18

L5:

reti

;-------------------------------------------------
TabInit:
ldi yh, High(tab)
ldi yl, Low(tab)
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b00111111 ; r16 <- '0'
st y+, r16
ldi r16, 0b01100011 ; r16 <- '*'
st y+, r16
15
ret

;-------------------------------------------------

ADC_isr:
in r16, ADCH
in r19, ADCH

cpi r16, 190


brlo If_lower

If_High:
cpi r16, 200
brlo End
cbi PortD, 0
rjmp End
If_lower:
sbi PortD, 0

End:
rcall Conversion_handler
reti

//-----------------------------------------------

Conversion_handler:

ldi yh, High(tab)


ldi yl, Low(tab)

clr r20
Firs_Digit:
cpi r19, 100
brlo Store_First_Digit
inc r20

Loop1:
sbci r19, 100
cpi r19, 100
brlo Store_First_Digit
inc r20
rjmp Loop1

Store_First_Digit:
rcall Decoder_Function
std y+0, r21
clr r20

Second_Digit:
cpi r19, 10
brlo Store_Second_Digit
inc r20
16
Loop2:
sbci r19, 10
cpi r19, 10
brlo Store_Second_Digit
inc r20
rjmp Loop2

Store_Second_Digit:
rcall Decoder_Function
ori r21, 0b10000000 ; pentru desenarea punctului
std y+1, r21
clr r20

Third_Digit:
Store_Third_Digit:
mov r20, r19
rcall Decoder_Function
std y+2, r21
ret

//-----------------------------------------

Decoder_Function:

Zero:
cpi r20, 0
brne One
ldi r21, 0b00111111
One:
cpi r20, 1
brne Two
ldi r21, 0b00000110
Two:
cpi r20, 2
brne Three
ldi r21, 0b01011011
Three:
cpi r20, 3
brne Four
ldi r21, 0b01001111
Four:
cpi r20, 4
brne Five
ldi r21, 0b01100110
Five:
cpi r20, 5
brne Six
ldi r21, 0b01101101
Six:
cpi r20, 6
brne Seven
ldi r21, 0b01111101
Seven:
17
cpi r20, 7
brne Eight
ldi r21, 0b00100111
Eight:
cpi r20, 8
brne Nine
ldi r21, 0b01111111
Nine:
cpi r20, 9
brne End_of_Decoder
ldi r21, 0b01101111

End_of_Decoder:
ret

18

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