Autor Tema: Problema con la Sentencia Delay_ms(tiempo). -- Solucionado por el Amigo RALF2 --  (Leído 4608 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
 8) Saludos a Todos los Amigos (as) del Foro TODOPIC, esperando que se encuentren Muy Bien.

 Una vez más, acudo a Ustedes en referencia a un problema que se me está presentando con un Programa realizado en Lenguaje "C", empleando Compilador CCS Versión 5.07. y Microcontrolador PIC16F628.
 
 El Código de la Programación es el siguiente:

 ////////////////////////////////////////////////////////////////////////////////////////

#Include <16F628.h>                     // Incluye la Librería del PIC a Utilizar.
#Fuses NOWDT, NOBROWNOUT       // Fusibles: Palabras de Configuración
#Fuses NOLVP, PROTECT                // Fusibles: Palabras de Configuración
#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito
#Use Standard_IO(A)                     // Para Optimizar el Código
#Use Standard_IO(B)                     // Para Optimizar el Código
#Define On        Output_High          // Para abreviar escritura
#Define Off       Output_Low           // Para abreviar escritura

/////////////////////////////////////////////////////////////////////////////////////////

Void Main()                           // Programa Principal.
{                                          // Inicio del Programa Principal.
   Port_B_Pullups(0xFF);         // Activación de Resistores Pullups
    
   While(true)                         // Activa un Ciclo Infinito.
      {                                    // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))              // Si RA0 está en "1".
            {                              // entonces...
            Off(Pin_B0);              // El Pin RB0 entrega siempre un "0".
            }
      else                                // De lo Contrario...      
            {
            Delay_ms(30000);     // Espera 30 Segundos
            On(Pin_B0);              // y activa el Pin RB0.
            }
      }                                   // Fin del Ciclo Infinito
}                                         // Final del Programa

  El Problema consiste en que cuando dejo Oprimido el Pulsador conectado en el Pin RA0, el cual está configurado como entrada (Ver Esquema en Archivo Adjunto), el tiempo transcurrido para activar al Pin RB0 que está configurado como Salida, por lo general es mayor a 30 Segundos, por lo que el PIC no respeta lo establecido en la Programación.
  
  Una vez activado el Pin RB0, al liberar el Pulsador, (según lo establecido en la Programación) dicho terminal debería retornar inmediatamente al Estado Lógico "0", pero no lo hace, en su defecto, espera casi 30 Segundos para llegar a dicho estado.
  
  No comprendo el por qué de este comportamiento en el Microcontrolador. Agradecería la Mayor Colaboración posible.
  

  Quisiera Agradecer a TODOS (AS) por sus valiosos Aportes en este Foro, los cuales me han sido verdaderamente Muy Útiles en esta área tan especial de la Electrónica. Saludos y Mucho éxito para TODOS (AS).  ((:-))
« Última modificación: 16 de Marzo de 2015, 14:52:12 por Carabobo1 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #1 en: 15 de Marzo de 2015, 22:52:36 »
No creo que sea el problema pero:

#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito

Esta mal... segun el manual de CCS no existe ninguna opcion asi.
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf (Pag 185)
Y es:

#Use delay(clock=4000000)            // Frecuencia del Oscilador en el Circuito

Acepta Mhz y si queres poner el tipo, es type=int (con esto no hace falta poner la frecuencia segun el manual)
Y lo del delay_ms() va de 0 a 65535 asi que esta en rango.

Deberia dar algo aproximado a los 30seg. Si quisieras un tiempo mas exacto entonces mejor una interrupcion y un cristal de 32k

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #2 en: 15 de Marzo de 2015, 22:54:39 »
Tal vez diga una burrada, ya que no se nada del lenguaje c. Pero me parece que el error está en la línea if(input(PIN_A0)) ¿Donde indicas la espera de un 1 lógico?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #3 en: 15 de Marzo de 2015, 23:05:12 »
En realidad debes poner el negado de input, porque cuando presionas el pulsador se pone a masa, no a 5 V.

