Autor Tema: Cómo salir de un ciclo al entrar datos por el puerto serie  (Leído 1810 veces)

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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Cómo salir de un ciclo al entrar datos por el puerto serie
« 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.

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
RE: Cómo salir de un ciclo al entrar datos por el puerto serie
« Respuesta #1 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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Cómo salir de un ciclo al entrar datos por el puerto serie
« Respuesta #2 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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Cómo salir de un ciclo al entrar datos por el puerto serie
« Respuesta #3 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.

Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Cómo salir de un ciclo al entrar datos por el puerto serie
« Respuesta #4 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

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
RE: Cómo salir de un ciclo al entrar datos por el puerto serie
« Respuesta #5 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.


 

anything