„AVR feladatok” változatai közötti eltérés
Nincs szerkesztési összefoglaló |
2-5 összeadó a zip-fájlból, apró hiba javítva. |
||
| (3 közbenső módosítás, amit 2 másik szerkesztő végzett, nincs mutatva) | |||
| 11. sor: | 11. sor: | ||
}} | }} | ||
}} | }} | ||
< | <source lang="asm"> | ||
; Bináris számok beolvasása | ; Bináris számok beolvasása | ||
.def temp = r16 | .def temp = r16 | ||
| 71. sor: | 70. sor: | ||
pop temp | pop temp | ||
ret | ret | ||
</ | |||
</source> | |||
---- | |||
{{Infobox | {{Infobox | ||
| cím = 2-2 Gombnyomás számláló | | cím = 2-2 Gombnyomás számláló | ||
| 88. sor: | 89. sor: | ||
}} | }} | ||
< | <source lang="asm"> | ||
; Gombnyomás számlálás | ; Gombnyomás számlálás | ||
.def temp = r16 | .def temp = r16 | ||
| 141. sor: | 142. sor: | ||
pop temp | pop temp | ||
reti | 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]] | |||