Hola a todos espero que sea este el sitio adecuado para la siguiente consuta.
Bueno el problema es el siguiente:
Estoy haciendo un voltimetro de dos canales con el pic16f84a y el pcf8591
Utilizo los canales ain0 y ain3,Funciona todo muy bien pero cuando uno de los canales indistintamente cae por debajo de 1,25vcc el otro canal sin tocarlo tambien cae. visualizando en los dos canales la misma tension, si subo por encima de 1,25Vcc el canal que no e tocado se restaura marcando la tension real, pero el lio viene cuando uno de los canales le bajo la tension a 0Vcc entonces el otro canal que no e tocado se queda colgado.
No entiendo lo que me esta pasando,por favor si alguien puede ayudarme se lo agradeceria.
Gracias.
;**************************************** I2C_ADC_01.asm ******************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
www.pic16f84a.com; Editorial Ra-Ma.
www.ra-ma.es; ===================================================================
;
; El microcontrolador lee constantemente la entrada analógica ANI0 del PCF8591 y
; visualiza la tensión en la pantalla del módulo LCD.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
Auxiliar
Auxiliar1
ENDC
PCF8591_DIR_ESCRITURA EQU b'10011110'
PCF8591_DIR_LECTURA EQU b'10011111'
;
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
call LCD_Inicializa
Principal
call I2C_EnviaStart ; Va a configurar el PCF8591.
movlw PCF8591_DIR_ESCRITURA ; Apunta al dispositivo.
call I2C_EnviaByte
movlw b'00000000' ; Carga la palabra de control utilizando la
call I2C_EnviaByte ; entrada AIN0 en modo simple.
call I2C_EnviaStop ; Termina la configuración
;
call I2C_EnviaStart ; Comienza a leer.
movlw PCF8591_DIR_LECTURA ; Apunta al dispositivo.
call I2C_EnviaByte
call I2C_LeeByte ; La primera lectura es incorrecta y por lo tanto
; la desecha.
call I2C_LeeByte ; Lee la entrada analógica.
movwf Auxiliar
call I2C_EnviaStop
call Visualiza ; La visualiza.
call I2C_EnviaStart ; Va a configurar el PCF8591.
movlw PCF8591_DIR_ESCRITURA ; Apunta al dispositivo.
call I2C_EnviaByte
movlw b'00000011' ; Carga la palabra de control utilizando la
call I2C_EnviaByte ; entrada AIN3 en modo simple.
call I2C_EnviaStop ; Termina la configuración
;
call I2C_EnviaStart ; Comienza a leer.
movlw PCF8591_DIR_LECTURA ; Apunta al dispositivo.
call I2C_EnviaByte
call I2C_LeeByte ; La primera lectura es incorrecta y por lo tanto
; la desecha.
call I2C_LeeByte ; Lee la entrada analógica.
movwf Auxiliar1
call I2C_EnviaStop
call Visualiza1 ; La visualiza.
goto Principal
; Subrutinas "Visualiza" ----------------------------------------------------------------
;
; Visualiza el valor que se le introduce por el registro de trabajo W en formato de tensión.
; Hay que tener en cuenta que el PCF8591 del esquema trabaja con una resolución de
; LSB=10mV, el valor de entrada será 10 veces menor que la tensión real expresada en
; milivoltios. Así por ejemplo, si (W)=147 el valor de la tensión será igual a:
; VAIN = LSB x Digital = 10 x 147 = 1470 mV = 1,47 V, que es lo que se debe visualizar
; en la pantalla.
;
; En conclusión:
; - Las centenas del valor digital corresponden a las unidades de voltio.
; - Las decenas del valor digital corresponden a las décimas de voltio.
; - Las unidades del valor digital corresponden a las centésimas de voltios.
Visualiza
call LCD_Linea1 ; Se sitúa al principio de la primera línea.
movlw MensajeTension ; Visualiza la tensión deseada.
call LCD_Mensaje
movf Auxiliar,W ; Recupera el dato a visualizar y lo
call BIN_a_BCD ; pasa a BCD.
movf BCD_Centenas,W ; Visualiza las centenas que corresponden a las
call LCD_Nibble ; unidades de voltios.
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf BCD_Decenas,W ; Visualiza las decenas que corresponden a las
call LCD_Nibble ; décimas de voltios.
movf BCD_Unidades,W ; Visualiza las unidades que corresponden a las
call LCD_Nibble ; centésimas de voltios.
movlw MensajeVoltios
call LCD_Mensaje
return
Visualiza1
movwf Auxiliar ; Lo guarda.
call LCD_Linea2 ; Se sitúa al principio de la primera línea.
movlw MensajeTension ; Visualiza la tensión deseada.
call LCD_Mensaje
movf Auxiliar1,W ; Recupera el dato a visualizar y lo
call BIN_a_BCD ; pasa a BCD.
movf BCD_Centenas,W ; Visualiza las centenas que corresponden a las
call LCD_Nibble ; unidades de voltios.
movlw '.' ; Visualiza el punto decimal.
call LCD_Caracter
movf BCD_Decenas,W ; Visualiza las decenas que corresponden a las
call LCD_Nibble ; décimas de voltios.
movf BCD_Unidades,W ; Visualiza las unidades que corresponden a las
call LCD_Nibble ; centésimas de voltios.
movlw MensajeVoltios
call LCD_Mensaje
return
Mensajes
addwf PCL,F
MensajeTension
DT "Tension: ", 0x00
MensajeVoltios
DT " V. ", 0x00
INCLUDE <BUS_I2C.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
END