Autor Tema: Ayuda con kbhit()  (Leído 3740 veces)

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

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Ayuda con kbhit()
« en: 06 de Septiembre de 2011, 12:50:39 »
Hola a todos,

Hice un programita k envia 5 caracteres (contraseña) del pc al pic, este lo compara con otros caracteres.
* Si los caracteres tecleado  son correctos prende led por 2seg si no son correctos apaga led por 2 seg.
* Mientras no se envia caracter el led esta oscilando cada 100ms.
Todo funciona bien pero cuando tecleo muy rapido el pic se loquea y ya no me hace caso, a k se debe eso.
Gracias y saludos.

Aqui posteo el codigo.

#include <16f876.h>
#fuses   XT,NOWDT,NOPUT
#use     delay(clock=20000000)
#use     rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, parity=N)

  void main (void){
     
     int   i=0;
     char  Data[5];
     
     SET_TRIS_A(0x00);       // RA0 salida
     
     output_low (pin_A5);

     while(TRUE){                     
        if(kbhit()){
           Data=getc();
           i++;
           if(i==5){
               i=0;
               if(Data[0]=='E'&& Data[1]=='d' && Data[2]=='w'&& Data[3]=='i'&& Data[4]=='n'){  //aqui compara
                  puts("Recibido");
                  output_high(PIN_A5);
                  delay_ms(2000);
               }
               else{
                  puts("Error");
                  output_low(PIN_A5);
                  delay_ms(2000);
               }               
           }
        }
        output_high (pin_A5);
        delay_ms(100);
        output_low (pin_A5);
        delay_ms(100);
    }     
  }

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ayuda con kbhit()
« Respuesta #1 en: 06 de Septiembre de 2011, 22:13:59 »
Yo te aconsejo utilizar mejor una interrupción para la recepción

Saludos.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con kbhit()
« Respuesta #2 en: 06 de Septiembre de 2011, 22:54:04 »
  Pregunta.... ¿No hay un error en la línea "Data=getc();", no debería ser "Data=getc();"?
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Ayuda con kbhit()
« Respuesta #3 en: 06 de Septiembre de 2011, 22:58:03 »
O intenta subir los baud a 38400 o mas  :mrgreen:

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con kbhit()
« Respuesta #4 en: 06 de Septiembre de 2011, 23:38:00 »
Código: C#
  1. Data[i] = getc();


cierto AngelGris?  ;-)
El papel lo aguanta todo

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con kbhit()
« Respuesta #5 en: 06 de Septiembre de 2011, 23:45:26 »
Código: C#
  1. Data[i] = getc();


cierto AngelGris?  ;-)

  Gracias por la correción MLO__ en el apuro me comí los corchetes  :oops:
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Ayuda con kbhit()
« Respuesta #6 en: 07 de Septiembre de 2011, 01:03:39 »
Hola a todos,

Gracias por sus respuestas debo decir que copie mal mi programita en esta parte Data = getc()  en el CCS estaba bien, zorry a todos .
Como les dije el programa funciona bien pero cuando uno ingresa rapido la contraseña el pic se loquea y no hace caso; pero repito si digito poco rapido funciona muy bien.
Que pasa cuando el pic esta en los retardos output_high (pin_A5);  delay_ms(100); y ingresa un caracter ?...

Tambien lo hice con interrupiones para Rx pero no me salio se aceptan sugerencias ...
Sl2.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Ayuda con kbhit()
« Respuesta #7 en: 07 de Septiembre de 2011, 09:23:23 »

..........

Que pasa cuando el pic esta en los retardos output_high (pin_A5);  delay_ms(100); y ingresa un caracter ?...

Tambien lo hice con interrupiones para Rx pero no me salio se aceptan sugerencias ...
Sl2.


  No utilizo CCS y no conozco como se configura el RS232 con dicho compilador, solo puedo sugerirte de asegurarte que lo estés implementando por HardWare. Y luego sí utilizar la interrupción de dicho modulo. Tal vez esté pasando lo que indicas y justo esté ingresando un caracter mientras estás en el delay y entonces lo perderías pero no sé si sería suficiente como para loquear al pic.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Ayuda con kbhit()
