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

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
a
(2-5 összeadó a zip-fájlból, apró hiba javítva.)
 
(Egy közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
11. sor: 11. sor:
 
}}
 
}}
 
}}
 
}}
<code>
+
<source lang="asm">
 
  ; Bináris számok beolvasása
 
  ; Bináris számok beolvasása
 
  .def temp = r16
 
  .def temp = r16
70. 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ó
87. sor: 89. sor:
 
}}
 
}}
  
<code>
+
<source lang="asm">
 
  ; Gombnyomás számlálás
 
  ; Gombnyomás számlálás
 
  .def temp = r16
 
  .def temp = r16
140. sor: 142. sor:
 
  pop temp
 
  pop temp
 
  reti
 
  reti
</code>
+
</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]]
 
[[Kategória:Infoalap]]

A lap jelenlegi, 2015. május 5., 11: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:

2-1 Bináris számok beolvasása

Í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!

A kód nyelve
Assembly
Fejlesztőeszköz
Atmel® AVR® ATmega128
 ; 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

2-2 Gombnyomás számláló

Í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ő.

A kód nyelve
Assembly
Fejlesztőeszköz
Atmel® AVR® ATmega128
 ; 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

2-5 Összeadó készítése

Í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.

A kód nyelve
Assembly
Fejlesztőeszköz
Atmel® AVR® ATmega128
;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