Código: C
  1. if(!input(Pin_A0))              // Si RA0 está en "0".
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #4 en: 15 de Marzo de 2015, 23:07:48 »
No creo que sea el problema pero:

#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito

Esta mal... segun el manual de CCS no existe ninguna opcion asi.
http://www.ccsinfo.com/downloads/ccs_c_manual.pdf (Pag 185)
Y es:

#Use delay(clock=4000000)            // Frecuencia del Oscilador en el Circuito

Acepta Mhz y si queres poner el tipo, es type=int (con esto no hace falta poner la frecuencia segun el manual)
Y lo del delay_ms() va de 0 a 65535 asi que esta en rango.

Deberia dar algo aproximado a los 30seg. Si quisieras un tiempo mas exacto entonces mejor una interrupcion y un cristal de 32k



Resp.- Muchas Gracias al Amigo KILLERJC por su Respuesta. El Código fue elaborado usando el Asistente para la Creación de Proyectos del Compilador CCS Vers. 5.007, es por ello que se aprecia la Sentencia: #Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito la cual fue colocada automáticamente por el Compilador.
No quisiera usar un Oscilador Externo, por algo los PIC's traen esa opción de Oscilador Interno, la cual quisiera Aprovechar. Una vez más, Muchas Gracias por haber Respondido.  :)

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #5 en: 15 de Marzo de 2015, 23:13:39 »
Coloca en los fuses: INTRC_IO, para que operes con el oscilador interno.

Saludos

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #6 en: 15 de Marzo de 2015, 23:16:59 »
Tal vez diga una burrada, ya que no se nada del lenguaje c. Pero me parece que el error está en la línea if(input(PIN_A0)) ¿Donde indicas la espera de un 1 lógico?

Resp. Muchas Gracias al Amigo Leon Pic por su Respuesta. En realidad, cuando se utilizan la Sentencias "if-else" , las Sintaxis equivalentes son:

1.- if(input(Pin_A0))

2.- if(input(Pin_A0)==1)

De ambas maneras se pueden escribir y el Resultado siempre será el mismo, de hecho, al Compilar, NO se genera NINGÚN ERROR. Muchas Gracias por su Respuesta.

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #7 en: 15 de Marzo de 2015, 23:26:36 »
Coloca en los fuses: INTRC_IO, para que operes con el oscilador interno.

Saludos
[/quote]


Saludos al Amigo RALF2.
Acabo de hacer lo que me indicaste y funciona exactamente igual. No hay cambios. Gracias por el Comentario.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #8 en: 15 de Marzo de 2015, 23:28:36 »
te falta añadir el código antirebote
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #9 en: 15 de Marzo de 2015, 23:35:22 »
te falta añadir el código antirebote

Con 30 segundos no creo que importe xD jeje

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #10 en: 15 de Marzo de 2015, 23:44:45 »
Hola Amigo, Gracias por el Comentario. En realidad no creo que se trate de un Problema de Rebote Mecánico, ya que al liberar el Pulsador, la Entrada RA0 inmediatamente recibe un Nivel Lógico "Alto" y en consecuencia, la Salida RB0 debería conmutar inmediatamente al estado "Off" (Cero Lógico "0"). Pero no lo hace, RB0 se queda en estado Alto alrededor de 20 Seg. y luego pasa a Cero Lógico ("0"). Yo quisiera que conmutara inmediatamente a "0", pero no lo hace...

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #11 en: 15 de Marzo de 2015, 23:48:33 »
Ok veamos lo siguiente.
Cuando presionas el boton a partir de ese momento empieza a transcurrir los 30 segundos mas o menos (por el rebote del contacto).
Pasados los 30 segundo el led enciende  :mrgreen:
revisa eso porque esa es la secuencia.

Lo otro para saber si el oscilador esta bien seteado puedes hacer lo siguiente:

