TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: namontoy en 17 de Marzo de 2006, 11:12:00
-
Hola a todos!!
Estoy desarrollando un control simple de temperatura utilizando un sensor LM35, un PIC 16F819, 4 display 7 segmentos y un Potenciometro para modificar el nivel de temperatura deseado.
Todo lo estoy desarrollando con MPLAb 7.2.
Mi programa funciona de tal forma que hago una conversion en AN0 (o en AN1) utilizando interrupciones. Tengo debidamente definidas las entradas en el TRISA y en el ADCON1, ademas del reloj segun lo recomendado en el datasheet del PIC.
Tengo definida a AN3 como referencia de voltaje.
Cuando estaba desarrollando el programa, probe por aparte cada una de las conversion A/D y funcionaban bien (aun lo hace), pero (repito) solo si modifico el codigo para que se haga la conversion por un solo pin. Si dejo el codigo completo (para hacer las dos conversiones) me sucede algo muy extraño, un tipo de interferencia o filtración de un conversor con el otro, en fin... el caso es que los datos adquiridos ya no son los correctos (en ninguno de los dos pines).
Ya intente que cada ves que se termine la conversion se desactive el modulo de conversion (BCF ADCON0, ADON) y sea activado cada ves que se va a realizar una conversion... pero sucede algo mucho peor, todo se distorsiona y los datos no son ni parecidos...
Bueno, eso es todo. Si a alguien le a pasado lo mismo y sabe como solucionarlo, le agradeceria la colaboracion que me pudiera brindar.
Muchas gracias. Un feliz dia!!
namontoy
-
Hola amigo,
Caso raro el q presentas, me parece un problema es de voltaje de referencia, coloca la referencia directa, osea que el PIC la tome de vcc y muestreas un canal y despues el otro a ver que pasa. postea la parte del codigo donde lees los canales a ver que estas haciendo.
Salu2
-
Hola poi5on!!
En mi programa, la referencia esta asignada a AN3 no porque yo quiera, sino porque toco ya que si te fijas en la pagina 83 del datasheet de este pic, la unica forma para tener 2 pines analogos y los otros que mas pudiera como digitales es 0101 en PCFG<3:0>; sin contar los pines del cristal y el master clear (que a mi me gustan externos). Por esto me toco trabajar con la referencia en el pin 3... Pero lo tengo puesto con la alimentacion del PIC -> 5V -> Un lm7805...
Todo mi programa lo he desarrollado por modulos (intentando simular algo parecido a clases... cosas que se le quedan a uno de JAVA).
En fin, mi archivo se llama Conversion_AD.inc , he preferido adjuntarlo a pegarlo aqui completo ya que es un poco largo.
Podes fijarte en dos subrutinas en este archivo: la primera es CONFIG_CONVER_AD en la cual configuro algunas cosas necesarias y que no deben ser modificadas despues.
La segunda subrutina es DO_CONVER_AN0 la cual es la encargada de hacer la conversion en AN0. En esta se llaman a dos subrutinas de otros archivos <-> modulos que no son necesarios aqui, estas llamadas son ESPERAR_CONVER -> encargada de esperar la interrupcion debida a la conversion y la otra es ACONDICIONAR_DATO, que es la encargada de multiplicar, dividir y transformacion BCD... y todo lo necesario para presentar el el display de 7 segmentos.
La ultima llamada (que esta comentareada) es la que al activarla me esta creando el problema (;CALL DO_CONVER_AN1), el codigo de esta subrutina como puedes ver es casi identico... asi que no se que es lo que sucede.
Muchas gracias por todo y disculpame la explicacion tan larga...
Feliz dia
namontoy
Bueno, fue imposible adjuntar el archivo asi que lo voy a pegar (solo lo necesario)
==============================================
CONFIG_CONVER_AD
BSF STATUS, RP0
MOVLW b"10000101"
MOVWF ADCON1
BSF PIE1, ADIE
BCF STATUS, RP0
BCF PIR1, ADIF
BSF CONFIGURACION,CONF_AD
RETURN
;SUBRUTINA ENCARGADA DE LA CONVERSION EN EL PIN AN0
DO_CONVER_AN0
CLRF CONVER_TMR0
BCF CONTROL_CONVER_AD,CONVER_OK
MOVLW b"01000001"
MOVWF ADCON0
NOP
BSF ADCON0, GO
BSF CONTROL_CONVER_AD,AD_AN0
CALL ESPERAR_CONVER
;BCF ADCON0,ADON
MOVF ADRESH,W
MOVWF CONVERSION_AN0_HIGH
BSF STATUS, RP0
MOVF ADRESL,W
BCF STATUS, RP0
MOVWF CONVERSION_AN0_LOW
CALL ACONDICIONAR_DATO
;CALL DO_CONVER_AN1
RETURN
===================================================
Feliz dia
namontoy
-
namontoy ,
Tirale una demora entre conversiones para que se acomode los conversores fijate no se en ese pic nunca lo programamos pero en el 873 funca bien de est6a manera. el pic creo que trabaja con cristal de 4mhz sino lee la pdf que esta el tiempo ahi.
MEDIR movlw d"1" ;Tiempo de propagación
call DEMORA
bsf ADGO ;Inicia la conversión A/D
btfsc ADGO ;Espera que termine de convertir
goto $ -1
bsf RP0 ;Pasa a página 1 (para acceder a los ocho bits bajos del resultado)
movf adres, 0 ;Resultado de conversión -> W
bcf RP0 ;Pasa a página 1
return
DEMORA movwf tiempo2 ;Demora tantos milisegundos como valor en w
TOP2 movlw d"110"
movwf tiempo1
TOP1 nop
nop
nop
nop
nop
nop
decfsz tiempo1, 1
goto TOP1
decfsz tiempo2, 1
goto TOP2
return
-
Hola amigo,
Lo que veo es que tienes muchas cosas "de mas" yo hago el codigo mas simple y me funcina, para que utilizas esto?
CLRF CONVER_TMR0
BCF CONTROL_CONVER_AD,CONVER_OK
.
.
.
BSF CONTROL_CONVER_AD,AD_AN0
CALL ESPERAR_CONVER
Bueno, con respecto a la espera te recomiendo que simplemente pongas un bucle
bucle
btfsc adcon0,2
goto bucle
Asi lo coloco yo y me fuciona perfectamente, colocalo asi a ver q pasa
Saludos