Převodníky z 10b kódu na 4 digity
10. 07. 10 - 10:12. Napsal Jiří Chytil. Přečteno 2011x. 3 komentáře
Některé modely mikrokontrolerů PIC jsou vybaveny 10b AD převodníkem. Výstupní data jsou ale v dosti nepříjemném tvaru. Převedeme je tedy pomocí následujícího kódu na 4x BCD, který už můžeme zobrazit třeba na LED Display. Kód navíc umožňuje násobit číslo konstantou 1-9, to se může hodit například při použití děliče na vstupu nebo na úpravu rozsahu.
Princip kódu zde nebudu příliš popisovat, je kompletně uveden v komentářích. Jen bych asi zmínil, že je psán pro procesor PIC16F877A.
list p=16f877A radix dec #include__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF ;####################################################################################### volts1 EQU h'20' ; LSD volts2 EQU h'21' volts3 EQU h'22' volts4 EQU h'23' ; MSD down_byte EQU h'24' ; 8LSB up_byte EQU h'25' ; 2MSB expander EQU h'27' ; Násobení převodu (1-9) prenos EQU h'26' ; Pomocná proměnná DIVIDEND EQU h'30' ; proměnné pro dělení DIVISOR EQU h'31' QUOTIENT EQU h'32' REMAINDER EQU h'33' MULTIPLICAN EQU h'35' ; proměnné pro násobení MULTIPLIER EQU h'36' PRODUCT_H EQU h'37' PRODUCT_L EQU h'38' ;####################################################################################### BSF STATUS,RP0 ; navstavení MCU (Pro 16F877A) MOVLW b'11111111' ; | MOVWF TRISA ; | MOVLW b'00000000' ; | MOVWF TRISB ; | MOVLW b'11111111' ; | MOVWF TRISC ; | MOVLW b'00000000' ; | MOVWF TRISD ; | MOVLW b'00000111' ; | MOVWF TRISE ; | MOVLW b'00000110' ; | MOVWF ADCON1 ; V BCF STATUS,RP0 ; --------------------- ;####################################################################################### MOVLW 3 ; simulace vstupních dat MOVWF up_byte ; | MOVLW 231 ; | MOVWF down_byte ; | MOVLW 5 ; V MOVWF expander ; --------------------- CALL convert ; volání převodu CALL exp ; násobení konstantou endus goto endus ; závěrečný cyklus ;####################################################################################### convert CLRF volts1 ; mazání digitů a cery bitu CLRF volts2 ; | CLRF volts3 ; | CLRF volts4 ; V CLRC ; --------------------- prevod MOVLW 3 ; zpracování horních dvou bitů SUBWF up_byte,0 ; provnání odečtením BTFSS STATUS,Z ; | GOTO cont1 ; se nerovná 3 pokračuje se na cont1 MOVLW 7 ; pokud ano přičte se sedum ADDWF volts3,1 ; do 3 digitu MOVLW 68 ; a 68 ADDWF down_byte,1 ; do registru down_byte GOTO carry ; přeskočí se až na carry cont1 MOVLW 2 ; obdobně jako předchozí sekce SUBWF up_byte,0 ; | BTFSS STATUS,Z ; | GOTO cont2 ; | MOVLW 5 ; | ADDWF volts3,1 ; | MOVLW 12 ; | ADDWF down_byte,1 ; V GOTO carry ; --------------------- cont2 MOVLW 1 ; obdobně jako předchozí sekce SUBWF up_byte,0 ; | BTFSS STATUS,Z ; | GOTO cont1 ; | MOVLW 2 ; | ADDWF volts3,1 ; | MOVLW 56 ; V ADDWF down_byte,1 ; --------------------- carry BTFSS STATUS,C ; kontrola přeečení down_byte GOTO DB100 ; pokud ne pokračuje se na převod DB100 MOVLW 2 ; pokud přeteče ADDWF volts3,1 ; přičte se 2 do 3-digit MOVLW 56 ; a 58 ADDWF down_byte,1 ; do down_byte BCD MOVLW 10 ; test odčítáním zda se volts3 SUBWF volts3,0 ; nerovná 10 BTFSS STATUS,Z ; přes zero register GOTO DB100 ; pokud ne pokračuje se na převod down_byte CLRC ; nuluje se carry bit CLRF volts3 ; nuluje se volts 3 (3 digit) INCF volts4,1 ; se incrementuje na 1 DB100 MOVLW 100 ; převod dolních 8 bitů na digity MOVWF DIVISOR ; pomocí dělení 100 a 10 a zbytků MOVF down_byte,0 ; | MOVWF DIVIDEND ; | CALL Division ; | MOVF QUOTIENT,0 ; | ADDWF volts3,1 ; | MOVLW 10 ; | MOVWF DIVISOR ; | MOVF REMAINDER,0 ; | MOVWF DIVIDEND ; | CALL Division ; | MOVF QUOTIENT,0 ; | ADDWF volts2,1 ; | MOVF REMAINDER,0 ; | ADDWF volts1,1 ; V RETURN ; ukončení podprogramu convert ;####################################################################################### exp MOVF expander,0 ; nahrání násobitele MOVWF MULTIPLIER ; do registru MULTIPLIER MOVF volts1,0 ; nahrání digitu volts1 MOVWF MULTIPLICAN ; do registru MULTIPLICAN CALL multiplic ; volání podporgramu násobení MOVLW 10 ; Příprava dělení 10 MOVWF DIVISOR ; pro odělení desítek a jednotek MOVF PRODUCT_L,0 ; výsledek násobení MOVWF DIVIDEND ; se dělí 10 CALL Division ; volání podporgramu dělaní MOVF QUOTIENT,0 ; desítku se uloží MOVWF prenos ; do registru prenos MOVF REMAINDER,0 ; zbytek se zapíše MOVWF volts1 ; do regisru volts1 MOVF expander,0 ; 2 digit - obdobně jako předchozí sekce kódu MOVWF MULTIPLIER ; | MOVF volts2,0 ; | MOVWF MULTIPLICAN ; | CALL multiplic ; | MOVF prenos,0 ; ale přičítá se přenos z předchozího bitu ADDWF PRODUCT_L,1 ; do registru PRODUCT_L MOVLW 10 ; | MOVWF DIVISOR ; | MOVF PRODUCT_L,0 ; | MOVWF DIVIDEND ; | CALL Division ; | MOVF REMAINDER,0 ; | MOVWF volts2 ; | MOVF QUOTIENT,0 ; V MOVWF prenos ; --------------------- MOVF expander,0 ; 3 digit MOVWF MULTIPLIER ; | MOVF volts3,0 ; | MOVWF MULTIPLICAN ; | CALL multiplic ; | MOVF prenos,0 ; | ADDWF PRODUCT_L,1 ; | MOVLW 10 ; | MOVWF DIVISOR ; | MOVF PRODUCT_L,0 ; | MOVWF DIVIDEND ; | CALL Division ; | MOVF REMAINDER,0 ; | MOVWF volts3 ; | MOVF QUOTIENT,0 ; V MOVWF prenos ; --------------------- MOVF expander,0 ; 4 digit MOVWF MULTIPLIER ; | MOVF volts4,0 ; | MOVWF MULTIPLICAN ; | CALL multiplic ; | MOVF prenos,0 ; | ADDWF PRODUCT_L,1 ; | MOVLW 10 ; | MOVWF DIVISOR ; | MOVF PRODUCT_L,0 ; | MOVWF DIVIDEND ; | CALL Division ; | MOVF REMAINDER,0 ; V MOVWF volts4 ; --------------------- RETURN ; návrat z podprogramu ;####################################################################################### multiplic MOVF MULTIPLICAN,0 ; pomocný podprogram: násobení DECF MULTIPLIER,1 ; pro čísla s výdleskem do 255 multiplic0 ADDWF MULTIPLICAN,1 ; MULTIPLICAN - násobenec DECFSZ MULTIPLIER,1 ; MULTIPLIER - násobitel GOTO multiplic0 ; | MOVF MULTIPLICAN,0 ; | MOVWF PRODUCT_L ; V RETURN ; ukončení podporgramu ;####################################################################################### Division CLRF QUOTIENT ; pomocný podprogram: celočíselné dělení Division0 MOVF DIVISOR,0 ; QUOTIENT - výsldek SUBWF DIVIDEND,1 ; REMAINDER - zbytek po celočíselném dělení BTFSS STATUS,C ; DIVIDEND - dělenc GOTO Ediv ; DIVISOR - dělitel INCF QUOTIENT,1 ; | GOTO Division0 ; | Ediv ADDWF DIVIDEND,0 ; | MOVWF REMAINDER ; V RETURN ; ukončení podporgramu ;####################################################################################### END
Novinky Další novinky
Anketa
Jaký převážně používáte typ mikrokontrolerů?
ATMEL (Xmega/Atmega/Atiny)
ATMEL (ARM)
PIC (8-16bit)
PIC (32bit)
dsPIC (DSP)
Freescale (8-16bit)
Freescale (DSP)
TI (DSP)
TI (ARM)
Jiné produkty uvedených značek
Produkty neuvedených značek
Žádné
Poslední komentáře