TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: soymoe en 03 de Enero de 2011, 14:07:31
-
Esyo traando de usar el conversor del 16f88 para un termometro, pero al variar la entrada analogica, el valor de ADRES parece no variar. Esta es mi rutina de inicializacion y conversion:
InicializeAD
clrf ADRESH;Borro los resultados anteriores
clrf ADRESL;
bsf STATUS,RP0;Selecciono banco 1
movlw b'10000000';ver
movwf ADCON1; selecciono vref y formato de resultado
clrf INTCON; DESHABILITO LAS INTERRUPCIONES
bcf STATUS,RP0;banco 0
movlw b'1100001'
movwf ADCON0;seleciono frec conversion y canal
goto fin
Conversion call RETARDO30microS;Espera Time adquisicion
bsf ADCON0,2; empiezo conversion
loop btfsc ADCON0,2; si done sigo
goto loop
MOVF ADRESH,W
MOVWF binH; MUEVO LOS VALORES DEL CONVERSOR A binH
MOVF ADRESL,W
MOVWF binL; MUEVO LOS VALORES DEL CONVERSOR A binL
call RETARDO30microS;Retardo antes de volver a convertir
fin return
La llamada seria:
CALL InizializeAD
CALL conversion
Me pueden ayudar?
-
hola, el pedido de la rutina lo podias hacer, o mejor aun trata de hacerla tu mismo, viendo la hoja de datos en tu rutina no veo la configuracion del registro ANSEL.
Asegurate de cargarle 8bits al ADCON0, por si las moscas
-
hola, el pedido de la rutina lo podias hacer, o mejor aun trata de hacerla tu mismo, viendo la hoja de datos en tu rutina no veo la configuracion del registro ANSEL.
Asegurate de cargarle 8bits al ADCON0, por si las moscas
La configuracion del ANSEl la hago en esta rutina de configuracion del puerto:
IniPort
clrf PORTA
clrf PORTB
bsf STATUS,RP0;seleciona banco 1
movlw .7
movwf CMCON ; COMPARADORES APAGADOS
movlw b'00000001'
movwf ANSEL;Seleciono channel AN0 como analogico
movlw b'11111001'
movwf TRISA; configuro bit 2-1 como salida bit 0 entrada analogica
movlw b'00000000';salidas la display
movwf TRISB
bcf STATUS,RP0; vuelvo a banco 0
return
-
si, por ahora el error que veo es que tiene mal seteado el ADCON0, porque le tiene cargado tan solo 7 bits y de los cuales los bits del 5 al 3 deben ser 000 para elegir el canal AN0, asi como lo tienes has elegido el AN4
-
si, por ahora el error que veo es que tiene mal seteado el ADCON0, porque le tiene cargado tan solo 7 bits y de los cuales los bits del 5 al 3 deben ser 000 para elegir el canal AN0, asi como lo tienes has elegido el AN4
Gracias por marcarme el error, ahora me varia el valor, pero solo obtengo 3 valores en el conversor al variar el voltaje desde 0 a 5v. Puede ser por Vref?
-
que resolucion necesitas 10 u 8 bits? tienes justificado a la derecha. Aparte, estas usando oscilador RC o cristal?, pon el codigo
-
que resolucion necesitas 10 u 8 bits? tienes justificado a la derecha. Aparte, estas usando oscilador RC o cristal?, pon el codigo
Yo necesitaria por lo menos 8 bits de resolucion, uso el oscilador interno de 4 MHz. Es para hacer un termometro. Los resultados de la conversion la muestro en un display multiplexado de 2 digitos, Muestro los 2 ultimos digitos decimales del valor del registro ADRES. Al variar la tension analogica tendrian que variar los valores que veo en el display pero solo obtengo 3 valores. Este es el programa principal:
LIST p=16F88
binH EQU 20H
binL EQU 21H
bcdH EQU 22H
bcdM EQU 23H
bcdL EQU 24H
counter EQU 25H
temp EQU 26H
Resultado_L EQU 27H
Resultado_H EQU 28H
CONTA1 EQU 29H
CONTA2 EQU 2AH
STATUS_TEMP EQU 2BH
binL_TEMP EQU 2CH
binH_TEMP EQU 2EH
ORG 00H
GOTO PROGRAMA
#INCLUDE "p16F88.inc"
#INCLUDE "bin2bcd16.inc"
#INCLUDE "IniPort.inc"
#INCLUDE "sad.inc"
#INCLUDE "display.inc"
#INCLUDE "retardo20micros.inc"
#INCLUDE "retardo30micros.inc"
#INCLUDE "retardo4ms.inc"
#INCLUDE "tabla.inc"
PROGRAMA
CLRF binH;
CLRF binL
CLRF bcdL
CLRF bcdM
CLRF bcdH
CLRF ADRESH
;-------------------------------------------
BSF STATUS,RP0;SELECCIONO BANCO 1
MOVLW b'10001000';OPCIONES
MOVWF OPTION_REG;
;--------------CONFIGURO OPCIONES------------
MOVLW B'01100110' ; OSCILADOR INTERNO 4 MHz
MOVWF OSCCON
CLRF OSCTUNE
;----------CONFIGURO OSCILADOR-------------
CLRF ADRESL
BCF STATUS,RP0;SELECCIONO BANCO 0
CALL IniPort; configura port
CALL InicializeAD; Inicializa A/D
LOOP CALL Conversion; convierte
CALL _bin2bcd ; CONVIERTO A BCD LOS VALORES DEL CONVERSOR
CALL display
GOTO LOOP
END;
-
si necesitas solo 8 bits usa la justificacion a la izquierda
-
si necesitas solo 8 bits usa la justificacion a la izquierda
Ahora que lo justifique a la isquierda, parece que varia continuamente, pero no se porque justificandolo a la derecha solo me da los numeros: 01, 02 y 03. Ahora cuando tengo 5V los ultimos digitos de ADRESH me dan 55 y para 0V me da 00. Estara bien?
-
La justificación izq deja los 8 bits más significativos en ADRESH, si ignoras los dos de menor peso que quedan en ADRESL. Pero si usas justificacion derecha, entonces la idea es convertir en 10 bits utilizando ADRESH como el valor MSB y ADRESL como LSB.
Sobre el conversor AD hay muchos hilos en el foro, aparte de lo que puedes encontrar en google, por citar unos valiosos hilos:
Teoria sobre ADC (http://www.todopic.com.ar/foros/index.php?topic=33287.0)
Modulo de conversion analogo/digital (http://www.todopic.com.ar/foros/index.php?topic=27929.0)
Ahora, la variacion debe ser 5V>>255 y con 0V>>000, te hace falta mostrar un digito, aparte, ese valor corresponde al valor de la conversion A/D pero NO a la temperatura
-
Gracias por tu ayuda ahora tengo que hacer los calculos para transformalo en temperatura, tengo que conseguir una rutina de multiplicacion de 16bits. Todavia no se como voy a hacer para colocar el punto decimal en numeros menores que 10 o 1, pero bueno
-
esa rutina de multiplicacion está en el foro en ”Almacen del assembler”
-
Ahora una pregunta: Para calcular la temperatura, tengo que multiplicar el valor del conversor por 39 (100/255=0.392) aproximadamente. Pero como hago para saber en donde debo poner el punto decimal ? como lo calculo?
-
sería cuestion de buscar, de pronto esas rutinas ya estan hechas, en assembler se vuelve un poco tedioso las operaciones. Cuando me topé con ese detalle y otros decidí pasarme al lenguaje C.
-
sería cuestion de buscar, de pronto esas rutinas ya estan hechas, en assembler se vuelve un poco tedioso las operaciones. Cuando me topé con ese detalle y otros decidí pasarme al lenguaje C.
Ya solucione la rutina en asm, me costo pensar un poco pero lo hice. Ya tengo mi termometro en la pared :-/ y hacen 33°C, que calor! Gracias por la ayuda.
-
:shock: :shock: 33 grados?!?? :? Que bueno que lo hayas logrado ;-)
-
Y 42 también!!
O en invierno -7 es normal aquí...
-
yo pensaba que en argentina reinaba el frio
-
Je..je
Argentina es un país muy largo, bastante por debajo del trópico, pero tiene todos los climas.
Para darte una idea la distancia desde Ushuaia hasta la Quiaca es de 4882 kilómetros, y no son los puntos mas alejados del pais, aunque si los mas alejados en el sentido del trópico al polo sur.