como procesar el dato que me da el adc0804 para mostrarlo?

tengo un lm35 conectado al adc0804 con Vref/2=1.28V y el rango de entrada del adc es de 0 a 5V. Mi duda es como tengo que hacer con el dato que me da el adc para mostrarlo en dos display de 7 segmentos, ya que el adc me da el dato en binario y yo tengo los display conectados directamente al port b del pic 16f84. ¿como paso ese dato binario al valor de temperatura a mostrar en los dos display? Si alguien me puede ayudar, gracias
 
lo que puedes es hacer una tabla que haga corresponder los valores del ADC ( 0 - 255) con lo que quieres a la salida (por ej. 0 - 50 )
 
lo de la tabla es una forma, pero tendria una tabla larguicima. T e cuento que ya lo resolvi, lo que hice es cambiar el rango de entrada del adc, le di de 0 a 2.5V asi tengo una variacion entre bit justo de 10mV. De esta forma a la salida del adc tengo el dato en decimal, luego lo convierto en tres digitos bcd y de esta manera tomo los dos menos significativos y los muestro en el display. suena facil, no pero me llevo mucho tiempo.... ha el codigo de la conversion decimal a bcd lo tome prestado, ja. les dejo todo completo por si alguien lo quiere, codigo y circuito.

Código:
; Programa para leer la temperatura de un ADC y mostrarla en DOS Display

PCL	EQU	02H
STATUS	EQU	03H
TRISA	EQU	05H
PORTA	EQU	05H
TRISB	EQU	06H
PORTB	EQU	06H
UNID	EQU	12H
PDel0	EQU	13H
DECE	EQU	14H
DATO	EQU	15H	; GUARDO EL RESULTADO DE ADC AL TERMINAR DE CONVERTIR
PDel01	EQU	16H
PDel11	EQU	17H

	ORG	00H

	GOTO	INICIO
	ORG	04H
	GOTO	FIN		

				
INICIO	BSF	STATUS,5	; configurando puertos
	CLRF	TRISA		; PORTA COMO SALIDA
	BCF	STATUS,5
	MOVLW	B'00000111'	; DESHABILITO TODO (DISPLAYS Y ADC)
	MOVWF	PORTA

ACA	CALL	CONVER		; LLAMO A LA SUBRUTINA DE CONVERSION.
	CALL	DECBCD		; RUTINA QUE CONVIERTE EL DATO DECIMAL EN TRES BCD
	MOVF	UNID,0
	MOVWF	DATO
	CALL	CODIFI		; AL DATO LO DIVIDO EN UNIDAD Y DECENA PARA LUEGO MOSTRARLO.
	CALL 	MOSTRAR		; MUESTRO LOS DATOS EN LOS DISPLAYS.
	GOTO	ACA

;----------->	TABLA

TABLA	ADDWF	PCL,1
	RETLW	B'00111111'	; codigo para el 0  *
	RETLW	B'00000110'	; código para el 1  *
	RETLW	B'01011011'	; código para el 2  *
	RETLW	B'01001111'	; código para el 3  *
	RETLW	B'01100110'	; código para el 4  *	display gfedcba segmentos de los leds del display	
	RETLW	B'01101101'	; código para el 5  *
	RETLW	B'01111100'	; código para el 6  *
	RETLW	B'00000111'	; código para el 7  *
	RETLW	B'01111111'	; código para el 8  *
	RETLW	B'01100111'	; código para el 9  *
	
;----------->	DEMORA DE 0.120 Ms PARA LA CONVERSION DEL ADC
DEMOADC movlw     .28       ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

;----------> 	DEMORA PARA MULTIPLEXAR LOS DISPLAYS DE 3 Ms
DEMODIS movlw     .4        ; 1 set numero de repeticion  (B)
        movwf     PDel01    ; 1 |
PLoop11 movlw     .186      ; 1 set numero de repeticion  (A)
        movwf     PDel11    ; 1 |
