„Pergésmentesítés” változatai közötti eltérés

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez
(Eltávolította a lap teljes tartalmát)
a
 
(4 közbenső módosítás, amit egy másik szerkesztő végzett, nincs mutatva)
1. sor: 1. sor:
 +
Ez a lap a mérnök-informatikus képzés [[Mérés_laboratórium_2.|Mérés laboratórium 2]]. tárgyához kapcsolódik.<br/>
 +
Az alábbi kód egy lehetséges implementáció az ellenőrző mérésen előforduló pergés probléma megoldására.
 +
{{Infobox
 +
| cím = Példakód pergésmentesítéshez
 +
| háttérszín = #C0ffee
 +
| keretszín = black
 +
| tartalom =
 +
{{Infobox-táblázat|
 +
{{Infobox-táblázatsor|A kód nyelve|Assembly}}
 +
{{Infobox-táblázatsor|Fejlesztőeszköz|Atmel® AVR® ATmega128}}
 +
}}
 +
}}
  
 +
<code>
 +
.def temp = r16
 +
.def pattern = r17
 +
.def pressed = r18
 +
 +
; megfelelö IT ugrást ki kell cserélni erre:
 +
jmp TIMER_IT ; Timer0 Compare Match Handler
 +
 +
M_INIT:
 +
; timer inicializálás
 +
 +
ldi temp, 0x0f
 +
; mivel az eszköz 11059200 Hz-es órajellel üzemel ezt osztjuk 1024-el (TCCR0 .....111)
 +
; CTC üzemmód (Clear Timer on Compare match), kimenet tiltás (TCCR0 00001...)
 +
out TCCR0, temp
 +
ldi temp, 107
 +
; így 10800 HZ-en számlál az idözitö, század másodpercenként kérjük a megszakítás így 108-as modulusú üzemmód kell (OCR0 107)
 +
out OCR0, temp
 +
ldi temp, 0x02
 +
; OCIE0 bitet (......1.) be kell lönünk, hogy TCNT0 == OCR0 esetén legyen IT
 +
out TIMSK, temp
 +
 +
ldi pressed, 0x00
 +
ldi pattern, 0xff
 +
 +
sei ; globális IT engedélyezése
 +
 +
M_LOOP:
 +
tst pressed ; csak akkor nem nulla, ha lenyomás történt
 +
breq M_LOOP ; ha nem történt akkor várunk
 +
clr pressed ; ha történt akkor töröljük és cselekedjünk
 +
 +
; itt kell cselekedni
 +
 +
jmp M_LOOP
 +
 
 +
TIMER_IT:
 +
push temp ; mentjük az aktuális tempet
 +
in temp, SREG ; és a státusz regiszter tartalmát
 +
push temp
 +
 +
  in temp, PINE ; beolvasunk a 4/9 ananászról (BTN0-3)
 +
bst temp, 5 ; BTN0 értékét tároljuk SREG T bitjébe
 +
 +
lsl pattern ; az eddigi mintát árrébb toljuk balra eggyel (elsö alkalommal 0-kat shiftelünk)
 +
bld pattern, 0 ; a felszabadult indexre bedobjuk BTN0 mostani értékét SREG T bitjéböl
 +
 +
  andi pattern, 0x0f ; a felsö 4 bitet eldobjuk
 +
cpi pattern, 0x0C ; az alsó 4 bit, ha 1100 (C) akkor valaki tényleg megnyomta a gombot
 +
brne NOT_PRESSED ; ha nem 1100 akkor telhet még az idö
 +
inc pressed ; ha 1100 volt akkor gombnyomás volt
 +
NOT_PRESSED:
 +
pop temp
 +
out SREG, temp ; visszatöltjük a státuszregisztert
 +
pop temp ; visszatöltjük a temp IT elötti értékét
 +
reti ; visszatérünk
 +
</code>
 +
--[[Szerkesztő:Gogerham|Gogerham]] ([[Szerkesztővita:Gogerham|vita]]) 2013. május 19., 21:04 (UTC)
 +
 +
[[Category:Infoalap]]

A lap jelenlegi, 2013. szeptember 14., 21:38-kori változata

Ez a lap a mérnök-informatikus képzés Mérés laboratórium 2. tárgyához kapcsolódik.
Az alábbi kód egy lehetséges implementáció az ellenőrző mérésen előforduló pergés probléma megoldására.

Példakód pergésmentesítéshez
A kód nyelve
Assembly
Fejlesztőeszköz
Atmel® AVR® ATmega128

.def temp = r16
.def pattern = r17
.def pressed = r18

; megfelelö IT ugrást ki kell cserélni erre:
jmp TIMER_IT ; Timer0 Compare Match Handler

M_INIT:
	; timer inicializálás
	
	ldi temp, 0x0f
	; mivel az eszköz 11059200 Hz-es órajellel üzemel ezt osztjuk 1024-el (TCCR0 .....111)
	; CTC üzemmód (Clear Timer on Compare match), kimenet tiltás (TCCR0 00001...)
	out TCCR0, temp
	ldi temp, 107
	; így 10800 HZ-en számlál az idözitö, század másodpercenként kérjük a megszakítás így 108-as modulusú üzemmód kell (OCR0 107)
	out OCR0, temp
	ldi temp, 0x02
	; OCIE0 bitet (......1.) be kell lönünk, hogy TCNT0 == OCR0 esetén legyen IT
	out TIMSK, temp
	
	ldi pressed, 0x00
	ldi pattern, 0xff 
	
	sei ; globális IT engedélyezése

M_LOOP:
	tst pressed ; csak akkor nem nulla, ha lenyomás történt
	breq M_LOOP ; ha nem történt akkor várunk
	clr pressed ; ha történt akkor töröljük és cselekedjünk
	
	; itt kell cselekedni
	
	jmp M_LOOP
 	
TIMER_IT:
	push temp ; mentjük az aktuális tempet
	in temp, SREG ; és a státusz regiszter tartalmát
	push temp
	
 	in temp, PINE ; beolvasunk a 4/9 ananászról (BTN0-3)
	bst temp, 5 ; BTN0 értékét tároljuk SREG T bitjébe
	
	lsl pattern ; az eddigi mintát árrébb toljuk balra eggyel (elsö alkalommal 0-kat shiftelünk)
	bld pattern, 0 ; a felszabadult indexre bedobjuk BTN0 mostani értékét SREG T bitjéböl
	
 	andi pattern, 0x0f ; a felsö 4 bitet eldobjuk
	cpi pattern, 0x0C ; az alsó 4 bit, ha 1100 (C) akkor valaki tényleg megnyomta a gombot
	brne NOT_PRESSED ; ha nem 1100 akkor telhet még az idö
	inc pressed ; ha 1100 volt akkor gombnyomás volt
NOT_PRESSED:
	pop temp
	out SREG, temp ; visszatöltjük a státuszregisztert
	pop temp ; visszatöltjük a temp IT elötti értékét
	reti ; visszatérünk

--Gogerham (vita) 2013. május 19., 21:04 (UTC)