„Pergésmentesítés” változatai közötti eltérés
Ugrás a navigációhoz
Ugrás a kereséshez
(Új oldal, tartalma: „<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: ; tim…”) |
a |
||
(8 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> | <code> | ||
− | .def temp = r16 | + | .def temp = r16 |
− | .def pattern = r17 | + | .def pattern = r17 |
− | .def | + | .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.
.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