Jít k navigaci - Jít k vyhledávání


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
 
Kód: Assembler PIC16F877A - Převodník 10b na 4x 7segment


Autor
Jiří Chytil

Jiří Chytil22 let

Šéfredaktor 8bitu.cz. V současné době je studentem třetího ročníku bakalářského studia na Fakultě elektrotechické na VUT v Brně. Mezi jeho koníčky patří elektrotechnika a bastlení jakéhokoliv druhu.

Diskuse ke článku (0)

- Žádné příspěvky -

Přidat první komentář »


Novinky Další novinky

[30. 01.]  Omlouvám se za nečinnost způsobenou značným nedostatkem času. Nevím, ale jestli se mi to podaří změnit. To víte, člověk stárne a jeho čas je potřeba jinde než na internetu.
[07. 03.]  Po dlouhé době jsme pro vás přichystali novou anketu - najdete ji níže v pravém panelu.
[12. 12.]  Zajímavý počin v oblasti měřící techniky jsou Real-time spektrální analyzátory - odkaz
[07. 12.]  Sice již starší video, ale stále mě uchvacuje. Výroba elektronek "doma" - odkaz
[26. 10.]  V říjnu byla pokořena hranice 10 tisíc návštěv za měsíc

Reklama

Morphy Richards elektronika

Programujte.com

Léčivé obrazy - enkaustika Lenka Blažíková

Keramika Věra Coufalová - užitková keramika

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é