A/D pic a LED display
Moderátor: Moderátoři
A/D pic a LED display
MOVF ADRESL,W
ADDWF PCL,F
GOTO JEDEN
GOTO DVA
.
.
.
GOTO STO
v tychto skokoch JEDEN az STO (to je len priklad) by boli hodnoty ktore by rozsvecovali jednotlive segmenty, ale pripada mi to velmi zlozite vypisat 255 moznosti hodnot po A/D prevode a potom kazdej jednej prisudit spravne segmenty . Njede to nejak jednoduchsie? Na nete som nasiel zapojenia len s LCD a tam sa ta hodnota po A/D prevode posielala priamo na displej co pri LED displeji nieje mozne
dakujem
-
Návštěvník
LCD a tam sa ta hodnota po A/D prevode posielala priamo na displej co pri LED displeji nieje mozne
Po převodu je v registru binární číslo 0-255 a to nejde poslat ani na LED ani LCD displej. Nejprve musíš údaj rozdělit/převést na jednotlivé číslice (hexa nebo dekadické) a teprve potom můžeš zobrazovat. Přiřadit číslicím 0-9 nebo 0-F rozsvícené segmenty pak už není tak těžké. Ta konverze pro LCD nebo LED je až na konečné detaily stejná. Musí toho být plný web. Stačí otevřít oči.
Miesto 100 odskokov budeš mať len štyri, pričom zobrazovaný údaj vybereš z tabuľky 1z10.
Môžem hovoriť do vedenia!
-
nop
Kód: Vybrat vše
; Dekadicka korekcia z BCD (10bit) na DEC (1023) *
; vst;***********************************************************************
up: termv *
; vystup: term01, term1, term10, term100 *
;***********************************************************************
movf termv,0 ; meranu teplotu do w /uz tam je z predchadzajuceho/
movwf r1 ; a potom do r1
bcf status,C_
dc
movlw 0x0a ; 10 do W a ide sa robit prevod na 10
dc1
subwf r1,1 ; od r1 odpocita 10
btfss status,C_ ; ak presiel cez nulu
goto dc11 ; dalsi register (r2)
incf r2,1 ; inak zvacsit r2 o 1
goto dc1 ; a opakovat
dc10
incf r2,1 ; inkr. r2 po uprave ADRESH
goto dc1 ; a pokracovat v prepocte
dc11
movlw 0xff ; 255 do w
addwf r1,1 ; pripocitat k r1
decf adresh,1 ; dekr. horny Byte AD
btfsc status,C_ ; ak presiel cez nulu
goto dc10 ; pokracovat
subwf r1,1 ; 255 odpocitat od r1
movlw 0x0a ; 10 do W
addwf r1,1 ; presiel cez nulu tak pripocitat 10 spat
dc2
subwf r2,1 ; a 10 odpocitat od r2
btfss status,C_ ; ak presiel cez nulu
goto dc21 ; dalsi register
incf r3,1 ; inak incrementovat r3
goto dc2 ; a opakovat
dc21
addwf r2,1 ; ked presiel cez nulu pripocitat 10 spat
dc3
subwf r3,1 ; a 10 odpocitat od r3
btfss status,C_ ; ak presiel cez nulu
goto dc31 ; dalsi register
incf r4,1 ; inak incrementovat r4
goto dc3 ; a opakovat
dc31
addwf r3,1 ; ked presiel cez nulu pripocitat 10 spat
return ; a navrat
DISPL
dc22
movf r1,0 ;
movwf term01 ; term01 desatiny teploty
movlw 0x10
addwf term01,1
movf r2,0
movwf term1 ; term1 jednotky teploty
movlw 0x20
addwf term1,1
movf r3,0
movwf term10 ; term10 desiatky teploty
movlw 0x40
addwf term10,1
movf r4,0
movwf term100 ; term100 stovky teploty
movlw 0x80
addwf term100,1
clrf r1
clrf r2
clrf r3
clrf r4
return
Môžem hovoriť do vedenia!
-
Návštěvník
Tam je stručně popsán algoritmus binary to BCD konverze a v příloze H je i program.
-
Návštěvník
Kód: Vybrat vše
vybral som rutinu z jedneho staršieho programu, preistotu to otestuj simulátorom.
;*****************************************************************************
; Dekadicka korekcia z BCD (10bit) na DEC (1023) *
; vstup: termv *
; vystup: term01, term1, term10, term100 *
;***************************************************************************** Nehodlám kritizovat vlastní algoritmus, ale minimálně mi nějak nesedí deklarované vlastnosti a parametry. Vstupní parametr je 8bit a konverze se provádí na 4xBCD? Trochu podivné dr. Watson!
Existuje viac (ja poznám štyri) spôsobov prevodu BCD na DEC (to len pre tých čo miesto pomoci rozhadzujú perly)
Ak riešime problem AD prevodníka, tak vstupom bude určite hodnota z AD prevodníka. Asi tam niet o čom špekulovať.
Ten kod je asi 5 rokov starý a mám ho zachovaný v PC s koncovkou _1, takže za ním určite existovalo niekoľko ďalších úprav. Doplnil som tam riadky dc10. Skontroluj ako pracuje CARRY C_ bit, s tým nie som si istý.
Filozofia:
Predstav si, že AD načítal hodnotu 755d, čo je 2F3h. V registroch A..H bude 0x02 a v A..L bude 0xF3
Hodnotu 0xF3 = 243d zapíšeš do r1, od r1 potom odpočítavaš 10 a pri každom odpočítaní pripočítaš do r2 1.
Ak sa to zopakuje 24 krát, bude r1 = 3 a r2 = 24. Pri ďalšom odpočítaní bude r1 záporné, čo je podmienka na skok, predtým ale musí byť k r1 pripočítané 10 aby v r1 bol 3 (nie -7).
Následne poskočíš na r2, od ktorého odpočítaš 10 (2x), v r2 zostane 4 a v r3 bude 2.
Po skončení bude v regirtroch r3,r2,r1 == 2,4,3.
Pretože, ale ty máš 10bitov, tak v momente, keď sa r1 dopočíta do nuly, pripočíta sa k r1 255 a ADRESH sa dekrementuje, To sa opakuje max. 3x a následne sa rieši r2. To ti pozmení hodnoty v registroch,
takže v závere by si mal mať v r4,r3,r2,r1 == 0,7,5,5 .
Je to náročné na čas, ale ak procesor celý deň nič nerobí, tak aspon chvíľu nech počíta.
Rýchlejšie algoritmy sú cez tabuľky, alebo výpočtom pomocou C, DC.
A na doplnenie, výstup potom išiel na dekoder BCD/7seg. takže výstupný byte bol v tvare 0001 čččč, 0010 čččč, 0100 čččč, 1000 čččč.
Môžem hovoriť do vedenia!