Conversion con PIC 16f876a

Tengo una duda sobre una conversión A/D con el PIC 16F876A.
Hago lo siguiente, pero no me funciona:


; Como no quiero interrupciones por eso empiezo asi
INICIO
bsf STATUS,RP0
clrf TRISC
clrf TRISB
movlw b'00001011'
movwf TRIS

; bit 7-6:ADCS1:ADCS0: bit de selección de reloj para el Convertidor A/D, No pongo en marcha la conversion
; bit 5-3:CH2:CH0: bit de selección del canal analógico canal 0
; bit 2:GO/#DONE. bit de estado de la conversión A/D
; bit 1: No implementado: Se lee como “0”
; bit 0:ADON: bit de puesta en marcha, no activo la conversion
movlw b'11000000'
movwf ADCON0

; bit 7: ADFM: Selecciona el formato del resultado de la conversión A/D
; bit 6: ADCS2: Bit de selección de reloj del conversor A/D
; Bits 5-4: No implementados: Se leen como cero
; bit 3-0: PCFG3: PCFG0: bits de configuración de los canales de entrada del convertidor A/D
movlw b'11000000'
movwf ADCON1
bcf STATUS,RP0

PRINGIPAL
.
.
.
[Continua el programa]
.
.
.

; ***********************
; Subrutina de conversion
; ***********************
; selecciono el canal de conversion 3
bcf ADCON0,CHS2
bsf ADCON0,CHS1
bsf ADCON0,CHS0
call CONVERSION ; Llamada a la subrrutina
; Guarda el resultado de la conversion
movf ADRESL,W
movwf Registro


; ************************
; SUBRUTINA DE CONVERSION
; ************************
CONVERSION
bsf ADCON0,ADON
bsf ADCON0,GO_DONE
BUCLE_CONVERSION
btfsc PIR1,ADIF
goto BUCLE_CONVERSIO
return





Me podria decir alguien que es lo que hago mal?
 
No te gustaría probar con lenguaje C. Lo único que tendrías que hacer es poner algo como valor_analogico = ADC_read(0);

Fijate con el mikroC
 
Ok probare con ese programa, aunque tengo que aprenderlo de cero porque no controlo el C, aprendi ensamblador porque me lo exigian en clase,

pero mientras empiezo con C me puedo decir alguien que hago mal?
 
no, creo que me explique mal, respecto del C muchas gracias por ofrecer tu ayuda, si me atasco en algún sitio ya preguntare, de momento voy a leerme un tutorial del mikroC, y haber si encuentro el programa gratis y en español.

Pero cuando dije lo de:

tjdor dijo:
pero mientras empiezo con C me puedo decir alguien que hago mal?

me refería a el programa que ya tengo escrito en ensamblador
 
Hola tjdor, creo que tenés un error en el siguiente segmento de código:

Código:
; ************************
; SUBRUTINA DE CONVERSION
; ************************
CONVERSION
bsf ADCON0,ADON
bsf ADCON0,GO_DONE
BUCLE_CONVERSION
btfsc PIR1,ADIF
goto BUCLE_CONVERSIO
return

En la línea btfsc PIR1,ADIF debería ser btfss PIR1,ADIF. Porque cuando se termina la conversión el bit ADIF se pone a 1 y no a 0.
Entonces, lo que pasa así como está es que arranca la conversión, y no se espera a que la misma se complete.
btfsc (bit test file skip clear) lo que hace es saltear la siguiente instrucción si el bit testeado es = 0
btfss por el contrario saltea la siguiente instrucción si el bit testeado es = 1.

Y como ADIF se pone a 1 cuando se completa la conversión, es por eso que nos interesa usar btfss para que solo cuando ADIF sea 1 salga del bucle de espera.

Otra cosa, acordate de poner a 0 el bit ADIF; porque creo que no se pone en 0 automáticamente. Lo podrías poner ahí mismo justo antes del return.

Saludos
 
OK, si, tienes razón, no me di cuenta. Muchas Gracias.

Pero...
...todo lo demás esta bien ?
Utilizo el proteus para simular mis circuitos y siempre me ha ido bien, pero ahora no. Si alguien lo entiende un poco, algunos pines de ese PIC aparecen sombreados como cuando hay señal difusa (ni 1, ni 0) es decir como si estuvieran al aire incluso estando conectados. Algunos supongo que no imperoten porque estan configurados como salida, pero otro es el pin 10, OSC2/CLKOUT, supongo que no funcione bien el crack.
 
Atrás
Arriba