„Pergésmentesítés” változatai közötti eltérés
A VIK Wikiből
Eltávolította a lap teljes tartalmát |
Visszavontam Gogerham (vita | szerkesztései) szerkesztését (oldid: 165741) |
||
1. sor: | 1. sor: | ||
<code> | |||
.def temp = r16 | |||
.def pattern = r17 | |||
.def pushed = 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 | |||
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) |
A lap 2013. május 19., 22:14-kori változata
.def temp = r16
.def pattern = r17
.def pushed = 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
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