Mi pic16f819 no ejecuta bien la funcion delay_ms()
3 participantes
Página 1 de 1.
Mi pic16f819 no ejecuta bien la funcion delay_ms()
Hola, estoy haciendo experimentos con el pic16f619 escribo el programa en piklab y grabo el pic con winpic800. El programa es el siguiente:
Sin embargo el led no parpadea, solo se queda prendido.
Uso un cristal de 4MHz
Estuve también probando si el pic fallaba al ejecutar instrucciones haciendo que prendan unos leds mostrando un numero en binario y sí funciona.
También quería saber si existe alguna forma de contar el tiempo que el pic lleva prendido, por que así tengo rutinas para hacer que se ejecuten instrucciones al tiempo que quiero sin tener que detener el programa.
Gracias. Por cierto no busqué donde poner este tema, no hay uno para dudas en el funcionamiento de los pic's?
- Código:
#include <pic16f819.h>
typedef unsigned int word;
word at 0x2007 CONFIG = _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLR_ON & _BODEN_OFF & _LVP_ON & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF & _CCP1_RB2 & _CP_OFF;
#define FREQ 4000
void pausa( unsigned char a ) //tiempo = (4a + 1)µs a>=2, para 4MHz
{
a; // para evitar error de variable no referenciada
_asm // "a" ya está en w
sublw 1
bucle:
addlw 1
btfss STATUS,0
goto bucle
_endasm;
}
void espera_ms( unsigned int ms )
{
unsigned int coms = FREQ / 4000;
ms = ms * coms;
while (ms > 0 )
{
pausa(247);
ms--;
}
}
void main() {
TRISB0 = 0;
while(1)
{
RB0=1;
espera_ms(500);
RB0=0;
espera_ms(500);
}
}
Sin embargo el led no parpadea, solo se queda prendido.
Uso un cristal de 4MHz
Estuve también probando si el pic fallaba al ejecutar instrucciones haciendo que prendan unos leds mostrando un numero en binario y sí funciona.
También quería saber si existe alguna forma de contar el tiempo que el pic lleva prendido, por que así tengo rutinas para hacer que se ejecuten instrucciones al tiempo que quiero sin tener que detener el programa.
Gracias. Por cierto no busqué donde poner este tema, no hay uno para dudas en el funcionamiento de los pic's?
carlostex- Participante
- Mensajes : 19
Fecha de inscripción : 30/10/2010
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
Holaa..
Mira revisa que tengas bien cableado el circuito, recuerda tener el pin RA5/MCLR a +5V. el tema del oscilador te recomiendo que como usas un cristal de 4mhz ajustes los fuse para XT_OSC.
En particular no tengo ese pic para probar tu codigo pero si lo simule en proteus y funciona bien..
Nota. Como usas sdcc te recomiendo bajar la ultima version.
Saludos
Risanti
Mira revisa que tengas bien cableado el circuito, recuerda tener el pin RA5/MCLR a +5V. el tema del oscilador te recomiendo que como usas un cristal de 4mhz ajustes los fuse para XT_OSC.
En particular no tengo ese pic para probar tu codigo pero si lo simule en proteus y funciona bien..
Nota. Como usas sdcc te recomiendo bajar la ultima version.
Saludos
Risanti
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
Hola, quería comentar que ya solucioné mi problema fue algo muy sencillo, resulta que tomo la alimentación del puerto USB de mi lap, pero Ubuntu desconecta los puertos cuando no hay algo conectado y me parece que no daba el voltaje correcto, lo probé en otra PC con win y funcionó al igual que con la pila de mi celular.
Gracias, saludos.
Gracias, saludos.
carlostex- Participante
- Mensajes : 19
Fecha de inscripción : 30/10/2010
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
ok..
Me alegro que resolviste tu problema. es importante revisar el hardware ya que muchas veces eso es la falla mas que el software....
Saludos y espero que sigas con tus experimentos
RiSanti
Me alegro que resolviste tu problema. es importante revisar el hardware ya que muchas veces eso es la falla mas que el software....
Saludos y espero que sigas con tus experimentos
RiSanti
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
Que tal?
Bueno ahora me puse a aprender ASM y me resultó mas interesante, ya hice unos programas que funcionaron como quería en proteus, pero para algunas cosas es esencial eso de las pausas, encontré código en internet para hacer pausas que en el proteus son muy regulares con casi nada de atraso visible, pero al programarlo en el pic, el led prende y apaga como 3 veces, y a la tercera se queda prendido mas tiempo, eso es con un retraso de medio segundo, les pongo el código, en este caso el retraso es de 200ms, pero sucede lo mismo, el parpadeo no es regular, hay un parpadeo que se interrumpe, cabe señalar que usando PIC C, el parpadeo con cualquier retraso es constante y se ve bien.
Uso un cristal de 8 MHz, supongo que el problema esta en el software, estaba pensando que tal vez por alguna razón el pic se reinicia pero no estoy seguro, Gracias.
Bueno ahora me puse a aprender ASM y me resultó mas interesante, ya hice unos programas que funcionaron como quería en proteus, pero para algunas cosas es esencial eso de las pausas, encontré código en internet para hacer pausas que en el proteus son muy regulares con casi nada de atraso visible, pero al programarlo en el pic, el led prende y apaga como 3 veces, y a la tercera se queda prendido mas tiempo, eso es con un retraso de medio segundo, les pongo el código, en este caso el retraso es de 200ms, pero sucede lo mismo, el parpadeo no es regular, hay un parpadeo que se interrumpe, cabe señalar que usando PIC C, el parpadeo con cualquier retraso es constante y se ve bien.
- Código:
; -----------------------------------------------------------------------
; Plantilla generada por Piklab
#include <p16f819.inc>
; -----------------------------------------------------------------------
; Bits de configuración: adapte los parámetros a su necesidad
__CONFIG _WDT_ON & _PWRTE_ON & _HS_OSC & _MCLR_ON & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF & _CCP1_RB2 & _CP_OFF
; -------------------------------------------------------------------
d1 equ 0x21 ; Seleccionamos posicion en la memoria RAM (GPR) para guardar
d2 equ 0x22 ; Registro utilizado en demora.-
contador3 equ 0x23
Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.-
;**** Configuracion de puertos ***
Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del codigo de programa.-
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; Comienza apagado.-
;**** Control de Led ****
Bucle bsf PORTB,Led ;Encendemos Led.-
call Delay
bcf PORTB,Led ; Apagamos Led
call Delay
goto Bucle
Delay
;199993 cycles
movlw 0x3E
movwf d1
movlw 0x9D
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
end
Uso un cristal de 8 MHz, supongo que el problema esta en el software, estaba pensando que tal vez por alguna razón el pic se reinicia pero no estoy seguro, Gracias.
carlostex- Participante
- Mensajes : 19
Fecha de inscripción : 30/10/2010
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
no será cosa del WDT que esta activado en la configuración de bits??, por que no pruebas configurándolo en off, total para este código no creo que ocupes el perro guardián.otra cosa...la verdad no veo caso declara el contador3 si no se usa jejeje, pero bueno tampoco estorba... aunque lo que mas me causa ruido es que para un pic trabajando a 8Mhz cada instruccion dura 0.5microsegundos y para 200000 ciclos segun yo tendrias un led que prende y apaga cada 100milisegundos no 200ms......bueno otra cosa que se me ocurre no tan tecnica e igual no he trabajado con ese pic y no lo conozco del todo pero en el 877a una vez tuve que colocar resistencias derivadoras de corriente a tierra para que los pines de entrada no me hicieran cosas raras en el puerto(ojo que digo todo el puerto y no específicamente un pin), jejej eso si el data dijese que están en colector abierto o algo así recuerdo que decía....saludos y ojalá te sirva el comentario y si das con la solución déjanoslo saber jeje.
WaRaW- Participante
- Mensajes : 27
Fecha de inscripción : 18/04/2010
Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()
Gracias por tu respuesta, efectivamente el watchdog era la causa del comportamiento inadecuado para mi circuito, y si estoy consiente de esos detalles del código, lo que pasa es que estuve probando con varios códigos de retraso y copiaba el código, les dejo el código con el que estoy probando este me produce un retraso de 20ms, pero le agregué una contador mas para que se puedan hacer retardos consecutivos(contador3), en este caso si esta contemplado que el cristal es de 8Mhz, y produzco un retardo de medio segundo.
- Código:
; -----------------------------------------------------------------------
; Plantilla generada por Piklab
#include <p16f819.inc>
; -----------------------------------------------------------------------
; Bits de configuración: adapte los parámetros a su necesidad
__CONFIG _WDT_ON & _PWRTE_ON & _HS_OSC & _MCLR_ON & _BODEN_ON & _LVP_ON & _CPD_OFF & _WRT_ENABLE_OFF & _DEBUG_OFF & _CCP1_RB2 & _CP_OFF
; -------------------------------------------------------------------
Contador1 equ 0x21 ; Seleccionamos posicion en la memoria RAM (GPR) para guardar
Contador2 equ 0x22 ; Registro utilizado en demora.-
contador3 equ 0x23
Led equ 0 ; Definimos Led como el bit cero de un registro, en este caso PORTB.-
;**** Configuracion de puertos ***
Reset org 0x00 ; Aqui comienza el micro.-
goto Inicio ; Salto a inicio de mi programa.-
org 0x05 ; Origen del codigo de programa.-
Inicio bsf STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
bcf PORTB,Led ; Comienza apagado.-
;**** Control de Led ****
Bucle bsf PORTB,Led ;Encendemos Led.-
movlw .26
movwf contador3
call delay
bcf PORTB,Led ; Apagamos Led
movlw .26
movwf contador3
call delay
goto Bucle
delay
decfsz contador3,1
goto Demora_20ms
return
Demora_20ms
movlw 0x54 ;
movwf Contador1 ; Iniciamos contador1.-
Repeticion1
movlw 0x9F ;
movwf Contador2 ; Iniciamos contador2
Repeticion2
decfsz Contador2,1 ; Decrementa Contador2 y si es 0 sale.-
goto Repeticion2 ; Si no es 0 repetimos ciclo.-
decfsz Contador1,1 ; Decrementa Contador1.-
goto Repeticion1 ; Si no es cero repetimos ciclo.-
goto delay ; Regresa de la subrutina.-
end
carlostex- Participante
- Mensajes : 19
Fecha de inscripción : 30/10/2010
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|