Re: Nezlomné Interrupty 2052

Aleš Novák ales.novak@t-email.cz
Sobota Prosinec 2 21:05:11 CET 2006


Myslim, ze ze vseho nejdriv by to chtelo odladit zobrazovani na
displejich a az pak resit dalsi veci.
Napriklad druhy a treti radek podprogramu Horni by chtel prohodit.
Napred nastavit do dptr adresu tabulky a pak teprve z ni cist.
Vubec tech instrukci mov dptr,#tab je tam nejak zbytecne moc.
Ukazeme si ale jak se v tomto pripade obejit bez dptr uplne.

Pridavat desetinnou tecku bude bezpecnejsi pomoci instrukce anl i kdyz
s xrl to bude taky fungovat pokud bude spravne prednastaven ten bit)

Docela kostrbate je zasouvani bitu do posuvnych registru. Proc
nepouzit rotaci?

Zasadni opomenuti je ovsem v NEuschovani ACC na zasobnik v preruseni.

Podezrela deklarace:
PTis  equ 35H a dalsi ctyri bajty
Tis   equ 35H a dalsi ctyri bajty

Nebylo by od veci naucit se pro zacatek pouzivat direktivy kompilatoru

        dseg at Adresa   ;segment pro definici promennych v RAM
Var1:   ds   2           ;v RAM se vyhradi dva bajty
Var2:   ds   4           ;v RAM se vyhradi ctyri bajty (hned za Var1+1)

        bseg             ;definice bitu v bitove adresovatelne oblasti
VarBit: ds   1           ;v bitove oblasti se vyhradi jeden bit

        cseg at Adresa   ;na kterou adresu se zacne kompilovat (org)

pokud je kompilator podporuje. Hoodne to usnadni praci. Takove
prekryvani oblasti v RAM kontroluje.

Dale pak registry se nepouzivaji pro globalni promenne, na to slouzi
volna RAM. Registry slouzi pro docasne ulozeni hodnot, predavani
hodnot mezi podprogramy, vypocty, cykly apod.

Mozna by bylo vhodne synchronizovat zobrazovani s pocitanim. Ja takove
veci delam tak, ze v preruseni nastavim nejaky bit v bitove oblasti. V
hlavni smycce (uz mimo preruseni) tento bit testuji a jakmile zjistim,
ze je nahozeny, tak ho vynuluji a zavolam podprogram na zobrazeni dat.
Vzhledem k tomu, ze preruseni je po 1 ms (nekontroloval jsem), je casu
na nakrmeni posuvnych registru vice nez dost.

Samotne rolovani bitu do posuvnych registru by se dalo zjednodusit
napriklad takto. Predpoklada ovsem, ze jednotlive dekady jdou v RAM po
sobe. Jeste lepsi by bylo definovat v RAM 15 bajtu v rade za sebou tak
jak jdou po sobe displeje a pak by nasledujici tri podprogramy odpadly.
Zustal jen jeden, ktery posle 15 bajtu a na zaver da puls na STB.

Levy:   mov    r0,#DesSecL
        call   Posli5            ;posleme prvnich 5 bajtu
        ret
Pravy:  mov    r0,#DesSecP
        call   Posli5            ;dalsich 5 bajtu
        ret
Horni:  mov    r0,#DesSec
        call   Posli5            ;poslednich 5 bajtu
        setb   STB               ;nakonec vsech 15 cislic zobrazime
        clr    STB               ;zhasinat displej netreba, sviti na
        ret                      ;nem predchozi udaj az do STB pulsu

Posli5: mov    r1,#5
Posli5b:mov    a,@r0
        dec    r0
        call   DejTvar
        cjne   r1,#4,Posli5a     ;pri druhem pruchodu
        anl    a,#01111111b      ;pridat des. tecku
Posli5a:call   Posli
        djnz   r1,Posli5b
        ret

;jako prvni se do posuvnych registru posila horni bit
Posli:  mov   r7,#8
Posli1: rl    a             ;horni bit do carry
        mov   DIN,c
        setb  CLK
        clr   CLK
        djnz  r7,Posli1
        ret
        
;tabulka se musi preskladat podle skutecneho pripojeni
;segmentu, jako prvni se v Posli posila horni bit
DejTvar:inc   a
        movc  a,@a+pc
        ret
;             hgfedcba
        db    11000000B    ;0
        db    11111001B    ;1
        db    10100100B    ;2
        db    10110000B    ;3
        db    10011001B    ;4
        db    10010010B    ;5
        db    10000010B    ;6
        db    11111000B    ;7
        db    10000000B    ;8
        db    10010000B    ;9
        db    10001000B    ;A
        db    10000011B    ;b
        db    10100111B    ;c
        db    10100001B    ;d
        db    10000110B    ;E
        db    10001110B    ;F
        db    11111111B ; nic
         
Trochu jsem se rozepsal ale snad to pomuze :-)
  Novalex





Další informace o konferenci Hw-list