Usar ADC y entradas digitales en el mismo puerto (CCS)

#1
Hola a todos, les cuento que estoy armando un voltimetro-amperimetro para mi fuente con un pic y displays de 7 segmentos, La lectura y escritura en los displays funciona bien y aguanta hasta 15A y 30V, la fuente llega solo hasta 23V por lo que no hay problema en el dimensionamiento que le di. El punto es que quiero cambiar entre voltimetro y amperimetro con un pulsador, por software tengo la idea lista, pero como sólo me quedan pines disponibles del portA configuré el ADCON1 de la siguiente forma:

setup_adc_ports(4); para dejar el RA2 como digital para conectar allí el pulsador y con bit_test(porta,2); leo el estado, el programa funciona al simular todo en proteus pero hay que apretar el pulsador varias veces para que cambie de modo, ¿es normal, o el método que estoy utilizando para hacerlo no es eficaz? hay alguna forma de optimizar esa parte para usar el puerto como adc en RA0 y RA1 y en RA2 conectar el pulsador?

Cualquier sugerencia para optimizar el codigo tambien es bienvenida C:

Adjunto el codigo en CCS C y el diseño en proteus
 

Adjuntos

#2
pues se configura como lo tienes intenta poner un antirrebote. y define el tris_A2 como entrada antes de la rutina main.
 
Última edición:
#3
no seria mejor idea usar 2 ADC con el pic uno que solo lea corriente y otro que lea voltaje
digo no es tan caro usar un LCD hay unos muy economicos

a usar los displays de 7 segmentos

para solo ocupar solo 8 bits y manejar hasta 4 displays puedes usas 4 bits un 74ls47 para decodificar el BCD y los otros 4 para multiplexar
digo usando un multiplexor puedes usar hasta 16 displays
sin multiplexor 4 displays

eso si quieres hacer las cosas dificiles

pero un LCD 16x2 se ve mas bonito , le metes mensajes de texto como
ejemplo :

voltaje : 5.42v
corriente: 234mA
 
#4
Trilo: Viste es esquema, asi es exactamente como lo estoy haciendo, con AN0 mido la caida en el shunt, y con AN1 el voltaje entregado, los resto por software y con un 7447 y 4 pnp controlo los displays, acá no son muy baratos los lcds así que el que tengo lo estoy reservando para algun instrumento más definitivo, como un frecuencimetro o que se yo.

De hecho uno de los problemas que tuve fue que al definir el trisa como #BYTE TRISA 133 y luego hacer TRISA = 255 o usando las directivas de ccs para definirlo el programa no funcionaba, voy a probarlo poniendolo antes del main y les cuento.
 
#5
#BYTE TRISA 133 no hace efecto si antes no declaras #USE FAST_IO() por lo que el compilador hace I/O cada vez que se escribe o lee algo del puerto; es decir que siempre está modificando los TRISx.

Utiliza #USE FAST_IO() y en main la función set_tris_x() para que tú controles los TRISx.

Otro detalle, coloca antirrebote para el pulsador y mejor ahún una espera hasta que suelten el pulsador porque tal y como está el código, éste se repite varias veces cada vez que se acciona el pulsador.
 
#6
#BYTE TRISA 133 funciona por si solo, los use_io son solo para el uso de output e input y alguna que otra instrucción, pero en lo que yo hago es hacer que TRISA se encuentra en la posicion 133 y despues dandole un valor se define su configuración. Son formas alternativas de hacer lo mismo. Así es como lo he usado siempre y no he tenido problemas.

Estoy buscando lo del antirrebote para el pulsador, gracias
 
Arriba