TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Acumulador13 en 02 de Junio de 2009, 07:52:28
-
Hola a todos, antes de nada quiero agradecer a tod@s los que haceis posible este foro, el tema que me lleva a la consulta es le siguiente: He configurado el conversor AD del PIC16f88 y me realiza la conversion si la paso a PORTB y enciendo unos led, pero cuando lo guardo en un registro (TEMP_AD) no me lo guarda y es todo ceros. mi programa es el siguiente:
;* **** Jordi Jover Barceló 2009 **** *
;* TITULO:Uso del conversor A/D *
;* FECHA:28-MAYO-2009 *
;* NOMBRE FICHERO: ConversorAD.asm VERSION:1.0 *
;* COMENTARIO:Uso y pruebas para el conversor del PIC16F88A.En este caso apago un led *
;* en Rb0 si superamos la tension en el A/D
;* *
;* *
;* *
;* *
;* *
;* *
;***************************************************************************************
; ****CONFIGURACIÓN DEL MICROCONTROLADOR****
; list p=16F88
PROCESSOR 16F88
INCLUDE "p16f88.inc"
RADIX DEC
; INCLUDE "retardos.inc"
ERRORLEVEL -302
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
ORG 0x20
;*********************************ETIQUETADO REGISTROS********************************
V12 EQU b'00110010'
V11 EQU b'11111010'
Contador1 EQU 0Ch
Contador2 EQU 0Dh
Temp_AD EQU 30h ;Registro temporal para guardar dato convertido
Valor_FIJO EQU 31h ;Registro para introducir el valor de tensión de corte
;*********************************INICIO***************************************
inicio
banksel ANSEL
movlw B'00000001' ;Configuro el registro ANSEL para que RA0 sea Analogico (1) y los otros DIGITALES (0)
movwf ANSEL
banksel TRISB
movlw B'00000000' ;Todo PORTB lo configuro a SALIDA, todo ceros
movwf TRISB
banksel TRISA
movlw b'000000' ;Todo PORTA lo configuro a SALIDA menos Ra1
movwf TRISA
banksel ADCON1
movlw B'00000000' ;Configuro ADCON1 para Justificacion Izq, divisor relog por 2 deshabilitado,tension de referencia AVDD y AVSS
movwf ADCON1
banksel ADCON0
movlw B'00000001' ;Configuro ADCON0 para Fosc/8, Selecciono canal 0 (RA0/AN0)y hago operativo el módulo convertidor con el último bit a 1
movwf ADCON0
;************************************PRINCIPAL***********************************
clrw
movwf PORTA
movwf PORTB
clrf PORTB
bsf PORTB,0
bsf PORTB,1
bcf INTCON,GIE
bcf INTCON,PEIE
call Conversion
subwf V12,w
btfsc STATUS,Z
bcf PORTB,0
STOP
goto STOP
Conversion
bsf ADCON0,2 ;Comienzo conversión
Espero_Conv
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv
movf ADRESH,w ;Conversión efectuada, salvo ADRESH en W
movwf PORTB
return
end
En fin...nunca he trabajado con los AD y siempre he utilizado el PIC16f84A , si me podeis echar una mano os lo agradeceria.
Gracias
-
:shock: :shock:Perdon, en el ejemplo que he puesto, lo paso al PORTB, en el que no me va es cuando lo ingreso en el registro Temp_AD y lo utilizo para comparar.
Al modificarlo haciendo pruebas lo he borrado, luego lo paso...perdon otra vez
-
Ve por pasos.
Si muestra correctamente en el puerto B pues, lo proximo sería mover ADRESH a una variable y luego mover la variable al puerto.
Si funciona mal es que no has declarado correctamente la variable o estas fuera del rango de memoria de uso general.
Si funciona bien sigues , le haces una comparacion y lo muestras por puerto. O simplemente compara y si el dato es 0 que te encienda un led para saber que algo va mal.-
Cuando algo no funciona lo que hago es ir metiendo BSF LED hasta que encuentro en que lugar falla.
-
Para mi, te está haciendo confundir la última parte del código (en orden de ejecución) Al final de la conversión y después de haber restado analizas el bit Z, si es 1 (el resultado es 0)
Al principio del programa colocas clrf PORTB por lo que todos los bit son 0 y cuando haces la comparación y el bit Z es 1, colocas en 0 (de nuevo) a bit 0 del PORTB pero si el bit Z es 0 salta y deja al bit 0 del PORTB en 0, porque así lo declaraste al principio.
subwf V12,w
btfsc STATUS,Z
bcf PORTB,0
STOP
goto STOP
Coloca una línea mas a este programa
subwf V12,w
btfsc STATUS,Z
bcf PORTB,0
bsf PORTB,0
STOP
goto STOP
-
No lo creo , leo.
subwf V12,w
btfsc STATUS,Z
bcf PORTB,0
bsf PORTB,0
STOP
goto STOP
De esta manera lo que hará será , si el resultado es 0 entonces apagará el led (que ya venía encendido con el bsf portb,0 mas arriba o dependiendo de lo que traiga de mover el ADRESH al puerto B) e inmediatamente y sin que él lo pueda notar lo encenderá con el bsf portb,0
Si el resultado es uno hará exactamente lo mismo, porque lo único que hará será saltearse el bcf potb,0.
Entonces sería:
subwf V12,w
btfsc STATUS,Z
goto es_0
bcf PORTB,0
goto STOP
es_0
bsf PORTB,0
STOP
goto STOP
Lo que no entiendo y aunque no influye es:
clrw ; w=0
movwf PORTA ;porta =0
movwf PORTB ; portb=0
clrf PORTB ;portb =0
bsf PORTB,0 ; bit 0 del puerto b =1
bsf PORTB,1 ; bit 1 del puerto b =1
Yo en tu lugar si quiero encender un led para ver guiarme donde puede estar el error ,no utilizaría el mismo puerto donde estoy sacando los resultados sino que usaría RA1, por ejemplo.
-
:oops: :oops: :oops: ouch, que feo me equivoqué :( :(
Gracias por la corrección.
-
Muchas gracias a todos, esta noche lo pruebo a ver que tal y os paso bien el código que con las prisas y mi primer mensaje no esta como el último que hice.
Haré las pruebas que me decis. Cuando cojo la conversión y la muevo a PORTB continuamente me va de maravilla, se me van encendiendo todos los led puestos a este puerto según voy girando el potenciomentro, el problema es que cuando lo guardo en otro registro ( Temp_AD) o me desactiva a un nivel muy cercano a 5Voltios ó si cambio la variable a comparar me lo desactiva a un nivel cero, no encuentro un punto intermedio como por ejemplo 2,5V, ponga la variable que ponga.
En fin , siempre he utilizado los pic en digital y ahora que consigo la conversión es normal que me ocurra estos fallos ( cabe decir que he estudiado los pic por mi cuenta, con lo cual debo de tener errores adquiridos ) de todas formas cada fallo que tengo me hace estar mas cerca de hacerlo bien. Repito, muchas gracias por vuestras respuestas y espero poder ayudar yo tambien, que aunque de pic estoy verde en fuentes de alimentación, transformadores y baterias me defiendo bien, y... Como digo Humprey Bogart...." esto es el principio de una gran amistad.
Si puedo esta noche posteo el esquema, el código y os comento algo.
Muchas gracias :)
-
:-/ Apreciados compañeros, ya he solucionado el tema de mi duda con el conversor, resulta que cuando hago la resta el valor del resultado se me queda en el mismo registro, ya no tiene el valor de antes. Lo he solucionado asi:
Comparación2
subwf VBat
addwf VBat >>>>>>>ESTO ES LA SOLUCIÓN A TODOS MIS PROBLEMAS!!!!!!!
btfsc STATUS,C
goto Programa1
Ahora si la tensión VBat está mas baja que la que tengo en W (previamente guardado) me va a Programa1 :mrgreen: :mrgreen:
Todo el domingo probado y a última hora me fue en el MPLAB, hoy Lunes ya lo he programado y funcionando de maravilla.
Gracias a LeonPic y a Pibe ya que os leo mucho y aprendo mucho.
-
Perdon, el programa queda así:
;***************************************************************************************
;* ****CREATEC**** *
;* **** Jordi Jover Barceló 2009 **** *
;* TITULO:Uso del conversor A/D *
;* FECHA:15-JUNIO-2009 *
;* NOMBRE FICHERO: ConversorAD.asm VERSION:1.0 *
;* COMENTARIO:Uso y pruebas para el conversor del PIC16F88A. *
;* *
;* *
;* *
;* *
;* *
;* *
;* *
;***************************************************************************************
; ****CONFIGURACIÓN DEL MICROCONTROLADOR****
; list p=16F88
PROCESSOR 16F88
INCLUDE "p16f88.inc"
RADIX HEX
; #INCLUDE "retardos.inc"
ERRORLEVEL -302
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB3 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_OFF & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
CBLOCK 0x20
ENDC
ORG 0x00
goto inicio
#include Retardos.inc
;*********************************ETIQUETADO REGISTROS********************************
Contador1 EQU 0Ch
Contador2 EQU 0Dh
Lamp3 EQU b'00000100'
VBat EQU 3Dh
VCorte1 EQU 4Ch ;Registro para introducir el valor de tensión de corte
;*********************************INICIO***************************************
inicio
banksel ANSEL
movlw B'00000001' ;Configuro el registro ANSEL para que RA0 sea Analogico (1) y los otros DIGITALES (0)
movwf ANSEL
banksel TRISB
movlw B'00000000' ;Todo PORTB lo configuro a SALIDA, todo ceros
movwf TRISB
banksel TRISA
movlw b'000000' ;Todo PORTA lo configuro a SALIDA, todo ceros
movwf TRISA
banksel ADCON1
movlw B'00000000' ;Configuro ADCON1 para Justificacion Izq, divisor relog por 2 deshabilitado,tension de referencia AVDD y AVSS
movwf ADCON1
banksel ADCON0
movlw B'01000001' ;Configuro ADCON0 para Fosc/8, Selecciono canal 0 (RA0/AN0)y hago operativo el módulo convertidor con el último bit a 1
movwf ADCON0
;************************************PRINCIPAL***********************************
clrw
movwf PORTA
movwf PORTB
clrf PORTB
Conversión
bsf ADCON0,2 ;Comienzo conversión
Espero_Conv
btfsc ADCON0,2 ;Espero a que finalice la conversión
goto Espero_Conv
movf ADRESL,w ;Conversión efectuada, salvo ADRESH en W
movwf VBat
; movwf PORTB ;Esto es para comprobar en el puerto b la conversión.
movlw b'01111111' ;Valor primer registro de tensión (11,5V)
movwf VCorte1
Comparación
subwf VBat
addwf VBat
btfsc STATUS,C
goto Lamps
goto Conversión
Lamps
movlw Lamp3
movwf PORTB
-
Felicidades Acumulador13 :-/ :-/ :-/