TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: superprp en 04 de Marzo de 2008, 15:21:24
-
Tengo un problema y no se cual puede ser, tengo un código de leer tres infrarrojos de sharp por RA2,RA3 Y RA4 y de sacarme un valor digital al llegar a una cierta distancia por RC5, RC6, RC7 pero cuando conecto algo a RA2, o RA4, no me hace nada, y cuando lo conecto a RA3 me funciona pero me modifica además el RC7, bueno, aquí está el código que lo explica mejor:
org 0x00
goto inicio
org 0x08
org 0x18
org 000020h
inicio
;preparamos los registros
;configuramos los pines de E/S:
bsf TRISA, 0 ;entrada analógica del sensor
bsf TRISA, 2 ;entrada infrarrojo derecha
bsf TRISA, 3 ;entrada infrarrojo central
bsf TRISA, 4 ;entrada infrarrojo izquierda
bcf TRISC, 5 ;salida infrarrojo derecha
bsf TRISC, 6 ;salida infrarrojo central
bsf TRISC, 7 ;salida infrarrojo izquierda
clrf LATA ;reseteamos todos los puertos
clrf LATC
;configuramos las entradas analógicas
bsf ADCON0, 0 ;habilitar A/D
bsf ADCON0, 1 ;inicialmente a 0, poner a 1 para iniciar la conversión (comprobar despues hasta leer 0, finalizada la conversión)
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL C
bcf ADCON0, 2
bcf ADCON0, 4 ;canal simple habilitado
bcf ADCON0, 5 ;modo simple (=1 modo continuo)
bcf ADCON1, 4 ;buffer FIFO deshabilitado
bcf ADCON1, 6 ;Referencia de tensión analógica interna
bcf ADCON1, 7
bcf ADCON2, 0 ;reloj de conversión Fosc/4
bcf ADCON2, 1
bsf ADCON2, 2
bcf ADCON2, 3 ;sin retardo para la conversión
bcf ADCON2, 4
bcf ADCON2, 5
bcf ADCON2, 6
bcf ADCON2, 7 ;justificación izquierda
bcf ADCON3, 0 ;sin disparo para la conversión
bcf ADCON3, 1
bcf ADCON3, 2
bcf ADCON3, 3
bcf ADCON3, 4
bsf ANSEL0, 2 ;AN2 con entrada analógica y no digital(=0)
bsf ANSEL0, 3 ;AN3 con entrada analógica
bsf ANSEL0, 4 ;AN4 con entrada analógica
clrf ADCHS ;selección de grupos A,B,C,D
bsf ADCHS, 0 ;selecciono el AN4 en lugar de AN0
bsf ADCON0, 1 ;EMPEZAMOS LA CONVERSIÓN
polling
;COMPROBAMOS LOS INFRARROJOS ¿OBSTÁCULO?
btfss ADCON0, 1
call leer_analogico
goto polling
;SUBRUTINA LEER ANALÓGICO
leer_analogico
; movlw b'00010100' ;comprobamos si está a menos de 30cm (0.4v)
movlw b'00101110' ;comprobamos si está a menos de 15cm (0.9v)
subwf ADRESH
bnc encender ;si está a menos de 30cm encendemos un aviso
nop
nop
apagar
clrf alerta ;si no apagamos el aviso
return
encender
movlw 0x01
movwf alerta
comprueba
btfsc cont_an, 1 ;¿quién ha sido?
goto leer_infrarrojo3
btfss cont_an, 0
goto leer_infrarrojo1
goto leer_infrarrojo2
leer_infrarrojo1
btfss alerta, 0
goto cuenta1
goto reset1
cuenta1
movlw 0x01
addwf infra1
movlw 0xFF
subwf infra1
bnc alerta1
return
reset1
clrf infra1
bsf LATB, 7
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL D
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
alerta1
bcf LATB, 7
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL D
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
leer_infrarrojo2
btfss alerta, 0
goto cuenta2
goto reset2
cuenta2
movlw 0x01
addwf infra2
movlw 0xFF
subwf infra2
bnc alerta2
return
reset2
clrf infra2
bsf LATB, 6
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL B
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
alerta2
bcf LATB, 6
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL B
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
leer_infrarrojo3
btfss alerta, 0
goto cuenta3
goto reset3
cuenta3
movlw 0x01
addwf infra3
movlw 0xFF
subwf infra3
bnc alerta3
return
reset3
clrf infra3
bsf LATB, 5
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL C
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
alerta3
bcf LATB, 5
bsf ADCON0, 3 ;SELECCIONAMOS EL CANAL C
bsf ADCON0, 2
bsf ADCON0, 1 ;volvemos a activar la lectura analógica
incf cont_an
return
ESPERO QUE PODAIS AYUDARME HABER PORQUE NO ME FUNCIONA EL PROGRAMA
GRACIAS!!
-
Leyendo y leyendo (no ya en el datasheet, si no en un pdf de especificaciones de programación que he encontrado en la pagina de microchip) he visto que si programo el PIC con LVP el pin RB5 no funciona correctamente parece ser, por lo que lo he programado con LVP a '0', pero ahora lo que me sucede es que me tarda como unos 30 segundos o casi 1 minuto en convertir el valor analógico, y antes el resto de valores analógicos los hacía al instante, ¿a que puede ser debido?
-
superprp , no he usado ese pic pero también te confieso que me es tedioso leer tu código. Te sugiero uses el include del pic en cuestión y uses los nombres de los bits de cada registro en vez de usar el número.
Lo del include sería agregar arriba de tu código algo asi como
list P=PIC18F2331
#include P18F2331.INC
Una vez hecho eso podrías hacer por ejemplo
bsf ADCON0,ADON
en vez de
bsf ADCON0,0
Como ves, eso hace más legible al código. Es más fácil darse cuenta y recordar la palabra ADON, que el bit 0 del ADCON0, sobre todo cuando tienes en la cabeza varios registros y bits de varios micros.
Al respecto de los fuses, el LVP está bien que lo tengas desactivado ya que solo molestará si no vas a usar el modo LVP. En cuanto a los demás fuses, como los tienes? Qué cristal usas? activas el watchdog?
-
ok, lo siento por la ilegibilidad, pero a mi me resulta mas facil trabajar con la posición del bit que con el nombre de cada bit, la proxima vez lo pondré mas legible para que me podais ayudar mejor.
los fuses activos son:
-Ext RC CLKO RA6
-FCMEM
-IESO
-BOREN
-WDTEN
-FLTAMX
-SPSMX
-GPTREN
-EXCLKMX
-MCLRE
-STVREN
-WDPSO
-WPDS1
-WPDS2
-WPDS3
-HPOL
-LPOL
-VINEM
-PWMPIN
-PWM4MX
el resto están inactivos
-
-WDTEN
Este bit en concreto te activa el WatchDog timer, el cual reseteará tu micro constantemente.
Puedes desactivarlo o bien agregar una instrucción clrwdt en tu código en un lugar que se ejecute con frecuencia.
El BORENhará resetear tu pic si el voltaje supera los 5.2V por ejemplo, también lo puedes deshabilitar por ahora así no tienes problemas con eso.
El clock lo tienes activado como un RC externo (Fuse: Ext RC CLKO RA6) , es esto correcto? o estas usando un cristal? Revisa ese flag también
-
Estoy usando un cristal de 4Mhz (me podrías explicar como se configura y para que es lo del ext RC CLKO RA6?) y en que puede afectar?
lo he puesto como XT pero el conversor analógico no me funciona correctamente, el resto de elementos si, porque cuando tenía el LVP activado me funcionaba bien el conversor y acuando lo desactivo no? a que puede ser debido?
-
Estoy usando un cristal de 4Mhz (me podrías explicar como se configura y para que es lo del ext RC CLKO RA6?) y en que puede afectar?
Al modo de oscilador. Si te fijas en el datasheet del PIC tienes todos los modos de oscilador que trae incorporado el PIC, no tendría sentido que copie y pegue el datasheet acá para poner exactamente lo mismo, pero para ser breve y explicativo, uno puede decidir entre varias opciones qué hardware usar en estos pics para usarlo como referencia de clock al mismo.
lo he puesto como XT pero el conversor analógico no me funciona correctamente, el resto de elementos si, porque cuando tenía el LVP activado me funcionaba bien el conversor y acuando lo desactivo no? a que puede ser debido?
Tal vez tengas mal la referencia del tiempo de conversión en el A/D (esto depende de la frecuencia del oscilador), el LVP no tiene nada que ver con el modo de oscilación. Tal vez al modificar lo del LVP también cambiaste lo del cristal y por ende la frecuencia de operación.
Saludos
-
Extrañamente solo cambiaba LVP, y me funcionaba, al cambiarlo, me dejo de funcionar... como se configura lo del A/D?? porque en el datasheet te vienen las opciones pero no las entiendo muy bien,
fosc/2,fosc/4, fosc/16 ... diferencia?
Tad, para que sirve?
y otros registros de configuración que no entiendo y en el datasheet no lo explica bien o no lo termino de entender yo
-
Extrañamente solo cambiaba LVP, y me funcionaba, al cambiarlo, me dejo de funcionar... como se configura lo del A/D?? porque en el datasheet te vienen las opciones pero no las entiendo muy bien,
fosc/2,fosc/4, fosc/16 ... diferencia?
Tad, para que sirve?
y otros registros de configuración que no entiendo y en el datasheet no lo explica bien o no lo termino de entender yo
Bueno lo del LVP realmente no me explico.
superprp algo que debes comprender es que los datasheets de los microcontroladores te explican cómo configurar su módulo A/D, su módulo uart, spi, etc, pero no te van a explicar cómo funciona un A/D, o cómo calcular una resistencia o lo que es una capacidad.
Las dudas que tienes son más que nada de cómo funciona un A/D, bueno, para hacerla simple requieren de una base de tiempo o clock que les permite funcionar e ir digitalizando la cuenta. Un TAD es el tiempo que tarda en convertir un bit , dicho tiempo debe tener un mínimo valor ya que si lo haces más pequeño el A/D perderá precisión porque lo quieres utilizar más rápido de lo que puede funcionar con precisión.
En general dicho tiempo es 1.6useg, lo que haces al configurar el módulo A/D es 'escalar el clock del microcontrolador' para que el tiempo del A/D (o clock del A/D) no sean tan rápido como para que el A/D no funcione bien.
Te dejo un link que escribí hace tiempo que tal vez te sirva más para aclarar el punto.
http://www.todopic.com.ar/foros/index.php?topic=14529.msg88942#msg88942
-
Muchas gracias por la info, de todas formas, modificando el Tad, y la fosc/.. sigue sin funcionarme, bueno, realmente lo que me hace es algo muy extraño, y es que le tengo puesto que para una tensión y encienda un led, y cuando baje de un umbral se apague, pues bien, lo enciendo y vale, subo la tensión y tarda 3 minutos contados en encender el led, bajo la tensión y tarda otros 3 minutos en apagarlo... puede ser debido a alguna otra cosa? o solo al conversor A/D? el resto de elementos conectados al PIC me funcionan bien, dos timers que uso me funcionan bien...