Autor Tema: Temporizador de 500ms  (Leído 2265 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado carlosandres03cp

  • PIC10
  • *
  • Mensajes: 2
Temporizador de 500ms
« en: 26 de Enero de 2011, 12:38:30 »
Hola a todos, quiero programar un 16f84a para que  con un pulso de inicio en el RB0  se active el RB1 durante 500ms y luego vuelva a cero , esta tarea la realize con un 555 de manera muy sencilla configurado como monoestable pero ahora lo necesito en un pic porque necesito otra logica adicional.....soy nuevo en programacion de pics en c y su ayuda seria muy util para mi. Gracias. El codigo de abajo es lo que realize para que haga la funcion que explico sin el retardo que hasta ahora no lo he podido realizar:

void main()
{
 
 bit_clear(OPTION_REG,7);
 bit_set(TRISB,0); //COMO ENTRADA
 bit_clear(TRISB,1);//COMO SALIDA
 bit_clear(PORTB,1);
 
 
 WHILE(1)
 {
 if(bit_test(portb,0)==1)
 
 bit_set(portb,1);
 {
 
 }
 else
 
 bit_clear(portb,1);

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Temporizador de 500ms
« Respuesta #1 en: 26 de Enero de 2011, 13:47:08 »
En C de CCs me parece recordar que la instruccionque necesitas es:

Delayms

con el numero= al tiempo que necesitas.
Todos los días se aprende algo nuevo.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Temporizador de 500ms
« Respuesta #2 en: 26 de Enero de 2011, 15:45:53 »
con...
WHILE(TRUE){
   output_toggle(PIN_XX);                //XX lo cambias por el pin que desees para la salida ejemplo... B0, lo que hace esta linea es invertir el estado del pin, si es 1 lo pone en 0 y si es 0 lo pone en 1
   delay_ms(500);
}

suficiente para lo que deseas pero recuerda que tienes que definir la frecuencia de oscilacion con
#use delay(clock="aqui el valor de la frecuencia del oscilador")
« Última modificación: 26 de Enero de 2011, 18:17:04 por ppyote »
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado carlosandres03cp

  • PIC10
  • *
  • Mensajes: 2
Re: Temporizador de 500ms
« Respuesta #3 en: 27 de Enero de 2011, 11:50:19 »
muchas gracias ppyote, mira ahora con tu recomendacion construi este codigo en con el retardo

 
 void main(void)
 { 
 
    set_tris_b(0x0F);                //bo a b3 como entrada y b4 a b7 como salidas 
    disable_interrupts(GLOBAL);        //todas las interrupciones desactivadas 
     
    do
    {
    if(input(PIN_B0)==1)
    ouput_high(pin_b4);
    delay_ms(500);
    else    //AQUI ME SALE UN ERROR QUE DICE: A NUMERIC EXPRESSION MUST APPEAR HERE
    output_low(pin_b4);
    }
   
    while(TRUE);                    //bucle infinito
 }

te agradeceria tu ayuda. Saludos.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Temporizador de 500ms
« Respuesta #4 en: 27 de Enero de 2011, 12:10:06 »
Deberías escribir así tu código:

Código: C++
  1. void main(void)
  2.  {
  3.  
  4.     set_tris_b(0x0F);                //bo a b3 como entrada y b4 a b7 como salidas
  5.     disable_interrupts(GLOBAL);        //todas las interrupciones desactivadas
  6.      
  7.     do
  8.     {
  9.     if(input(PIN_B0)==1)
  10.     {
  11.        ouput_high(pin_b4);     //cuando hay mas de una instrucción hay que decírselo al compilador
  12.        delay_ms(500);
  13.     }
  14.     else    
  15.     output_low(pin_b4);
  16.     }
  17.    
  18.     while(TRUE);                    //bucle infinito
  19.  }
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Temporizador de 500ms
« Respuesta #5 en: 27 de Enero de 2011, 13:43:01 »
Pero no querias una oscilacion con 500ms de alto y 500ms de bajo?
si es asi no vale lo que estais poniendo, deberia de ser asi...

Código: [Seleccionar]
void main(void)
 {
 
    set_tris_b(0x0F);                //bo a b3 como entrada y b4 a b7 como salidas
    disable_interrupts(GLOBAL);        //todas las interrupciones desactivadas
     
    do
    {
    if(input(PIN_B0)==1){
         output_toggle(PIN_B4);
         delay_ms(500);
    } else output_low(pin_b4);
   
    while(TRUE);                    //bucle infinito
 }

asi esta bien...
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Temporizador de 500ms
« Respuesta #6 en: 27 de Enero de 2011, 17:30:36 »
...  con un pulso de inicio en el RB0  se active el RB1 durante 500ms y luego vuelva a cero ...

Hola, según la descripción de lo dices que debe hacer el circuito, debería quedar así cambiando a RB1 por RB4:

Código: C
  1. void main(void)
  2.  {
  3.     set_tris_b(0x0F);                //bo a b3 como entrada y b4 a b7 como salidas
  4.     disable_interrupts(GLOBAL);        //todas las interrupciones desactivadas
  5.      
  6.     do
  7.     {
  8.       if(input(PIN_B0)==1)
  9.       {
  10.          output_high(PIN_B4);
  11.          delay_ms(500);
  12.          output_low(PIN_B4);
  13.       }
  14.     }
  15.     while(TRUE);                    //bucle infinito
  16.  }

Saludos!

EDITO:  Asumo que en el circuito tienes una resistencia pulldown conectada a RB0.
« Última modificación: 27 de Enero de 2011, 18:26:56 por bmb »