TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: carlosandres03cp en 26 de Enero de 2011, 12:38:30

Título: Temporizador de 500ms
Publicado por: carlosandres03cp 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);
Título: Re: Temporizador de 500ms
Publicado por: Fer_TACA 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.
Título: Re: Temporizador de 500ms
Publicado por: ppyote 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")
Título: Re: Temporizador de 500ms
Publicado por: carlosandres03cp 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.
Título: Re: Temporizador de 500ms
Publicado por: MGLSOFT 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.  }
Título: Re: Temporizador de 500ms
Publicado por: ppyote 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...
Título: Re: Temporizador de 500ms
Publicado por: bmb 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.