;******************************************************************************* ;* Digitális technika (VIMIAA03) 11. gyakorlat és laboratórium * ;* Knight Rider futófény szoftveres és hardveres idõzítéssel. * ;******************************************************************************* DEF LD 0x80 ; LED adatregiszter (írható/olvasható) DEF TR 0x82 ; Timer kezdõállapot regiszter (csak írható) DEF TM 0x82 ; Timer számláló regiszter (csak olvasható) DEF TC 0x83 ; Timer parancs regiszter (csak írható) DEF TS 0x83 ; Timer státusz regiszter (csak olvasható) ;******************************************************************************* ;* A program kezdete. A programmemória 0x00 és a 0x01 címe a reset, illetve * ;* a megszakítás vektor. Ide ugró utasításokat kell elhelyezni, amelyek a * ;* megfelelõ programrészre ugranak. Ha nem használunk megszakítást, akkor a * ;* program kezdõdhet a 0x00 címen is. * ;******************************************************************************* start: mov r1, #0xe0 shr_loop: ;Ciklus a jobbra léptetéshez. mov LD,r1 jsr sw_wait sr0 r1 cmp r1,#0x07 jnz shr_loop shl_loop: ;Ciklus a balra léptetéshez. mov LD,r1 jsr sw_wait sl0 r1 cmp r1, #0xe0 jnz shl_loop jmp shr_loop ;******************************************************************************* ;* Szoftveres idõzítési szubrutin. 24 bites ciklusváltozót kell használnunk, * ;* melyet nulláról indítva és egyesével növelve kb. 12,58 másodpercig fog * ;* futni a szubrutin. Tehát a kívánt 0,25 másodperces várakozáshoz a ciklus- * ;* változót 50-nel kell növelni. * ;******************************************************************************* sw_wait: mov r8,#0 mov r9,#0 mov r10,#0 sw_wait_loop: add r8,#255 ;Érték adc r9,#0 adc r10,#0 jnc sw_wait_loop rts ;Visszatérés a hívóhoz. ;******************************************************************************* ;* A timer perifériát inicializáló szubrutin. Ismétlõdéses mûködési módot kell * ;* beállítani. Ha elõosztásnak 65536-ot választunk, akkor az idõzítõ számláló * ;* kezdõértéke 60 kell, hogy legyen a 0,25 másodperces idõzítési periódushoz. * ;* (60 + 1) * 65536 * 62,5 ns ~ 0,25 s * ;******************************************************************************* tmr_init: rts ;Visszatérés a hívóhoz. ;******************************************************************************* ;* Hardveres idõzítési szubrutin. A timer periféria státusz regiszterében a * ;* TOUT bit (bit 2) jelzi az idõzítési periódus végét, erre kell várakoznunk. * ;* A státusz regiszter olvasása automatikusan törli a TOUT bitet. * ;******************************************************************************* tmr_wait: rts ;Visszatéts a hívóhoz.
+1-1Remove