Microcontroladores PIC en Linux.
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.

Mi pic16f819 no ejecuta bien la funcion delay_ms()

3 participantes

Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por carlostex Miér 24 Nov 2010 - 2:11

Hola, estoy haciendo experimentos con el pic16f619 escribo el programa en piklab y grabo el pic con winpic800. El programa es el siguiente:
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
Participante

Mensajes : 19
Fecha de inscripción : 30/10/2010

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por Risanti Miér 24 Nov 2010 - 3:46

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
Risanti
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 39
Localización : La Serena Chile

https://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por carlostex Mar 30 Nov 2010 - 7:01

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.

carlostex
Participante
Participante

Mensajes : 19
Fecha de inscripción : 30/10/2010

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por Risanti Sáb 4 Dic 2010 - 14:17

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
Risanti
Risanti
Asiduo del Foro
Asiduo del Foro

Mensajes : 172
Fecha de inscripción : 07/12/2008
Edad : 39
Localización : La Serena Chile

https://www.facebook.com/risanti.electronica

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por carlostex Dom 5 Dic 2010 - 22:29

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.
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
Participante

Mensajes : 19
Fecha de inscripción : 30/10/2010

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por WaRaW Lun 6 Dic 2010 - 5:43

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
Participante

Mensajes : 27
Fecha de inscripción : 18/04/2010

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por carlostex Lun 6 Dic 2010 - 20:43

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
Participante

Mensajes : 19
Fecha de inscripción : 30/10/2010

Volver arriba Ir abajo

Mi pic16f819 no ejecuta bien la funcion delay_ms() Empty Re: Mi pic16f819 no ejecuta bien la funcion delay_ms()

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.