Autor Tema: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)  (Leído 4165 veces)

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

Desconectado mushrambo1992

  • PIC10
  • *
  • Mensajes: 4
Buenas noches:

Soy nuevo en esta pagina y este es mi primer post por lo que de antemano me disculpo por los errores que pueda cometer.
Ya entrando el tema, queria preguntarles si saben como puedo realizar un programa en c para un pic 16f84 en el que se tengan 4 pushbutons que al ser pulsados apaguen(respectivamente) 4 leds que estan inicialmente prendidos (a cada push button se le asignarian un led) y que al apagarse los 4 leds  se apague un quinto led.

Este es un intento del programa que quiero realizar

#include <16f84a.h>                 // incluimos la libreria para este pic
#fuses XT,NOWDT,NOPROTECT           // configuramos los fusibles de programacion
                                    // XT - cristal de cuarzo
                                    // NOWDWT - no perro guardian
                                    // NOPROTECT - no protegido
#use delay(clock=4000000)           // velocidad de reloj en HZ



//// Declaración de variables ////

//// Configuramos salidas y entradas ////


void main (void)
{
output_high (PIN_B0);
output_high (PIN_B1);
output_high (PIN_B2);
output_high (PIN_B3);
output_high (PIN_B4);


set_tris_b (0x00);                  // Declaramos puerto B como salida
set_tris_a (0x1F);                  // Declaramos puerto A como entrada

 
 WHILE (TRUE)               // Bucle infinito    DO
 
      If (input (PIN_A0))          // Si la entrada es 0
      {  delay_ms (10);             // esperamos 10 ms
         If (input (PIN_A0))       // comprobamos otra vez la entrada sea 0, por temas de rebote
         {  do { } while (input (PIN_A0));  // esperar a soltar el boton
           output_toggle(PIN_B0);               // el puerto b cambia al complementario.
         
         }

      }
      }


Y funciona  bien para el led que esta en PIN_B0, pero el problema es que al oprimir cualquier pushbutton lo apaga , cosa que solo deberia de pasar cuando se presione el pushbutton colocado en PIN_A0.

¿alguien sabe alguna forma de poder solucionar este problema?, y ¿podria alguien guiarme sobre como seguir con mi programa?, dios sabe que ya lo intente de todas las formas posibles pero siempre me da un resultado parecido.

Muchas gracias de antemano.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #1 en: 15 de Noviembre de 2012, 03:04:55 »
No entiendo eso de que al pulsar cualquier botón se te apaga el led de B0.
En tu programa sólo estás chequeando la entrada en A0.


Por la forma en la que lo has construido, deduzco que tus botones se activan cuando valen 1, sin embargo en el comentario has puesto  // Si la entrada es 0 por lo que hay algún error de interpretación ahí.

Por último, una duda: ¿qué ocurre si mientras mantienes pulsado un botón, pulsas y sueltas otro?. En función de tu respuesta habrá que encarar la solución de una manera o de otra.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #2 en: 15 de Noviembre de 2012, 04:38:17 »
concuerdo con nocturno, en la parte de código que pones no debería de haber error.
Ademas, lo que estas haciendo es alternar el encendido y apagado de tu led, si presionas tu botón otra vez el led volverá a encender, si lo que quieres es que se apague, la instrucción debería ser

ouput_low(pin_b0)


pon tu código completo con los 4 leds para poder ayudarte mejor

saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado mushrambo1992

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #3 en: 15 de Noviembre de 2012, 12:19:28 »
Muchas gracias por las respuestas  :)


Ese es mi problema, aunque solo declare la entrada A0, con cualquier otra entrada del puerto A se apaga el Led en B0, y tienes razon los botones deben activarse con 1 no con 0, esque primero lo hize asi y luego lo cambié.

Tal vez sea un error de conección pero no estoy seguro, aqui esta mi circuito en proteus






El programa completo yo creo que quedaria así

#include <16f84a.h>                 // incluimos la libreria para este pic
#fuses XT,NOWDT,NOPROTECT           // configuramos los fusibles de programacion
                                    // XT - cristal de cuarzo
                                    // NOWDWT - no perro guardian
                                    // NOPROTECT - no protegido