Citar
#Include <16F628.h>                     // Incluye la Librería del PIC a Utilizar.
#Fuses NOWDT, NOBROWNOUT       // Fusibles: Palabras de Configuración
#Fuses NOLVP, PROTECT                // Fusibles: Palabras de Configuración
#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito
#Use Standard_IO(A)                     // Para Optimizar el Código
#Use Standard_IO(B)                     // Para Optimizar el Código
#Define On        Output_High          // Para abreviar escritura
#Define Off       Output_Low           // Para abreviar escritura

/////////////////////////////////////////////////////////////////////////////////////////

Void Main()                           // Programa Principal.
{                                          // Inicio del Programa Principal.
   Port_B_Pullups(0xFF);         // Activación de Resistores Pullups
    
   While(true)                         // Activa un Ciclo Infinito.
      {                                    // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))              // Si RA0 está en "1".
            {                              // entonces...
            Off(Pin_B0);              // El Pin RB0 entrega siempre un "0".
            }
      else                                // De lo Contrario...    
            {
            On(Pin_B0);  
            Delay_ms(500);     // Espera 30 Segundos
            Off(Pin_B0);  // y activa el Pin RB0.
            Delay_ms(500);
            }
      }                                   // Fin del Ciclo Infinito
}        
mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #12 en: 15 de Marzo de 2015, 23:53:52 »
O... para que tener 2 condiciones ? xD

Código: C
  1. While(true)                        
  2.       {                                  
  3.       if(!input(Pin_A0))            
  4.             {
  5.             On(Pin_B0);  
  6.             Delay_ms(30000);
  7.  
  8.             }
  9.       Off(Pin_B0);
  10.       }

Desconectado Carabobo1

  • PIC12
  • **
  • Mensajes: 51
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #13 en: 16 de Marzo de 2015, 00:01:19 »
Ok veamos lo siguiente.
Cuando presionas el boton a partir de ese momento empieza a transcurrir los 30 segundos mas o menos (por el rebote del contacto).
Pasados los 30 segundo el led enciende  :mrgreen:
revisa eso porque esa es la secuencia.

Lo otro para saber si el oscilador esta bien seteado puedes hacer lo siguiente:

Citar
#Include <16F628.h>                     // Incluye la Librería del PIC a Utilizar.
#Fuses NOWDT, NOBROWNOUT       // Fusibles: Palabras de Configuración
#Fuses NOLVP, PROTECT                // Fusibles: Palabras de Configuración
#Use Delay(Internal=4MHz)            // Frecuencia del Oscilador en el Circuito
#Use Standard_IO(A)                     // Para Optimizar el Código
#Use Standard_IO(B)                     // Para Optimizar el Código
#Define On        Output_High          // Para abreviar escritura
#Define Off       Output_Low           // Para abreviar escritura

/////////////////////////////////////////////////////////////////////////////////////////

Void Main()                           // Programa Principal.
{                                          // Inicio del Programa Principal.
   Port_B_Pullups(0xFF);         // Activación de Resistores Pullups
    
   While(true)                         // Activa un Ciclo Infinito.
      {                                    // Extremo Inicial del Ciclo Infinito.
      if(input(Pin_A0))              // Si RA0 está en "1".
            {                              // entonces...
            Off(Pin_B0);              // El Pin RB0 entrega siempre un "0".
            }
      else                                // De lo Contrario...    
            {
            On(Pin_B0);  
            Delay_ms(500);     // Espera 30 Segundos
            Off(Pin_B0);  // y activa el Pin RB0.
            Delay_ms(500);
            }
      }                                   // Fin del Ciclo Infinito
}        
mientras mantengas el pulsador presionado el led titilara cada 0.5 segundos; sino es asi, el oscilador interno esta mal seteado o mal configurado.

Saludos

Resp.-

Acabo de hacer la Prueba con la modificación del código que propones. Funciona Perfectamente bien, de hecho, ya anteriormente había hecho una prueba similar y funcionó Muy Bien.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Problema con la Sentencia Delay_ms(tiempo)
« Respuesta #14 en: 16 de Marzo de 2015, 07:45:02 »
Entonces el problema esta resuelto?


 

anything