MERJENJE HITROSTI
(POTI)
AVTORJI:
-KLEMEN GREGORIN E-mail:
klemen.gregorin@kiss.uni-lj.si
-KLEMEN ŠIFRAR E-mail: klemen.sifrar@kiss.uni-lj.si
-ALEŠ ROPOTAR E-mail: ales.ropotar@kiss.uni-lj.si
MENTOR: DR. TADEJ TUMA E-mail: tadej.tuma@fe.uni-lj.si
1. SCI KOMUNIKACIJA
(RS232)
2. PRETVORBA
V ASCII
3. OBDELAVA
IN IZRACUN PODATKOV (RMP)
ZAHTEVE NALOGE:Naloga je zahtevala da izdelamo program ki bo odčitaval impulze z veternice in
rezultate prikazoval na monitorju. Pri tem smo morali najprej poskrbeti za zajem podatkov, nato smo nad temi podatki
izvajali računske operacije in jih pretvorili v ASCII obliko ter poskrbeli za izpis na zaslon.
Zbirniško kodo lahko dobite tukaj: SLIKA IZDELKA:
Veter.asm
Veter.mot
Veter.prn
.
SCI KOMUNIKACIJA (Aleš Ropotar):
Serijska komunikacija je zaporedno prenašanje informacij. SCI je časovno neusklajena komunikacija. Ta vrsta komunikacije
je zelo razširjena, ker je prenos podatkov nezahteven. Preko SCI lahko komuniciramo z najrazličnejšimi enotami. Če želimo
brati podatke s serijskega vmesnika, je najprej potrebno z registri nastaviti hitrost prenosa, način prenosa...To je v našem
operacijskem sistemu že na samem začetku, ker ima operacijski sistem nastavljeno hitrost in način prenosa podatkov za prenos samega programa s PC.
V našem primeru samo zajemamo podatke in jih prenesemo na prikaz (monitor). Tako nam preostane le preverjanje ali so
podatki že prišli ali ne. V podprogramu SCI najprej preverimo register _TRCSR (0x11). Če je njegov najvišji bit postavljen na 1 pomeni, da je bil prejet podatek. Podatek je shranjen v registru _TDR. Tako moramo podatek iz _TDR-ja dovolj hitro
prebrati, da ga naslednji podatek ne prepiše. Ker prenašamo le podatke in jih ne oddajamo ni potrebno uporabljati prekinitev, ampak lahko ta podprogram vključimo v urnik. Tako dovolj hitro pregleduje če je bila narejena sprememba. Če ni prejetega
nobenega novega podatka se prenos zaključi, drugače pa se prenese nov podatek.
Gonilnik SCI je oblikovan kot opravilo in zaseda štiri mesta v urniku (lahko jih tudi več). V urniku pa je tudi števec impulzov, saj moramo impulze tudi zajemati v nekem časovnem intervalu.
;________________________ TRANSMIT CHARACTER
___________________________________
TRACHR
pshx
ldx TRAE
staa 0,X
inx
cpx #TRAE
bne TRA1
ldx #TRAB+2
TRA1 cpx
TRAB
beq TRAERR
stx TRAE
TRAERR pulx
rts
;________________________ SERIAL COMMUNICATION
TASK ___________________________
SCI
pshx
ldaa _TRCSR
anda #%11000000
beq SCI_TR
pulx
rts
SCI_TR
ldaa _TRCSR
anda #%00100000
beq SKONEC
ldx TRAB
cpx TRAE
beq SKONEC
ldaa 0,X
staa _TDR
inx
cpx #TRAE
bne SKON
ldx #TRAB+2
SKON stx
TRAB
SKONEC pulx
rts
;________________________ TRANSMIT STRING
________________________________________
TRASTR
ldaa 0,X
beq TKONC
jsr TRACHR
inx
bra TRASTR
TKONC rts
PRETVORBA V ASCII (Klemen Gregorin):
Moja naloga je bila, da podatke, ki so mi bili posredovani spremenim v format ki je primeren za izpis vrednosti na zaslon računalnika.
Deljenje D z X je rutina za 16 bitno deljenje pri katerem se nepredznačeno celo število v D-ju deli z nepredznačenim celim številom, ki je v X-u. Pri deljenju se količnik vrne v D medtem ko se v X vpisuje ostanek celoštevilskega deljenja.
Pretvorba v ASCII poteka tako, da najprej od vrednosti D-ja odštejemo vrednost 1000 (za tisočice) in le to ponavlojamo dokler podatek ni pravilen. Hkrati se povečuje tudi vrednost števca ASC_STEV. Ko pa je podatek pravilen pričnemo z izvajanjem naslednje subrutine. Tukaj
D-ju nazaj prištejemo vrednost 1000 in njegovo vrednost potisnemo na sklad. Naložimo števec ponovitev odštevanja v akumulator A ga nato še povečamo za ASCII vrednost $30. Potem pa ASCII znak zapišemo v medpomnilnik. Ta postopek nato ponavljamo še za stotice in destice.
podatki se tako pretvorijo v ASCII obliko in so kot taki primerni za izpis na zaslon.
;________________________ DELJENJE D z X______________________________________
DIV pshb
;3 Push dividend from D
psha
;3 to quotient.
clra
;2 Clear modulus
psha
;3 and push it
psha
;3 on top of quotient.
pshx
;4 Push divisor from X on top of modulus.
ldaa #16 ;2
Initialize
psha
;3 and push shift counter.
tsx
;3 Make X point to top of stack.
DIV1 asl
6,X ;6 Arithmetic
shift
rol 5,X ;6
left quotient
rol 4,X ;6
into the
rol 3,X ;6
modulus.
ldd 3,X ;5
Load current 16-bit modulus
subd 1,X ;6
and try to subtract the divisor.
bcs DIV2 ;3
Jump down if divisor higher,
std 3,X ;5
restore new modulus otherwise.
inc 6,X ;6
Set LSbit of quotient.
DIV2 dec
0,X ;6 Decrement
shift counter
bne DIV1 ;3
and loop back if not zero.
pula
;4 Dummy pull
pulx
;5 3 bytes from stack.
pulx
;5 Get modulus from stack to X.
pula
;4 Get quotient from
pulb
;4 stack to D.
rts
;5 Return(D:=D div X, X:=D mod X).
;________________________ PRETVORBA V ASCII ___________________________________
V_ASCII
clr ASC_STEV
ASC_Z1 subd
#1000
bmi ASC_K1
inc ASC_STEV
bra ASC_Z1
ASC_K1
addd #1000
psha
ldaa ASC_STEV
adda #$30
staa 0,X
pula
clr ASC_STEV
ASC_Z2 subd
#100
bmi ASC_K2
inc ASC_STEV
bra ASC_Z2
ASC_K2
addd #100
ldaa ASC_STEV
adda #$30
staa 1,X
clra
ASC_Z3 subb
#10
bmi ASC_K3
inca
bra ASC_Z3
ASC_K3
addb #10
addb #$30
stab 3,X
adda #$30
staa 2,X
rts
OBDELAVA IN IZRACUN PODATKOV (RMP)(Klemen Šifrar):
Naša seminarska naloga je bila razdeljena na tri dele. Moj del seminarske naloge je obsegal zajem podatkov o hitrosti vrtenja veternice oziroma kolesa, ter prenos le teh na ekran računalnika.
Impulze (vsak obhod kolesa za en krog nam je dal en impulz), ki smo jih dobili preko senzorja smo prek serijske komunikacije SCI prenesli v vezje.
RMP:
Zajete podatke je potrebo obdelati, to smo opravili s subrutino RMP.
Na začetku moramo inicializirati PIA-o, to je dokaj preprost postopek, saj je potrebno najprej tretji bit portov _CRA in _CRB nastaviti na ˝1˝, tako da aktiviramo naslavljanje kateri bit na PIA-i bo vhodni, kateri pa izhodni. Ostale bite pustimo nespremenjene, tako jih moramo maskirati. Ko končamo z nastavitvami, vrnemo vrednosti bitov _CRA in _CRB na prvotno vrednost in PIA je pripravljen za uporabo. Prav tako moramo inicializirati tudi vse spremenljivke.
Ko inicializacijo PIA-e končamo, sledijo ukazi za izpis rezultatov meritev (hitrost, pot) na zaslon osebnega računalnika.
Izračun poti in hitrosti:
S pomočjo hardwear-a dobimo impulze, torej število obhodov kolesa, oziroma veternice, katere štejemo in jih nato uporabimo pri izračunu. Ker je polmer kolesa znan, posredno poznamo tudi pot, ki jo napravi vozilo, če se njegovo kolo enkrat zavrti. Čas, v katerem kolo naredi en obhod pa dobimo s pomočjo upoštevanja strojnih ciklov. Iz teh podatkov izračunamo povprečno hitrost in opravljeno pot.
;________________________ INICIALIZACIJA PIE________________________________________
INITPIA
pshx
ldaa _CRA
anda #%11111011
staa _CRA
ldaa #%00000010
staa _DDRA
ldaa #%00000100
oraa _CRA
staa _CRA
ldaa #%00000010
staa _DDRA
clr IZR_ZAST
ldx #2560
stx STETJE
clr STEJ
clr STEJ+1
ldx #SPOROCH1
jsr TRASTR
ldx #SPOROCH2
jsr TRASTR
clr SK_OBR
clr SK_OBR+1
pulx
rts
SPOROCH2 FCB
$0C,$0D
FCC 'Hitrost [km/h]:
'
FCB $00
SPOROCH1 FCB
$0C,$0D
FCC 'CITALEC HITROSTI IN POTI (VERZIJA no.1) '
FCB $00
;________________________ STETJE IMPULZOV________________________________________
ST_IMP
psha
pshb
jsr VRTENJE
ldd STETJE
subd #1
std STETJE
beq ST_NOVO
ST_IMP_K
pulb
pula
rts
ST_NOVO
ldd #2560
std STETJE
inc IZR_ZAST
ldd STEJ
std IZR_STEJ
clr STEJ
clr STEJ+1
bra ST_IMP_K
VRTENJE
tst PREJPOZ
beq VRT_N
ldaa _DDRA
VRT_K
anda #%00000001
staa PREJPOZ
rts
VRT_N ldaa _DDRA
anda #%00000001
beq VRT_K
psha
ldd STEJ
addd #1
std STEJ
pula
bra VRT_K
IZRACUN
ldd IZR_STEJ
asld
ldx #HITROST
jsr V_ASCII
ldx #BRISI ; Brisi
prejsnjo hitrost in pot
jsr TRASTR
ldx #HITROST
jsr PRIKAZI
;
ldd IZR_STEJ
lsrd
addd SK_OBR
std SK_OBR
ldx #84
jsr DIV
ldx #POT
jsr V_ASCII
ldx #SPR_POT
jsr TRASTR
ldx #POT
jsr PRIKAZI
clr IZR_ZAST
rts
PRIKAZI
ldaa 0,X
jsr TRACHR
ldaa 1,X
jsr TRACHR
ldaa 2,X
jsr TRACHR
ldaa #'.'
jsr TRACHR
ldaa 3,X
jsr TRACHR
rts
SPR_POT FCC
' ; Pot [km]: '
FCB $00
BRISI FCB
$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
FCB $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$00
AUX