#use delay(clock=4000000)           // velocidad de reloj en HZ



//// Declaración de variables ////

//// Configuramos salidas y entradas ////


void main (void)
{
output_high (PIN_B0);
output_high (PIN_B1);
output_high (PIN_B2);
output_high (PIN_B3);
output_high (PIN_B4);


set_tris_b (0x00);                  // Declaramos puerto B como salida
set_tris_a (0x1F);                  // Declaramos puerto A como entrada

 
 WHILE (TRUE)               // Bucle infinito    DO
 
      If (input (PIN_A0))          // Si la entrada es 1
      {  delay_ms (10);             // esperamos 10 ms
         If (input (PIN_A0))       // comprobamos otra vez la entrada sea 1, por temas de rebote
         {  do { } while (input (PIN_A0));  // esperar a soltar el boton
           output_toggle(PIN_B0);               // el puerto b cambia al complementario.
         
         }
    If (input (PIN_A1))          // Si la entrada es 1
      {  delay_ms (10);             // esperamos 10 ms
         If (input (PIN_A1))       // comprobamos otra vez la entrada sea 1, por temas de rebote
         {  do { } while (input (PIN_A1));  // esperar a soltar el boton
           output_toggle(PIN_B1);               // el puerto b cambia al complementario.
         
         }
    If (input (PIN_A2))          // Si la entrada es 1
      {  delay_ms (10);             // esperamos 10 ms
         If (input (PIN_A2))       // comprobamos otra vez la entrada sea 1, por temas de rebote
         {  do { } while (input (PIN_A2));  // esperar a soltar el boton
           output_toggle(PIN_B2);               // el puerto b cambia al complementario.
         
         }
    If (input (PIN_A3))          // Si la entrada es 1
      {  delay_ms (10);             // esperamos 10 ms
         If (input (PIN_A3))       // comprobamos otra vez la entrada sea 1, por temas de rebote
         {  do { } while (input (PIN_A3));  // esperar a soltar el boton
           output_toggle(PIN_B3);               // el puerto b cambia al complementario.
         
         }
 if ((output_low (PIN_B0))&& (output_low (PIN_B1))&& (output_low (PIN_B2))&& (output_low (PIN_B3))){output_toggle(PIN_B4);}
      }
      }

Ese seria el programa completo, pero al momento de comilarlo me marca muchos errores, mas que todo me pide que ponga muchos WHILE al final y aunque haga eso, el resultado no es el deseado.

Espero haber sido un poco mas claro y de nuevo cualquier consejo o ayuda son bienvenidos



Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #4 en: 15 de Noviembre de 2012, 13:16:51 »
Hola, bueno, primero tienes que checar todos tus paréntesis, te faltan muchos, tu while(true) no tiene nada encerrado en parentesis, al igual que tus ifs, muchos no tienen parentesis para encerrar las acciones que quieres que se hagan
"Nada es imposible, no si puedes imaginarlo"

Desconectado peteorito

  • PIC16
  • ***
  • Mensajes: 136
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #5 en: 15 de Noviembre de 2012, 13:42:45 »
  Como te decian faltan algunos parantesis de los if,  a me me ha compilado y sin error :)

Código: C
  1. #include <16f84a.h>                 // incluimos la libreria para este pic
  2. #fuses XT,NOWDT,NOPROTECT           // configuramos los fusibles de programacion
  3.                                     // XT - cristal de cuarzo
  4.                                     // NOWDWT - no perro guardian
  5.                                     // NOPROTECT - no protegido
  6. #use delay(clock=4000000)           // velocidad de reloj en HZ
  7.  
  8.  
  9.  
  10. //// Declaración de variables ////
  11.  
  12. //// Configuramos salidas y entradas ////
  13.  
  14.  
  15. void main (void)
  16. {
  17. output_high (PIN_B0);
  18. output_high (PIN_B1);
  19. output_high (PIN_B2);
  20. output_high (PIN_B3);
  21. output_high (PIN_B4);
  22.  
  23.  
  24. set_tris_b (0x00);                  // Declaramos puerto B como salida
  25. set_tris_a (0x1F);                  // Declaramos puerto A como entrada
  26.  
  27.  
  28.  WHILE (TRUE)               // Bucle infinito    DO
  29.  {
  30.  
  31.       If (input (PIN_A0))          // Si la entrada es 1
  32.       {  delay_ms (10);             // esperamos 10 ms
  33.          If (input (PIN_A0))       // comprobamos otra vez la entrada sea 1, por temas de rebote
  34.          {  do { } while (input (PIN_A0));  // esperar a soltar el boton
  35.            output_toggle(PIN_B0);               // el puerto b cambia al complementario.
  36.          
  37.          }
  38.       }
  39.     If (input (PIN_A1))          // Si la entrada es 1
  40.       {  delay_ms (10);             // esperamos 10 ms
  41.          If (input (PIN_A1))       // comprobamos otra vez la entrada sea 1, por temas de rebote
  42.          {  do { } while (input (PIN_A1));  // esperar a soltar el boton
  43.            output_toggle(PIN_B1);               // el puerto b cambia al complementario.
  44.          
  45.          }
  46.       }  
  47.          
  48.     If (input (PIN_A2))          // Si la entrada es 1
  49.       {  delay_ms (10);             // esperamos 10 ms
  50.          If (input (PIN_A2))       // comprobamos otra vez la entrada sea 1, por temas de rebote
  51.          {  do { } while (input (PIN_A2));  // esperar a soltar el boton
  52.            output_toggle(PIN_B2);               // el puerto b cambia al complementario.
  53.          
  54.          }
  55.       }
  56.     If (input (PIN_A3))          // Si la entrada es 1
  57.       {  delay_ms (10);             // esperamos 10 ms
  58.          If (input (PIN_A3))       // comprobamos otra vez la entrada sea 1, por temas de rebote
  59.          {  do { } while (input (PIN_A3));  // esperar a soltar el boton
  60.            output_toggle(PIN_B3);               // el puerto b cambia al complementario.
  61.          
  62.          }
  63.       }
  64.  if ((output_low (PIN_B0))&& (output_low (PIN_B1))&& (output_low (PIN_B2))&& (output_low (PIN_B3))){output_toggle(PIN_B4);}
  65.       }
  66.       }

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #6 en: 15 de Noviembre de 2012, 13:45:30 »
también te recomiendo que estructures tu programa como lo hizo peteorito, siempre en niveles diferentes dependiendo de en que ciclo estes, asi es mas fácil reconocer si faltan  paréntesis o no
"Nada es imposible, no si puedes imaginarlo"

Desconectado mushrambo1992

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #7 en: 15 de Noviembre de 2012, 17:03:27 »
A ok, dejenme verificar si ya funciona mi programa (ahorita estoy en un ciber) y su funciona de esta forma se los hare saber, muchas gracias.  :lol:

PD: ¿Alguien sabe si esta bien el modo en que conecte los push buttons al pic?, porque por ejemplo, si solo declaro A0 y B0 (como en el primer ejemplo) funciona muy bien para estos, si conecto e, push a A3 , por ejemplo, ya no funciona, pero si conecto un push a A0 y una  a A3, ambos funcionan para apagar el led en B0. ¿sera erros de programacion o de coneccion?

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #8 en: 15 de Noviembre de 2012, 17:16:50 »
pon una imagen mas grande, porque no alcanzo a ver como esta coenctado
"Nada es imposible, no si puedes imaginarlo"

Desconectado mushrambo1992

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda para programar un pic16f84 en c (es facil pero soy principiante)
« Respuesta #9 en: 16 de Noviembre de 2012, 00:28:19 »
No se como ponerlo mas grande :/ , pero ya no es necesario porque un amigo ya me informo que estaba mas conectado y por eso no funcionaba :S ,de todas formas me sirvio el ver como se debia estructurar correctamente mi programa y ya lo grabe en el pic (ahora solo esperemos que funcione)

Muchas gracias a los que me apoyaron ;)

Saludos