PLoop21 clrwdt              ; 1 clear watchdog
        decfsz    PDel11, 1 ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop21   ; 2 no, loop
        decfsz    PDel01, 1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop11   ; 2 no, loop
PDelL11 goto PDelL21        ; 2 ciclos delay
PDelL21 clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin. 

;----------->	CONVERSION DEL ADC
CONVER	BSF	STATUS,5	; configurando puertos
	MOVLW	B'11111111'	; PORTB COMO ENTRADA  (BIT=1, ENTONCES ENTRADA)
	MOVWF	TRISB		
	BCF	STATUS,5
	MOVLW	B'00000110'	; HABILITO CS DEL ADC (CS=RA0)
	MOVWF	PORTA
	NOP
	MOVLW	B'00000010'	; HABILITO INICIO DE CONVERSION (WR=RA2)
	MOVWF	PORTA
	NOP
	NOP
	MOVLW	B'00000110'	; DESHABILITO WR=RA2
	MOVWF	PORTA
	CALL	DEMOADC		; DEMORA DE 0.120 Ms PARA DARLE TIEMPO AL ADC DE CONVERTIR
	MOVLW	B'00000100'	; HABILITO LA SALIDA DEL DATO (RD=RA1)
	MOVWF	PORTA
	MOVF	PORTB,0		; MUEVO EL DATO EN EL PORTB A W
	MOVWF	DATO		; GUARDO EL RESULTADO DE LA CONVERSION EN DATO
	MOVLW	B'00000111'	; DESHABILITO AL ADC 
	MOVWF	PORTA
	RETURN			

;----------->	CONVERSION DEL DATO DECIMAL EN BCD
DECBCD		NOP
BIN8_BCD3       clrf DECE		; INGRESA EL CODIGO DECIMAL GUARDADO EN DATO Y LO CONVIERTO A BCD
		clrf UNID
BCD_HIGH	movlw .100
		subwf DATO,1		; A DATO LE RESTO 100
		btfss STATUS,0		; C=1 SI EL RESULTADO DE LA OPERACION ES POSITIVO (BIT7 DEL RESULTADO=0) Y
		goto SUMA_100		; SALTO LA PROXIMA INSTRUCCION, SI NO RESTAURO DATO
		incf DECE,1		; INCREMENTO DECE CADA VEZ QUE LE RESTO 100 A DATO Y EL RESULTADO ES +
		goto BCD_HIGH
SUMA_100	movlw .100
		addwf DATO,1
		movlw 0x0F
		movwf UNID		; CARGO UNID CON 00001111
BCD_LOW 	movlw .10
		subwf DATO,1		; COMO ESTOY EN LAS UNIDADES HAGO LO MISMO Q AL PRINCIPIO PERO CON 10
		btfss STATUS,0		; C=1 SI EL RESULTADO DE LA OPERACION ES POSITIVO (BIT7 DEL RESULTADO=0) Y
		goto SUMA_10		; SALTO LA PROXIMA INSTRUCCION, SI NO RESTAURO DATO
		incf UNID,1
		movlw 0x0F
		iorwf UNID,1
		goto BCD_LOW		; EL DATO QUE SALE ES DE TERS CIFRAS, COMO SOLO MUESTRO EN DOS DISPLAY, EL DATO
SUMA_10 	movlw .10		; OBTENIDO EN UNID LO TENGO QUE SEPARAR EN DOS.
		addwf DATO,1
		movlw 0xF0
		andwf UNID,1
		movf DATO,0
		iorwf UNID,1
		RETURN

;----------->	SEPARACION DEL DATO EN UNIDAD Y DECENA
CODIFI

	MOVF	DATO,0		; MUEVO EL DATO A W
	ANDLW	B'00001111'	; SEPARO LAS UNIDADES Y LAS GUARDO EN UNID
	MOVWF	UNID
	MOVF	DATO,0		; MUEVO EL DATO A W
	ANDLW	B'11110000'	; SEPARO LAS DECENAS Y LAS GUARDO EN DECE
	MOVWF	DECE
	SWAPF	DECE,1		; PONGO EL VALOR DE LA DECENA EN LOS CUATRO PRIMEROS BIT PARA PODER ENTRAR EN LA TABLA.
	RETURN

