TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: enzo84 en 13 de Diciembre de 2008, 02:49:44
-
LIST P=16F876A
PROCESSOR 16F876A
INCLUDE "P16F876A.INC"
RADIX DEC
__IDLOCS H'0000'
ERRORLEVEL 0, -302, -306
__CONFIG
_CP_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_DEBUG_OFF&_XT_OSC&_WDT_OFF&_WRT_OFF
;ORG 20H
ORG 00h
Inicio:
BSF STATUS,RP0
BCF STATUS,RP1 ;pagina 1
movlw b'00001001' ;justificación a la izquierda (8bits)
movwf ADCON1
movlw b'11000111' ;3 entradas analogicas
movwf TRISA
MOVLW b'11111111'
MOVWF TRISC ;todos en el c como entrada (6 y 7)
BCF STATUS,RP0 ;pagina 0
movlw b'01000001'
movwf ADCON0 ;enciendo el adc y Fosc/8
BSF RCSTA,SPEN
BSF STATUS,RP0 ;pagina 1
MOVLW 24H
MOVWF TXSTA
MOVLW 25
MOVWF SPBRG
BSF TXSTA,TXEN
BCF STATUS,RP0 ;pagina 0
MOVLW 90H
MOVWF RCSTA
Start:
btfsc PORTC,0 ;cuando se presiona, comienza Bucle
goto Start
Bucle:
bcf ADCON0,3 ;selecciono
bcf ADCON0,4 ;canal 0
NOP
bsf ADCON0,2 ;inicio conversion en canal 0
btfsc ADCON0,2 ;espero a que termine la conversion
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio el dato del canal 0
NOP
NOP
bsf ADCON0,3 ;selecciono
bcf ADCON0,4 ;canal 1
NOP
bsf ADCON0,2 ;inicio conversion en canal 1
btfsc ADCON0,2 ;espero a que la conversión termine
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio en dato del canal 1
NOP
NOP
bcf ADCON0,3 ;selecciono
bsf ADCON0,4 ;canal 2
NOP
bsf ADCON0,2 ;inicio conversion en canal 2
btfsc ADCON0,2 ;espero a que la conversion termine
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie el buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio el dato del canal 2
NOP
NOP
goto Bucle
END
-
Hola a todos foreros! Le ven algún problema al código anterior?, paso a explicar:
El pic es un 16f876a, la configuración es la mínima, cristal, dos condensadores, dos tierras y dos conexiones a +5v, además, la conexión para tx y rx de la línea serial.
Uso los pines ra0, ra1, y ra2 como entradas analógicas, y la idea es muestrearlas y enviarlas por rs232 todo el tiempo.
Cual es el problema?, bueno, funciona, pero solo el canal 1(ra0), del canal 2(ra1) me llegan 2,5 voltios aproximadamente, cuando pongo esa pata a +5v, y del canal 3(ra2) me llega una tensión aún menor cuando pongo esa pata a cero, creo que unos 1,25 voltios (sospechosamente hay un patrón ahí).
Lo primero que pensé es, se cagó el módulo adc del pic, pero después dije, ese no es el problema, sino que el problema está en la multiplexación, tiempo quizás? bueno, lo modifiqué y le puse un retardo de 4 milisegundos (mucho) entre cada muestra, y hacía lo mismo, así que lo dejé como estaba.
Después probé hacer un bucle en el que solo tome muestras del canal 3 o RA2 y adivinen que, funcionaba bien, cuando lo ponía a cero, me llegaba un cero, y cuando lo ponia a +5v a esa pata (pata 4 del pic) me llegaba un 255, osea, +5v.
Olvidé mencionar que la tensión de referencia es 5v como podrán ver en la configuración.
Qué puede ser? el cristal que uso es de 4 Mhz.
Lo próximo que voy a probar es hacer la secuencia inversa para sacarme la duda de si es problema en la multiplexación, es decir, muestrear primero RA2, después RA1, y finalmente RA0, si el problema es ese, debería mostrarme bien los valores de RA2, pero no los de RA1, y RA0.
A alguien le pasó?
Desde ya muchas gracias...
-
Otra cosa que me olvidé mencionar es que también uso un botoncito para comenzar la adquisición... pero eso no es problema.
-
Bueno gente con la ayuda de NANO1985 a estas horas de la madrugada se solucionó el problema.
Las modificaciones fueron, agregarle unos NOPs (demasiados quizás) para darle tiempo a que se efectúen los cambios en el multiplexor y en los registros de configuración (ADCON0,ADCON1), y la segunda modificación y la más crítica, que creo que es por esto que no funcionaba, el apagado del módulo COMPARADOR que me dijo NANO1985 que el lo apagaba.
Evidentemente el comparador interfiere, a continuación, el nuevo programa:
LIST P=16F876A
PROCESSOR 16F876A
INCLUDE "P16F876A.INC"
RADIX DEC
__IDLOCS H'0000'
ERRORLEVEL 0, -302, -306
__CONFIG _CP_OFF&_PWRTE_ON&_BODEN_OFF&_LVP_OFF&_DEBUG_OFF&_XT_OSC&_WDT_OFF&_WRT_OFF
;ORG 20H
ORG 00h
Inicio:
BSF STATUS,RP0
BCF STATUS,RP1 ;pagina 1
movlw b'00000111' ;APAGO COMPARADOR
movwf CMCON
movlw b'00001001' ;justificación a la izquierda (8bits)
movwf ADCON1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
movlw b'00000111' ;3 entradas analogicas
movwf TRISA
MOVLW b'11111111'
MOVWF TRISC ;todos en el c como entrada (6 y 7)
BCF STATUS,RP0 ;pagina 0
movlw b'01000001'
movwf ADCON0 ;enciendo el adc y Fosc/8
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BSF RCSTA,SPEN
BSF STATUS,RP0 ;pagina 1
MOVLW 24H
MOVWF TXSTA
MOVLW 25
MOVWF SPBRG
BSF TXSTA,TXEN
BCF STATUS,RP0 ;pagina 0
MOVLW 90H
MOVWF RCSTA
Start:
btfsc PORTC,0 ;cuando se presiona, comienza Bucle
goto Start
Bucle:
movlw b'01000001' ;SELECCIONO CANAL 1 - RA0
movwf ADCON0 ;enciendo el adc y Fosc/8
NOP
NOP
NOP
NOP
NOP
NOP
NOP
bsf ADCON0,2 ;inicio conversion en canal 0
NOP
NOP
btfsc ADCON0,2 ;espero a que termine la conversion
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio el dato del canal 0
NOP
NOP
movlw b'01001001' ;SELECCIONO CANAL 2 - RA1
movwf ADCON0 ;enciendo el adc y Fosc/8
NOP
NOP
NOP
NOP
NOP
NOP
NOP
bsf ADCON0,2 ;inicio conversion en canal 1
NOP
NOP
btfsc ADCON0,2 ;espero a que la conversión termine
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio en dato del canal 1
NOP
NOP
movlw b'01010001' ;SELECCIONO CANAL 3 - RA2
movwf ADCON0 ;enciendo el adc y Fosc/8
NOP
NOP
NOP
NOP
NOP
NOP
NOP
bsf ADCON0,2 ;inicio conversion en canal 2
NOP
NOP
btfsc ADCON0,2 ;espero a que la conversion termine
goto $-1
movf ADRESH, W
BTFSS PIR1,TXIF ;espero a que se vacie el buffer de salida
GOTO $-1
MOVWF TXREG ;cuando se vacia envio el dato del canal 2
NOP
NOP
goto Bucle
END
Funciona!! Gracias NANO1985!...