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