FAKULTETA ZA ELEKTROTEHNIKO                                   

                                                                                TRŽAŠKA 25
                                                                            1000 LJUBLJANA
 

                             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:
                                                         
Veter.asm
                                                         Veter.mot
                                                         Veter.prn


SLIKA IZDELKA:

.                       


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