Convertidor AD de 10bits

Hola, estoy tratando de utilizar los 10 bits del convertidor ADC del PIC16F874.
El dato de ADRESH, lo paso a ADRESH1
El dato de ADRESL, lo paso a ADRESL1
Luego decremento ADRESH1 hasta llegar a 0x00 y decremento ADRESL1 una unidad, y vuelvo a decrementar ADRESH1 y así sucesivamente; mientras ocurre esto, incremento unidades hasta 9, después incremento decenas y borro unidades y así sucesivamente, supaongamos que en los 10 bits tengo '1111111111', entonces cuando se termine el proceso de conversión debo de tener 1024 en miles, centenas, decenas, unidades, respectivamente.
Aquí presento mi código.
Con_bintoDEC_10
movlw 0x30
movwf MILES
movwf CENTENAS
movwf DECENAS
movwf UNIDADES
P_ADRESH
movf ADRESH1,F
btfsc ESTADO,2
goto P_ADRESL
movf ADRESL1,F
btfsc ESTADO,2
goto DEC_ADRESH1
goto DEC_ADRESH1
P_ADRESL movf ADRESL1,F
btfsc ESTADO,2
return
decf ADRESL1,1
DEC_ADRESH1 decf ADRESH1,1
goto INC_UNI
INC_UNI
incf UNIDADES,1
movlw 0x39
subwf UNIDADES,W
btfss ESTADO,2
goto P_ADRESH
movlw 0x30
movwf UNIDADES
incf DECENAS,1
movlw 0x39
subwf DECENAS,0
btfss ESTADO,2
goto P_ADRESH
movlw 0x30
movwf DECENAS
incf CENTENAS,1
movlw 0x39
subwf CENTENAS,0
btfss ESTADO,2
goto P_ADRESH
movlw 0x30
movwf CENTENAS
return
Bueno, en esta rutina desde el principio las variables CENTENAS, DECENAS y UNIDADES, se trabajan con números hexadecimales para que al pasarlos al LCD se presenten en forma decimal. Pero mi pregunta es, por que en el LCD tarda en visualizarse la conversión y se presenta un pequeño instante y luego presentan puros ceros, y así sucesivamente. He simulado esta rutina y aquí se ve que los datos varían de manera ordenada. Cual sera el problema en mi rutina.

1 respuesta

Respuesta
1
La rutina convierte un número hexa de la parte alta y un número en hexa en parte baja en unidad decena miles, etc.
Esto es: un número decimal que está comprendido entre 0 y 9.
Debes estar haciendo algo mal. Si tienes en la parte alta 00 y en la parte baja 01, la rutina te mostrará 00001.
No entiendo como es que te muestra 256.
La única posibilidad para esto último es que tengas 01 en la parte alta y 00 en la baja. De este modo la rutina mostrará 00256.
Debes estar confundiendo los bancos.
La rutina de convertir ad debería ser así
;**************************************************************************
;RUTINA QUE CONVIERTE A-D EL CANAL0 DEL PIC estado del tanque
;**************************************************************************
AD0 MOVLW B'11000001' ;RC, AD=ON
Soto movwf adcon0 ;primer canal de a/d por estado del tanque
BCF PIR1, ADIF ;FLAG EN CERO
BSF ADCON0, ;GO
LOOPEAR BTFSS PIR1,ADIF ;FLAG EN 1?
GOTO LOOPEAR
BANK1
MOVF ADRESL, W
BANK0
MOVWF ADTEMPL
MOVF ADRESH, W
MOVWF ADTEMPH
RETLW 0
Esto debe funcionar a la perfección.
Entiendo que lo que visualizas es el resultado de convertir en unidad, decena, centena.
Para este tema lo que yo hago es usar una rutina que saqué de piclist.com. allí encontrarás todas las rutinas matemáticas que se te ocurran.
Yo uso una de John Payson que divide un número de 16 bits en unidad, decena, centena, milena y diezmilena. Pruébalas y luego me cuentas si funciona.
También la puedes usar para comparar los procedimientos de John y tuyo. Suerte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas