„AVR feladatok” változatai közötti eltérés
A VIK Wikiből
Új oldal, tartalma: „Ez a lap a mérnök-informatikus képzés Mérés laboratórium 2. tárgyához kapcsolódik.<br/> Az alábbi kód egy lehetséges implement…” |
2-5 összeadó a zip-fájlból, apró hiba javítva. |
||
(12 közbenső módosítás, amit 2 másik szerkesztő végzett, nincs mutatva) | |||
1. sor: | 1. sor: | ||
[[Mérés_laboratórium_2.|Mérés laboratórium 2]]. tárgy ellenőrző méréséhez kiadott AVR-es feladatok lehetséges megoldásai: | |||
{{Infobox | {{Infobox | ||
| cím = 2-1 Bináris számok beolvasása | | cím = 2-1 Bináris számok beolvasása | ||
6. sor: | 5. sor: | ||
| keretszín = black | | keretszín = black | ||
| tartalom = | | tartalom = | ||
Írjon egy programot az AVR Experiment kártyára, amely 8 bites bináris számot olvas be a | Írjon egy programot az AVR Experiment kártyára, amely 8 bites bináris számot olvas be a kapcsolósorról, két részletben. A kapcsolókon (SW0 -SW3) beállított értéket jobbról balra növekvő súlyozású 4 bites bináris számként kell kezelni. A 8 bites szám alsó (alacsonyabb súlyozású) része a BT0 nyomógombbal, a felső része a BT1 nyomógombbal vihető be. A BT1 gomb megnyomása után a bevitt 8 bites szám értéket jelezze ki a LED soron! | ||
kapcsolósorról, két részletben. A kapcsolókon (SW0 -SW3) beállított értéket jobbról balra | |||
növekvő súlyozású 4 bites bináris számként kell kezelni. A 8 bites szám alsó (alacsonyabb | |||
súlyozású) része a BT0 nyomógombbal, a felső része a BT1 nyomógombbal vihető be. A BT1 | |||
gomb megnyomása után a bevitt 8 bites szám értéket jelezze ki a LED soron! | |||
{{Infobox-táblázat| | {{Infobox-táblázat| | ||
{{Infobox-táblázatsor|A kód nyelve|Assembly}} | {{Infobox-táblázatsor|A kód nyelve|Assembly}} | ||
16. sor: | 11. sor: | ||
}} | }} | ||
}} | }} | ||
<source lang="asm"> | |||
; Bináris számok beolvasása | |||
.def temp = r16 | |||
.def led = r17 | |||
M_INIT: | |||
ldi temp, 0x00 | |||
sts DDRG, temp ; bemenetre állítjuk | |||
ldi temp, 0xff | |||
sts PORTG, temp ; felhúzzuk a kapcsolókat | |||
ldi temp, 0x00 | |||
out DDRE, temp ; bemenetre állítjuk | |||
ldi temp, 0xff | |||
out PORTE, temp ; felhúzzuk a gombokat | |||
ldi temp, 0xff | |||
out DDRC, temp ; kimenetre állítjuk | |||
ldi led, 0x00 | |||
out PORTC, led ; kikapcsoljuk a ledeket | |||
M_LOOP: | |||
in temp, PINE | |||
sbrs temp, 5 ; ha BT0 fel van engedve, akkor átugorja a következö utasítást | |||
call LOW4 | |||
sbrs temp, 6 ; BT1 | |||
call HIGH4 | |||
jmp M_LOOP | |||
LOW4: | |||
push temp | |||
lds temp, PING | |||
com temp | |||
bst temp, 3 ; SW3 értéke T-be | |||
bld led, 0; T-böl betölti led 0-as bitjébe | |||
bst temp, 4 ; SW2 | |||
bld led, 1; | |||
bst temp, 1 ; SW1 | |||
bld led, 2; | |||
bst temp, 0 ; SW0 | |||
bld led, 3 | |||
pop temp | |||
ret | |||
HIGH4: | |||
push temp | |||
com temp | |||
lds temp, PING | |||
bst temp, 3 ; SW3 értéke T-be | |||
bld led, 4; T-böl betölti led 0-as bitjébe | |||
bst temp, 4 ; SW2 | |||
bld led, 5; | |||
bst temp, 1 ; SW1 | |||
bld led, 6; | |||
bst temp, 0 ; SW0 | |||
bld led, 7 | |||
out PORTC, led | |||
pop temp | |||
ret | |||
< | </source> | ||
.def temp = r16 | ---- | ||
</ | {{Infobox | ||
| cím = 2-2 Gombnyomás számláló | |||
| háttérszín = #C0ffee | |||
| keretszín = black | |||
| tartalom = | |||
Írjon egy programot az AVR Experiment kártyára, amely az INT nyomógomb lenyomására | |||
(ill. pergésére) keletkező 1→0 átmeneteket számolja. Az INT nyomógomb változásait | |||
megszakítással kezelje. A számláló 4 bites, tartalma a LED soron van kijelezve. | |||
Kiegészítő feladat: A számláló az 1111 érték elérése után nem számol tovább, a számláló egy | |||
másik nyomógombbal törölhető. | |||
{{Infobox-táblázat| | |||
{{Infobox-táblázatsor|A kód nyelve|Assembly}} | |||
{{Infobox-táblázatsor|Fejlesztőeszköz|Atmel® AVR® ATmega128}} | |||
}} | |||
}} | |||
<source lang="asm"> | |||
; Gombnyomás számlálás | |||
.def temp = r16 | |||
.def cnt = r17 | |||
jmp INT4_IT ; INT4 Handler (INT gomb) | |||
M_INIT: | |||
ldi temp, 0x00 | |||
out DDRE, temp ; bemenetre állítjuk | |||
ldi temp, 0xff | |||
out PORTE, temp ; felhúzzuk a gombokat | |||
ldi temp, 0xff | |||
out DDRC, temp ; kimenetre állítjuk | |||
ldi cnt, 0x00 | |||
out PORTC, cnt ; kikapcsoljuk a ledeket | |||
ldi temp, 0x02 ; INT gomb, lefutóél-érzékeny | |||
out EICRB, temp | |||
ldi temp, 0x10 ; 4-es IT-vonal engedélyezése | |||
out EIMSK, temp | |||
sei ; globális IT engedélyezve | |||
M_LOOP: | |||
in temp, PINE | |||
sbrs temp, 5 ; ha BT0 fel van engedve, akkor átugorja a következö utasítást | |||
call DEL_CNT | |||
jmp M_LOOP | |||
DEL_CNT: | |||
ldi cnt, 0x00 | |||
call LED | |||
ret | |||
LED: | |||
out PORTC, cnt | |||
ret | |||
INT4_IT: | |||
push temp | |||
in temp, SREG | |||
push temp | |||
cpi cnt, 0x0F | |||
breq IT_END | |||
inc cnt | |||
call LED | |||
IT_END: | |||
pop temp ; | |||
out SREG, temp | |||
pop temp | |||
reti | |||
</source> | |||
---- | |||
{{Infobox | |||
| cím = 2-5 Összeadó készítése | |||
| háttérszín = #C0ffee | |||
| keretszín = black | |||
| tartalom = | |||
Írjon egy programot az AVR Experiment kártyára, amely egy összeadót valósít meg. Az | |||
összeadó 4 bites, előjel nélküli bináris kódolású operandusokkal dolgozik. | |||
A számokat az SW0..3 kapcsolókon kell beállítani. Az IT gomb első megnyomásának | |||
hatására a szám betöltődik a 8 bites eredményregiszterbe. Az eredményregiszter tartalmát a | |||
LED0..7 jelzi ki. Az IT gomb második megnyomása beviszi a kapcsolókon beállított második | |||
operandust, és rögtön hozzáadja az eredményregiszter tartalmához. Az IT gomb harmadik | |||
megnyomása törli az eredményregisztert és alapállapotba viszi vissza az összeadót. A | |||
nyomógomb pergésmentesítését oldja meg. | |||
{{Infobox-táblázat| | |||
{{Infobox-táblázatsor|A kód nyelve|Assembly}} | |||
{{Infobox-táblázatsor|Fejlesztőeszköz|Atmel® AVR® ATmega128}} | |||
}} | |||
}} | |||
<source lang="asm"> | |||
;jmp TIMER_IT; Timer0 Compare Match Handler | |||
.def temp =r16 ; Temporary Register example | |||
.def res =r17 ; Összeadás eredménye | |||
.def state =r19 ; Aktuális állapot | |||
.def pressed =r20 ; Gombnyomást jelzo "flag" | |||
.def pattern =r21 ; Bitminta pergésmentesítéshez | |||
M_INIT: | |||
;< ki- és bemenetek inicializálása stb > | |||
; LED init | |||
ldi temp, 0xFF ; irány - kimenet | |||
out DDRC, temp | |||
ldi temp, 0x00 ; egyik sem világít | |||
out PORTC, temp | |||
; SW init | |||
ldi temp, 0x00 ; irány - bemenet | |||
sts DDRG, temp ; G port -> out helyett sts!! | |||
; BTN init | |||
ldi temp, 0x00 ; irány - bemenet | |||
out DDRE, temp | |||
; TIMER - csak pergésmentesítéshez | |||
ldi temp, 0x0f ; 1024-es eloosztó -> 10800Hz | |||
out TCCR0, temp | |||
ldi temp, 107 ; 108 ciklus -> 10800/108 = 100Hz | |||
out OCR0, temp | |||
ldi temp, 0x02 ; TIMER IT engedélyezés | |||
out TIMSK, temp | |||
ldi state, 0 ; kezdoállapot | |||
ldi res, 0 ; eredményreg. init | |||
ldi pressed, 0 ; gomb nincs lenyomva | |||
ldi pattern, 0xff ; bitminta kezdetben csupa 1 | |||
sei ; globális IT engedélyezés | |||
M_LOOP: | |||
tst pressed ; test for zero | |||
breq M_LOOP ; ha nincs gombnyomás, ugrunk | |||
clr pressed ; gombnyomás esetén flag törlése | |||
cpi state, 1 ; 1-es állapot: OP1 betöltése | |||
breq OP1 ; és kijelzés | |||
cpi state, 2 ; 2-es állapot: OP2 betöltés | |||
breq OP2 ; és összeadás, kijelzés | |||
cpi state, 3 ; 3-as állapot: törlés, alapáll. | |||
breq CLEAR | |||
jmp M_LOOP ; Endless Loop | |||
TIMER_IT: ; TIMER IT rutin | |||
push temp ; mentés | |||
in temp, SREG | |||
push temp | |||
; pergésmentesítés | |||
in temp, PINE ; gombok beolvasása | |||
bst temp, 5 ; BT0 állapot eltárolása | |||
lsl pattern ; bitminta shiftelése balra | |||
bld pattern, 0 ; az LSB helyére beszúrjuk | |||
; a gomb állapotát jelzo bitet | |||
andi pattern, 0x0f ; felso 4 bitet eldobjuk | |||
cpi pattern, 0b00001100 ; 1100 bitminta? | |||
brne NOT_PRESSED ; ha nem, nincs gombnyomás, | |||
; vagy csak pergést észlel | |||
; 1100 -> tényleges lefutó él | |||
inc pressed ; lenyomás történt, flag beáll. | |||
inc state ; következo állapot | |||
NOT_PRESSED: | |||
pop temp ; visszaállítás | |||
out SREG, temp | |||
pop temp | |||
reti | |||
OP1: ; elso operandus betöltése | |||
lds res, PING ; kapcsoló beolvasás, in helyett lds! | |||
bst res, 4 ; SW2 bit áthelyezése a helyére | |||
bld res, 2 | |||
com res ; switch aktív alacsonyból aktív magasba alakítása | |||
andi res, 0x0f ; felso 4 bit eldobása | |||
out PORTC, res ; kijelzés | |||
jmp M_LOOP | |||
OP2: ; második op. betöltés + összeadás | |||
lds temp, PING ; kapcsoló beolvasás, in helyett lds! | |||
bst temp, 4 ; SW2 bit áthelyezése a helyére | |||
bld temp, 2 | |||
com temp ; switch aktív alacsonyból aktív magasba alakítása | |||
andi temp, 0x0f ; felso 4 bit eldobása | |||
add res, temp ; OP1, OP2 összeadás | |||
out PORTC, res ; kijelzés | |||
jmp M_LOOP | |||
CLEAR: ; alapállapotba állítás | |||
ldi state, 0 ; kezdoáll. | |||
ldi res, 0 ; eredményreg. törlés | |||
ldi temp, 0 ; temp törlés | |||
out PORTC, res ; kijelzés | |||
jmp M_LOOP | |||
</source> | |||
---- | |||
[[Kategória:Infoalap]] |
A lap jelenlegi, 2015. május 5., 12:38-kori változata
Mérés laboratórium 2. tárgy ellenőrző méréséhez kiadott AVR-es feladatok lehetséges megoldásai:
; Bináris számok beolvasása
.def temp = r16
.def led = r17
M_INIT:
ldi temp, 0x00
sts DDRG, temp ; bemenetre állítjuk
ldi temp, 0xff
sts PORTG, temp ; felhúzzuk a kapcsolókat
ldi temp, 0x00
out DDRE, temp ; bemenetre állítjuk
ldi temp, 0xff
out PORTE, temp ; felhúzzuk a gombokat
ldi temp, 0xff
out DDRC, temp ; kimenetre állítjuk
ldi led, 0x00
out PORTC, led ; kikapcsoljuk a ledeket
M_LOOP:
in temp, PINE
sbrs temp, 5 ; ha BT0 fel van engedve, akkor átugorja a következö utasítást
call LOW4
sbrs temp, 6 ; BT1
call HIGH4
jmp M_LOOP
LOW4:
push temp
lds temp, PING
com temp
bst temp, 3 ; SW3 értéke T-be
bld led, 0; T-böl betölti led 0-as bitjébe
bst temp, 4 ; SW2
bld led, 1;
bst temp, 1 ; SW1
bld led, 2;
bst temp, 0 ; SW0
bld led, 3
pop temp
ret
HIGH4:
push temp
com temp
lds temp, PING
bst temp, 3 ; SW3 értéke T-be
bld led, 4; T-böl betölti led 0-as bitjébe
bst temp, 4 ; SW2
bld led, 5;
bst temp, 1 ; SW1
bld led, 6;
bst temp, 0 ; SW0
bld led, 7
out PORTC, led
pop temp
ret
; Gombnyomás számlálás
.def temp = r16
.def cnt = r17
jmp INT4_IT ; INT4 Handler (INT gomb)
M_INIT:
ldi temp, 0x00
out DDRE, temp ; bemenetre állítjuk
ldi temp, 0xff
out PORTE, temp ; felhúzzuk a gombokat
ldi temp, 0xff
out DDRC, temp ; kimenetre állítjuk
ldi cnt, 0x00
out PORTC, cnt ; kikapcsoljuk a ledeket
ldi temp, 0x02 ; INT gomb, lefutóél-érzékeny
out EICRB, temp
ldi temp, 0x10 ; 4-es IT-vonal engedélyezése
out EIMSK, temp
sei ; globális IT engedélyezve
M_LOOP:
in temp, PINE
sbrs temp, 5 ; ha BT0 fel van engedve, akkor átugorja a következö utasítást
call DEL_CNT
jmp M_LOOP
DEL_CNT:
ldi cnt, 0x00
call LED
ret
LED:
out PORTC, cnt
ret
INT4_IT:
push temp
in temp, SREG
push temp
cpi cnt, 0x0F
breq IT_END
inc cnt
call LED
IT_END:
pop temp ;
out SREG, temp
pop temp
reti
;jmp TIMER_IT; Timer0 Compare Match Handler
.def temp =r16 ; Temporary Register example
.def res =r17 ; Összeadás eredménye
.def state =r19 ; Aktuális állapot
.def pressed =r20 ; Gombnyomást jelzo "flag"
.def pattern =r21 ; Bitminta pergésmentesítéshez
M_INIT:
;< ki- és bemenetek inicializálása stb >
; LED init
ldi temp, 0xFF ; irány - kimenet
out DDRC, temp
ldi temp, 0x00 ; egyik sem világít
out PORTC, temp
; SW init
ldi temp, 0x00 ; irány - bemenet
sts DDRG, temp ; G port -> out helyett sts!!
; BTN init
ldi temp, 0x00 ; irány - bemenet
out DDRE, temp
; TIMER - csak pergésmentesítéshez
ldi temp, 0x0f ; 1024-es eloosztó -> 10800Hz
out TCCR0, temp
ldi temp, 107 ; 108 ciklus -> 10800/108 = 100Hz
out OCR0, temp
ldi temp, 0x02 ; TIMER IT engedélyezés
out TIMSK, temp
ldi state, 0 ; kezdoállapot
ldi res, 0 ; eredményreg. init
ldi pressed, 0 ; gomb nincs lenyomva
ldi pattern, 0xff ; bitminta kezdetben csupa 1
sei ; globális IT engedélyezés
M_LOOP:
tst pressed ; test for zero
breq M_LOOP ; ha nincs gombnyomás, ugrunk
clr pressed ; gombnyomás esetén flag törlése
cpi state, 1 ; 1-es állapot: OP1 betöltése
breq OP1 ; és kijelzés
cpi state, 2 ; 2-es állapot: OP2 betöltés
breq OP2 ; és összeadás, kijelzés
cpi state, 3 ; 3-as állapot: törlés, alapáll.
breq CLEAR
jmp M_LOOP ; Endless Loop
TIMER_IT: ; TIMER IT rutin
push temp ; mentés
in temp, SREG
push temp
; pergésmentesítés
in temp, PINE ; gombok beolvasása
bst temp, 5 ; BT0 állapot eltárolása
lsl pattern ; bitminta shiftelése balra
bld pattern, 0 ; az LSB helyére beszúrjuk
; a gomb állapotát jelzo bitet
andi pattern, 0x0f ; felso 4 bitet eldobjuk
cpi pattern, 0b00001100 ; 1100 bitminta?
brne NOT_PRESSED ; ha nem, nincs gombnyomás,
; vagy csak pergést észlel
; 1100 -> tényleges lefutó él
inc pressed ; lenyomás történt, flag beáll.
inc state ; következo állapot
NOT_PRESSED:
pop temp ; visszaállítás
out SREG, temp
pop temp
reti
OP1: ; elso operandus betöltése
lds res, PING ; kapcsoló beolvasás, in helyett lds!
bst res, 4 ; SW2 bit áthelyezése a helyére
bld res, 2
com res ; switch aktív alacsonyból aktív magasba alakítása
andi res, 0x0f ; felso 4 bit eldobása
out PORTC, res ; kijelzés
jmp M_LOOP
OP2: ; második op. betöltés + összeadás
lds temp, PING ; kapcsoló beolvasás, in helyett lds!
bst temp, 4 ; SW2 bit áthelyezése a helyére
bld temp, 2
com temp ; switch aktív alacsonyból aktív magasba alakítása
andi temp, 0x0f ; felso 4 bit eldobása
add res, temp ; OP1, OP2 összeadás
out PORTC, res ; kijelzés
jmp M_LOOP
CLEAR: ; alapállapotba állítás
ldi state, 0 ; kezdoáll.
ldi res, 0 ; eredményreg. törlés
ldi temp, 0 ; temp törlés
out PORTC, res ; kijelzés
jmp M_LOOP