« Respuesta #8 en: 07 de Septiembre de 2011, 11:48:52 »
Podés ver este hilo del maestro Redpic

http://www.todopic.com.ar/foros/index.php?topic=23222.0
Allí hay varios ejemplos que te van a ser de utilidad.  :)
          Saludos.
          Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Ayuda con kbhit()
« Respuesta #9 en: 07 de Septiembre de 2011, 16:31:56 »
Hola.

Lo que sucede es que estas accediendo al byte que transmites cada cierto tiempo y por eso, si lo escribes muy rápido, no lo va a leer, porque puede darse el caso que cuando llegue el byte el programa este en la rutina de delay_ms(); o en otro lado.

Para evitar eso, es mejor usar interrupciones, es decir, que el PIC interrumpa lo que este haciendo en el programa principal para ir a leer el byte que llega por la USART. 

Mira el link que te han puesto o busca en foro acerca de interrupciones, hay mucha info al respecto

Saludos
El papel lo aguanta todo

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ayuda con kbhit()
« Respuesta #10 en: 07 de Septiembre de 2011, 18:20:41 »
Hola amigo, el manejo de las interrupciones es bastante sencillo y más en CCS, revisa este ejemplo.

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
variable = getc(); //Se lee el dato recibido
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram

void main() //Rutina principal
{

enable_interrupts(global); //Habilitación de todas las interrupciones
enable_interrupts(int_rda); //Habilitación de todas las interrupciones


Saludos.

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Ayuda con kbhit()
« Respuesta #11 en: 10 de Septiembre de 2011, 13:24:27 »
Hola a todos;

Aqui pongo el mismo programa hecho con int. Pero tengo un problema no ocurre la int lo simulo en proteus (uso el archivo xxx.cof) y veo que solo esta en los led (prende y apaga), no encuentro el problema ; espero sus comentarios muchas gracias.

#int_rda

  char ch;
  int Flag_int_Rx=0;
 
  void serial_isr(){
    ch=getchar();
    Flag_int_Rx=1;
  }

  void main (){
     
     int   i=0;
     char  Data[5];
     
     enable_interrupts(global);
     enable_interrupts(int_rda);
     SET_TRIS_A(0x00);       // RA0 salida
     output_low (pin_A5);

     while(TRUE){                     
        if(Flag_int_Rx==1){
           flag_int_Rx=0;
           Data[ i ]=ch;
           i++;
           if(i==5){
               i=0;
               if(Data[0]=='E'&& Data[1]=='d' && Data[2]=='w'&& Data[3]=='i'&& Data[4]=='n'){
                  puts("Recibido");
                  disable_interrupts(int_rda);
                  output_high(PIN_A5);
                  delay_ms(2000);
                  enable_interrupts(int_rda);
               }
               else{
                  puts("Error");
                  disable_interrupts(int_rda);
                  output_low(PIN_A5);               
                  delay_ms(2000);
                  enable_interrupts(int_rda);
               }               
           }
        }
        if(Flag_int_Rx==0){
            output_high (pin_A5);
            delay_ms(100);
            output_low (pin_A5);
            delay_ms(100);
        }
    }     
  }

Desconectado Edwin_pe

  • PIC12
  • **
  • Mensajes: 82
Re: Ayuda con kbhit()
« Respuesta #12 en: 11 de Septiembre de 2011, 00:25:58 »
Encontre la falla, ahora esta bien ...
   
  char ch;
  int Flag_int_Rx=0;

#int_rda

  void serial_isr(){
    ch=getchar();
    Flag_int_Rx=1;
  }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con kbhit()
« Respuesta #13 en: 11 de Septiembre de 2011, 01:11:04 »
Para incrustar código en el foro podes usar:

[ code ] Tu código [ /code ]


Sin espacio entre corchetes  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything