„AVR feladatok” változatai közötti eltérés

Gogerham (vitalap | szerkesztései)
Nincs szerkesztési összefoglaló
2-5 összeadó a zip-fájlból, apró hiba javítva.
 
(6 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:<br/>
[[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  
5. sor: 5. sor:
| keretszín = black
| keretszín = black
| tartalom =
| tartalom =
{{Infobox-táblázat|
Í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!
{{Infobox-táblázatsor|Í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! }}
}}
 
{{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}}
14. sor: 11. sor:
}}
}}
}}
}}
<br/>
<source lang="asm">
<code>
  ; Bináris számok beolvasása
  ; Bináris számok beolvasása
  .def temp = r16
  .def temp = r16
74. sor: 70. sor:
  pop temp
  pop temp
  ret
  ret
</code>
 
</source>
----
{{Infobox
{{Infobox
| cím = 2-2 Gombnyomás számláló
| cím = 2-2 Gombnyomás számláló
91. sor: 89. sor:
}}
}}


<code>
<source lang="asm">
.def temp = r16
; Gombnyomás számlálás
</code>
.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 eredeti címe: „https://vik.wiki/AVR_feladatok