TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: badtzdizzy en 28 de Junio de 2004, 12:08:00

Título: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: badtzdizzy en 28 de Junio de 2004, 12:08:00
Hola

Pues ahora me encuentro realizando un programa para realizar ciertas secuencias con unos leds. Basicamente lo que quiero es que al mandar un caracter con visual basic por el puerto serie pues se ejecute una secuencia y si oprimo otro botón que este envie otro caracter para realizar una secuencia diferente. El programa de c es el siguiente:
Codigo:

#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

char opcion;

izq()
   {
    do
       {
        output_b(5);
        delay_ms(1000);
        output_b(9);
        delay_ms(1000);
        output_b(10);
        delay_ms(1000);
        output_b(6);
        delay_ms(1000);
       }
     while (opcion=="1");
   }
der()
   {
     do
         {
           output_b(6);
           delay_ms(1000);
           output_b(10);
           delay_ms(1000);
           output_b(9);
           delay_ms(1000);
           output_b(5);
           delay_ms(1000);
         }
     while (opcion=="2");
   }
   
detener()
       {
         do
            {
              while(!kbhit());
              opcion=getc();
            }
        while (opcion<"1"||opcion>"3");
      }

main()
   {
      set_tris_b(0x00);
      while (TRUE)
              {
                detener();
       
                switch (opcion)
               {
                case "1":
                    izq();
                    break;
                case "2":
                    der();
                    break;
                case "3":
                                 detener();
                    break;
                              }    
           }
   }


La verdad no se si haya alguna forma de que cuando yo envíe un caracter diferente pues me saque del ciclo, de antemano gracias por la ayuda.
Título: RE: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: narcosystem en 28 de Junio de 2004, 13:19:00
Yo cro que deberias usar la interuupcion de buffer de recepcion lleno #int_rda, y mantener la parte del switch(opcion), entonces cuando te llegue un caracter lo metes en opcion y en el switch se te mete en la funcion que tu le hayas enviado.Espero haberte sido de ayuda
Título: RE: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: pocher en 28 de Junio de 2004, 13:55:00
Se puede hacer de varias formas. Por seguir con lo que ya tienes puesto, la solución sería:

Codigo:
#include <16f876.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  

char opcion;

izq()
{
//   do
//    {
        output_b(1);
        delay_ms(1000);
        output_b(2);
        delay_ms(1000);
        output_b(4);
        delay_ms(1000);
        output_b(8);
        delay_ms(1000);
//    }
//    while (opcion=="1");
}
der()
{
//   do
//    {
       output_b(8);
        delay_ms(1000);
        output_b(4);
        delay_ms(1000);
        output_b(2);
        delay_ms(1000);
        output_b(1);
        delay_ms(1000);
//    }
//    while (opcion=="2");
}

/*
   
detener()
{
   do
    {
       while(!kbhit());
        opcion=getc();
    }
    while (opcion!="1" && opcion!="2");
}

*/

detener()
{
      output_b(0);
}

main()
{
   set_tris_b(0x00);
   output_b(0);
   
    while (TRUE)
    {
       //detener();
       
       opcion=getc();
       
        switch (opcion)
       {
         case "1":
          do
          izq();
          while(!kbhit());
          break;
          case "2":
          do
          der();
          while(!kbhit());
          break;
          case "3":
           detener();
          break;
        }    
    }
}



Un saludo
Título: RE: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: badtzdizzy en 28 de Junio de 2004, 14:32:00
Listo Amigos !!!

Ya quedó y justo como lo quería, ahora quisiera saber como sería la mejor forma de mandar el valor de la frecuencia, yo lo hago de la siguiente forma:
Codigo:

char opcion;
float duty,per;

izq()
   {
        output_b(5);
        delay_ms(per);
        output_b(9);
        delay_ms(per);
        output_b(10);
        delay_ms(per);
        output_b(6);
        delay_ms(per);
   }
     
der()
   {
       output_b(6);
       delay_ms(per);
       output_b(10);
       delay_ms(per);
       output_b(9);
       delay_ms(per);
       output_b(5);
       delay_ms(per);
   }
   
detener()
       {
          output_b(0);
       }

main()
   {
    set_tris_b(0x00);
    output_b(0);
    while (TRUE)
         {
           opcion=getc();
          
           switch (opcion)
                  {
                   case "1":
                       while(!kbhit());
                       duty=getc();
                       per=duty/4;
                       do
                       izq();
                       while (!kbhit());
                       break;
                   case "2":
                       while(!kbhit());
                       duty=getc();
                       per=duty/4;
                       do
                       der();
                       while (!kbhit());
                       break;
                   case "3":
                       do
                       detener();
                       while (!kbhit());
                       break;          
                  }    
         }
   }


Lo que en ocasiones me sucede es que al prender la fuente que alimenta el pic, pues se presenta una secuencia sin antes haber corrido el programa en visual. Saben a qué se pueda deber? Gracias por todo.
Título: RE: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: kruskal en 28 de Junio de 2004, 18:27:00
coloca un retardo de unos 500 ms porque (!kbhit()) parece esta detectando incorrectamente el envio de un caracter al energizar el circuito

Saludos
Título: RE: Cómo salir de un ciclo al entrar datos por el puerto serie
Publicado por: badtzdizzy en 29 de Junio de 2004, 14:41:00
Resultó que cuando quité el float pues ya no lo hizo, pero de todos modos checaré lo del retardo. Ahora lo que está sucediendo es que en ocasiones el pic deja de responder a los datos enviados desde el visual, y lo hace hasta que reseteo el pic mismo. Habrá alguna manera de solucionar esto ? Gracias.