;----------> 	MOSTRAR LA TEMPERATURA EN EL DISPLAY
MOSTRAR	BSF	STATUS,5	; configurando puertos
	CLRF	TRISB		; PORTB COMO SALIDA
	BCF	STATUS,5
	MOVF	UNID,0		; MUEVO UNID A W
	CALL	TABLA
	MOVWF	PORTB		; Saca valor por el puerto B.
	MOVLW	B'000010111'	; MUESTRO DATO EN DISPLAY 1 - UNIDADES (RA4=D1) 
	MOVWF	PORTA
	CALL	DEMODIS
	MOVF	DECE,0		; MUEVO DECE A W
	CALL	TABLA
	MOVWF	PORTB		; Saca valor por el puerto B.
	MOVLW	B'00001111'	; MUESTRO DATO EN DISPLAY 2 - DECENAS (RA3=D2)
	MOVWF	PORTA
	CALL	DEMODIS      
	RETURN 



FIN	NOP
	END
 

Adjuntos

  • circuito_154.zip
    67.5 KB · Visitas: 241
chevere, por el aporte, me va servir mucho....
A el ckto lo puedes poner como una foto, ya q no tengo el orcad, y lo quiero hacerlo en proteus.....
gracias
 
Jomara, celebro que allas podido resolver tu problema, pero no puedo dejar pasar esta explicacion pues considero importante que lo sepas, si es que no lo has notado por alguna razon, y a menos que no te importe lo que a continuacion expongo solo haz caso omiso de lo que explico.
El adc es un convertidor de 8 bits si mal no recuerdo, de forma tal que al haber reducido el voltaje de referencia a escala completa (fullscale) de 5 a 2.5V (50%) en la misma magnitud redujiste la resolucion de tu dato obtenido. Te explico, imagina que a escala completa, (es decir cuando el adc te da FF a la salida) tu voltaje de referencia es de 15V (solo a manera de ejemplo, no metas 15V por favor) , por ende por cada cambio de bit tendriamos una resolucion de 1V y si a 15v o cuando yo tenga FF me representa 100 grados entonces por cada cambio en el adc representa 6.66 grados en mi temperatura OK?
Bien, Suena pobre la resolucion pero bueno al menos veremos que nuestro termometro brincara de 6.66 grados en 6.66 grados cada vez que el adc avance en un bit; Ahora si yo reduzco el voltaje de referencia de 15 a 7.5V (el 50%) entonces por cada cambio de bit hay una resolucion de 2V y entonces por cada cambio de bit en grados centigrados tenemos 13.3 grados.
Como ves, entre mas reduzca yo el voltaje de referencia mayor sera la imprecision y menor mi resolucion.
Por ello lo mejor es llevar el voltaje de referencia a su valor mas alto y adaptar el voltaje de entrada para incrementar la resolucion y la precision del dispositivo en cuestion, normalmente se utiliza algun circuito con AO para tal efecto.
En cuanto al problema de enviarlos a un display 7seg, o LCD o cualquier otro visualizador no te queda mas remedio que:
a) hacer una tabla como lo indicaron
b) De las matematicas de punto flotante no te salvas en el Assambler, incluyendo divisiones.
c) Dejarlo como esta pero sabiendo que la resolucion deja muchisimo que desear, podria ser que la temperatura sea de 21.3 grados reales y lo que tu leas sea algo asi como 14 0 27 grados (para el ejemplo anterior 21.3 - 6.66 o 21.3 + 6.66 lo que ocurra primero, aunque seguro estoy que leeras 14)

Espero no te hayan confundido los comentarios y te sirva de ayuda, Saludos
 
Atrás
Arriba