TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Nick en 19 de Diciembre de 2007, 17:22:32
-
Hola
Gracias por la ayuda prestada en mi anterior duda, ahora tengo problemas con el convertidor A/D del pic16f819.
Estoy trabajando en la creación de un programa cargador de baterias NiMH, el cual necesita testear voltaje y corriente de carga, para esto utilizo el A/D.
Tengo escrito el programa en código fuente pero al probarlo en mplabsim se queda pegado en el bucle convlista que aun no entiendo por que.
Al cargar el código al pic, no hace lo esperado, que seria encender un led verde si la tensión de entada es mayor a 0,1 volt y un led rojo sino.
Cualquier ayuda me seria de gran utilidad, acontinuación el programa para que lo vean... la conversion se realiza en la subrutina coci convlista.
Gracias :) :-)
; *********************************************** Definición de Variables ***********************************************
status equ 03h ;registro de estados
porta equ 05h ;puerto A en la dirección 5h de la RAM
portb equ 06h ;puerto B en la dirección 6h de la RAM
trisa equ 85h ;dirección de configuración puerto A
trisb equ 86h ;dirección de configuración puerto B
osccon equ 8fh ;dirección de registro del reloj
adcon1 equ 9fh ;registros de configuración para
adcon0 equ 1fh ;conversor análogo a digital
adresh equ 1eh ;
adresl equ 9eh ;
pir1 equ 0ch ;dirección de registro conversor AD
lazo1 equ 20h ;dirección de configuración registro conta
lazo2 equ 21h ;dirección de configuración registro lazo1
sumah equ 22h ;dirección de configuración registro lazo2
sumal equ 23h ;
z equ 02h ;bandera de 0 del registro de estados
go equ 02h ;bandera de 0 del registro de estados
adif equ 06h ;bandera de 0 del registro de estados
dc equ 01h ;bandera de 0 del registro de estados
; *********************************************** Inicio de Programa ***************************************************
reset org 00h ;el vector reset esta en la posicion 00
goto inicio ;se salta al programa principal
;
org 05h ;el programa empieza en la posicion de memoria 0
;
inicio bsf status,5 ;se ubica en banco 1 de memoria RAM
movlw b'1100000' ;se guarda en W el valor a usar del reloj en binario 110
movwf osccon ;se configura el reloj interno a 4Mhz
bcf status,5 ;regresa al primer banco de memoria RAM limpiando
goto principal ;
; *********************************************** Subrutinas de Programa ***********************************************
coci bsf status,5 ;
movlw b'10000000' ;
movwf adcon1 ;
movlw b'11111110' ;
movwf trisa ;
bcf status,5 ;
movlw b'10000001' ;
movwf adcon0 ;
clrf sumah ;
clrf sumal ;
call retardo ;
bcf pir1,adif ;
bsf adcon0,go ;
convlista btfss pir1,adif ;
goto convlista ;regresa si adif distinto de 1
bsf status,5 ;
movf adresl,w ;
bcf status,5 ;
addwf sumal,1 ;
movf adresh,w ;
addwf sumal,1 ;
retlw 00h ;
retardo movlw d'5' ;registro W contiene 5 decimal
movwf lazo1 ;registro lazo1 contiene cantidad de milisegundos
ciclo1 movlw d'110' ;registro W contiene 110 decimal
movwf lazo2 ;carga numero de milisegundos en lazo2
ciclo2 nop
nop
nop
nop
nop
nop
decfsz lazo2,1 ;pregunta si termino 50 ms
goto ciclo2
decfsz lazo1,1 ;pregunta si termino el retardo
goto ciclo1
retlw 00h ;salta instruccion despues de call
ledcoci bsf status,5 ;
movlw b'10111111' ;
movwf trisa ;
bcf status,5 ;
movlw b'01000000' ;
movwf porta ;
goto principal ;
led bsf status,5 ;
movlw b'01111111' ;
movwf trisa ;
bcf status,5 ;
movlw b'10000000' ;
movwf porta ;
goto principal ;
; *********************************************** Programa Principal ***************************************************
principal call coci ;llama subrutina coci
movlw b'00010101' ;
subwf sumal,0 ;
btfsc sumal,dc ;
goto ledcoci ;
call led ;
end
-
Nick, tu programa se va a quedar en el bucle de convlista ya que en el mplabsim no puedes simualr valores analogos, tu programa esta esperando a que el bit adif se ponga a 1, y a menos TU manipules ese bit tu programa no va a pasr de ahi. Te recomiendo que utilices el Proteus que es un simulador de CI y para felicidad tuya trae pics para simular, puedes ir a la pagina del fabricante y bajar su version demo, trae toda su suncionalidad, pero el inico inconveniente es que no puedes guardar el proyecto, pero para probar esta bien.
Aqui (http://www.labcenter.co.uk/download/prodemo_dlform.cfm?dl&/prodemo.exe&Proteus Demonstration) el link de descarga, llenas los campos que te pide y listo comienza a descargar. Espero que te sea de ayuda :D
-
lo malo es que hasta la version 7.2 SP0 no incluyen el 16f819 ni el 16f818.
-
ni la 7.2 sp2, peor puede hacer algo, puede pasar su programa al un pic que haya en la librerias del proteus que manejan adc, se me ocurre el 16f877a ya que se parece mucho su confoguracion con este 16f818, solo que no lleva osc interno pero si quiere ver que su programa funcione puede hacer el intento. es una idea :mrgreen: o cualquier otro que se asemeje
-
Gracias micro_cadaver y poseidon20, hare la simulación del programa en el proteus cambiando el pic por el recomendado y les cuento como va........... :-) :-)
-
inicio bsf status,5 ;se ubica en banco 1 de memoria RAM
movlw b'1100000' ;se guarda en W el valor a usar del reloj en binario 110
movwf osccon ;se configura el reloj interno a 4Mhz
observo que estas configurando el oscilador interno en 1MHz. y esta bien deberia funcionar oscilando a 1MHz.
OSCCON: OSCILLATOR CONTROL REGISTER (ADDRESS 8Fh)
bit 7 : vacio
IRCF2:IRCF0: Internal Oscillator Frequency Select bits 6--4
111 = 8MHz (8MHz source drives clock directly)
110 = 4MHz
101 = 2MHz
100 = 1MHz
011 = 500kHz
010 = 250kHz
001 = 125kHz
000 = 31.25kHz (INTRC source drives clock directly)
-
Se me había pasado ese detalle gracias.....ya lo corregi......... estoy implementando el circuito en el Proteus con el pic16f877 para simular el A/D, despues les cuento las novedades..... :-) :P
-
vale compadre! :-/