Electrónica Unicrom
Conceptos Componentes Digitales PIC, PLC, Osciladores, Filtros, Máquinas Diagramas Foros
Circuitos Computadoras Referencia Instrumentos Mediciones Telecom Fuentes UPS
Registro Ayuda
Usuario:
Contraseña:
Programa de conversión A/D con 16f877

 
 Todos los Foros
 PICs
 Programa de conversión A/D con 16f877
 Versión para impresora  
Autor Tópico Anterior Tópico Tópico siguiente  

charles_24
Principiante


30 Comentarios
Nicaragua
Enviado el - 23/02/2007 :  11:14:49 AM  Mostrar Perfil  Responder con Cita Enviar un mensaje privado a charles_24

Hola a todos.

Soy nuevo en este foro, y también me acabo de iniciar en con los pic.

Bueno, sucede que quería hacer un programa que me hiciera la conversión de analógico a digital del pin RA0 del 16f877; en fin, lo hice siguiendo los pasos de la hoja de datos, pero no veo ningún resultado en ADRESH:ADRESL, los dos siempre están en cero. Bueno, tal vez estoy haciendo mal la simulación en MPLAB, porque no sé como hacer una simulación de una entrada analógica. Sin embargo, el MPLAB no me da ningún mensaje de error. Pero hay algo que no está funcionando bien con el programa que hice.

En dicho programa tengo una rutina llamada conversión, la cual e:

Conversión
btfsc adcon0,2
goto Conversión
call delay_2Tad
goto Principal

Sucede que el bit 2 del registro adcon0 se pone en cero cuando estoy en la linea 'goto Conversión' y presiono F7 para el step into, pero aquí el programa no funciona a como debería. Al presionar F7 no se me ejecuta la instrucción 'goto Conversión', sino que el programa hace un salto a la linea numero 5 de la rutina Principal, y de ahí vuelve a comenzar el programa. Bueno, ese salto lo hace después de algunas evaluaciones de la instrucción btfsc, a como debería. La lógica de la secuencia es que al estar en la linea de 'goto Conversión' y al presionar F7, el programa debería hacer otra evaluación del bit 2 del registro adcon0 y luego saltar a la linea call delay_2Tad, pero no lo hace. Realmente no sé lo que esté mal. Aquí pongo todo el programa para que lo chequeen, y si hay algún comentario o sugerencia, se los agradeceré.


list p=16f877
processor "16f877.inc"

;***Comienzo a definir variables***

estado equ 0x03
trisA equ 0x85
portA equ 0x05
adresh equ 0x1e
adresl equ 0x9e
adcon0 equ 0x1f
adcon1 equ 0x9f

;***Configuración del módulo A/D
;y puertos de entrada y salida***

Inicio
movlw b'00100000'
movwf estado
movlw 0x03 ;Cargo W=b'00011'
movwf trisA ;y lo paso a trisA.
movlw b'10000100' ;Cargo W=b'0100' y lo paso a adcon1
movwf adcon1 ;para configurar las entradas analógicas.

Principal
bcf estado,5 ;Acceso al banco0.
movlw b'01000001' ;Selecciono el canal de entrada
movwf adcon0 ;y el clk de conversión para el A/D.
bcf 0ch,6 ;Pongo a cero el bit ADIF de PIR1.
bsf 0bh,7 ;Activo los bit GIE
bsf 0bh,6 ;y PEIE del registro INTCON.
bsf estado,5 ;Acceso al banco1.
bsf 8ch,6 ;Activo el bit ADIE del registro PIE1.
bcf estado,5 ;Acceso al banco0.
call Espera
bsf adcon0,2

Conversión
btfsc adcon0,2
goto Conversión
call delay_2Tad
goto Principal

Espera
movlw 0x1f
movwf 20h
loop
decfsz 20h,1
goto loop
return

delay_2Tad
movlw 0x15
movwf 20h
loop1
decfsz 20h,1
goto loop1
return
end


Si alguien tiene comentarios o sugerencias se los agradeceré.

Buen día.
Sia


Nuevos foros de Electrónica Unicrom
Regístrate y participa


sander
Miembro regular


128 Comentarios
Bahamas
Incluido el - 23/02/2007 :  2:46:06 PM  Mostrar Perfil  Responder con Cita Enviar un mensaje privado a sander
Bueno , Primero voy a suponer que el codigo que subiste es exactamente el que estas ensamblando con MPLAB.

Primero me voy a atrever a hacerte unas sugerencias

Te falta colocar la palabra de cofiguracion del pic.
Es mejor si utilizas las definiciones de Microchip para los SFR , STATUS, ADRESH,ADRESL ,etc estan definidos en el archivo 16f877.inc

Debes definir el inicio de tu programa poniendo la direccion del vector de reset(ORG 0x00)y si usas interrupciones colocar el inicio del vector de interrupciones (ORG 0X04).

Y cuando escribas el codigo no coloques numeros para los sfr en lugar de poner bcf 0ch,6 deberias poner bcf PIR1,ADIF porque asi queda mas clara.

Saludos

Ir Arriba


sander
Miembro regular


128 Comentarios
Bahamas
Incluido el - 23/02/2007 :  3:04:08 PM  Mostrar Perfil  Responder con Cita Enviar un mensaje privado a sander
Espero que no te haya molestado mi anterior post,

Ahora en lo que respecta a tu programa, el error que viste se debe a la estructura de tu programa , el contador de programa (PC), salta a la linea 5, porque ? porque se produjo una interrupcion y el PC fue al vector de interrupcio (0x04)pero como en esta direccion esta tu ciclo principal ,dificil ver el problema es , te sugiero que utilizes la siguiente plantilla para programar:

list p=16f877A ; definimos el procesador
#include <p16f877A.inc> ; incluimos la definicion de FSR de Microchip
;A continuacion esta es la palabra de configuracion
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

;declaracion de variables
w_temp EQU 0x71 ; variables para
status_temp EQU 0x72 ;salvar el
pclath_temp EQU 0x73 ;contexto

;vector de reset
ORG 0x00
goto main


;vector de interrupcion

ORG 0x04
;salvar contexto

movwf w_temp ;salvamos W
movf STATUS,w
movwf status_temp ;salvamos STATUS
movf PCLATH,w
movwf pclath_temp ;salvamos PCLATH

; Aqui va la rutina de interrupcion


;recuperamos contexto

movf pclath_temp,w
movwf PCLATH ;recuperamos PCLATH
movf status_temp,w
movwf STATUS ;recuperamos STATUS
swapf w_temp,f
swapf w_temp,w ;recuperamos W
retfie ;Salimos de la interrupcion
main
;el codigo va a aqui


END ;FIN


Si colocas tu codigo en main y vuelves a simular veras que el PC ira a 0x04 .
saludos

Editado por - sander on 23 Feb 2007 15:10:46

Ir Arriba


charles_24
Principiante


30 Comentarios
Nicaragua
Incluido el - 23/02/2007 :  4:44:11 PM  Mostrar Perfil  Responder con Cita Enviar un mensaje privado a charles_24
Sander, te doy las gracias por tus comentarios y sugerencias.
Tu primer post no me molestó, al contrario me sirvió para adquirir un poco más de conocimiento.
Tomaré en cuenta lo que me dices.

Gracias, brother....

Ir Arriba



Ir a:

Poner Unicrom como página de inicio Poner Unicrom en Favoritos Privacidad   © 2002-12 Unicrom.com All Rights Reserved. MaxWebPortal Snitz Forums Ir arriba