Autor Tema: problema con push button  (Leído 144 veces)

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

Desconectado Superboy

  • PIC10
  • *
  • Mensajes: 21
problema con push button
« en: 06 de Febrero de 2019, 17:00:42 »
Hola buena tarde, estoy probando comunicacion serial con un push button y una lcd, por medio del pic maestro yo presiono un push button y este envia un caracter en concreto '1' y el pic esclavo debe aumentar un variable contador de 1 en 1, el problema que me surge es que al oprimir el boton el contador aumenta drasticamente su valor sin detenerse, no aumenta de 1 en 1 conforme yo oprimo el botón solo pulso una vez y de ahi aumenta y sin detenerse en algun valor.
Alguien que me pueda decir, ¿que es lo que debo hacer para que aumente el contador cada que yo pulse el boton?
Trabajo con pic 16f887 y pic c compiler.

Código: C++
  1.  
  2. ///////////// esclavo ///////////////
  3.  
  4. #INCLUDE <16F887.H>
  5. #FUSES INTRC_IO,NOWDT,NOMCLR,NOLVP
  6. #USE DELAY(INTERNAL=4M)
  7.  
  8. #USE RS232 (baud=57600,rcv=pin_c7,xmit=pin_c6,bits=8,parity=N)
  9.  
  10. #use fast_io(D)
  11.  
  12. #priority rda
  13.  
  14. #define LCD_RS_PIN      PIN_D0
  15. #define LCD_RW_PIN      PIN_D1
  16. #define LCD_ENABLE_PIN  PIN_D2
  17. #define LCD_DATA4       PIN_D3
  18. #define LCD_DATA5       PIN_D4
  19. #define LCD_DATA6       PIN_D5
  20. #define LCD_DATA7       PIN_D6
  21.  
  22. #include <lcd.c>
  23.  
  24.  
  25. int8 conteo=0;
  26. int k;
  27.  
  28. #int_rda
  29. void serial_isr(void)
  30. {
  31.  
  32.     K=getc();
  33.  
  34. }
  35.  
  36. void main()
  37. {
  38.      
  39.    disable_interrupts(global);
  40.    
  41.    setup_comparator(NC_NC_NC_NC);
  42.    
  43.    set_tris_D(0b0);
  44.  
  45.    lcd_init();  
  46.    
  47.    lcd_gotoxy(4,1);
  48.    lcd_putc("Proyecto");
  49.    
  50.    lcd_gotoxy(6,2);
  51.    lcd_putc("VEOX");
  52.    
  53.    delay_ms(2000);
  54.    
  55.    lcd_putc("\f"); ///// limpia la LCD
  56.    
  57.    enable_interrupts(int_rda);
  58.    enable_interrupts(global);
  59.    
  60.    while(TRUE)
  61.    {
  62.      
  63.          lcd_gotoxy(1,1);
  64.          printf(lcd_putc,"Pasos=");//imprimir entero
  65.          lcd_gotoxy(7,1);
  66.          printf(lcd_putc,"%u",conteo);//imprimir entero
  67.           delay_ms(5);
  68.    
  69.          if(k=='1')
  70.             {
  71.               conteo++;
  72.             }        
  73.                  
  74.    }
  75.  
  76.  
  77. }
  78.  
 

Código: C++
  1.  
  2. ////////////// maestro ///////////////////
  3.  
  4. #INCLUDE <16F887.H>
  5. #FUSES INTRC_IO,NOWDT,NOMCLR,NOLVP
  6. #USE DELAY(INTERNAL=4M)
  7.  
  8. #USE RS232 (baud=57600,rcv=pin_c7,xmit=pin_c6,bits=8,parity=N)
  9.  
  10. #use fast_io(A)
  11. #use fast_io(D)
  12.  
  13.  
  14. #define LCD_RS_PIN      PIN_D0
  15. #define LCD_RW_PIN      PIN_D1
  16. #define LCD_ENABLE_PIN  PIN_D2
  17. #define LCD_DATA4       PIN_D3
  18. #define LCD_DATA5       PIN_D4
  19. #define LCD_DATA6       PIN_D5
  20. #define LCD_DATA7       PIN_D6
  21.  
  22. #include <lcd.c>
  23.  
  24. #DEFINE B1  PIN_A0
  25.  
  26. void main()
  27. {
  28.      
  29.    disable_interrupts(global);
  30.    
  31.    setup_comparator(NC_NC_NC_NC);
  32.    
  33.    set_tris_D(0b0);
  34.    set_tris_A(0b1);
  35.    
  36.    lcd_init();  
  37.    
  38.    lcd_gotoxy(4,1);
  39.    lcd_putc("Proyecto");
  40.    
  41.    lcd_gotoxy(6,2);
  42.    lcd_putc("VEOX");
  43.    
  44.    delay_ms(2000);
  45.    
  46.    lcd_putc("\f"); // limpia la LCD
  47.    
  48.    while(TRUE)
  49.    {
  50.    
  51.          if(input(B1)==1)
  52.             {
  53.               PUTC('1');
  54.             }
  55.        
  56.                  
  57.    }
  58.  
  59.  
  60. }
  61.  

Muchas gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7051
Re:problema con push button
« Respuesta #1 en: 06 de Febrero de 2019, 19:29:37 »
Esclavo/Receptor:

C es case sensitive, asi que K mayuscula (en la interrupcion) no es lo mismo que k minuscula.

El otro problema es que una ves recibido un '1', k mantiene ese valor hasta que no llegue otra cosa... entonces siempre va a aumentar. Dentro del k == '1' pone k igual a 0, asi no hay problemas. Y por otro lado declara a k como volatile.

Maestro/Transmisor:

Deberias tener una especie de bloquo para que no envie muchas veces el '1', asi se envia una sola ves.

Código: C
  1.          if(input(B1)==1)
  2.             {
  3.               PUTC('1');
  4.               delay_ms(10);   // Pequeño antirebote
  5.               while(input(B1)==1); //Espera aca hasta qeu se suelte el boton.
  6.             }

Desconectado Robert76

  • PIC16
  • ***
  • Mensajes: 123
Re:problema con push button
« Respuesta #2 en: 06 de Febrero de 2019, 22:01:15 »
Hola, yo utilizo ésta subrutina para detectar sólo una vez una pulsación, también funciona cómo antirrebotes.
Ejem:

if(!boton)          'detecta botón pulsado
  {
    if(Var<250)Var++;
    if(Var==200)"realiza la acción deseada"
  }
else Var=0;
« Última modificación: 06 de Febrero de 2019, 22:03:29 por Robert76 »

Desconectado Superboy

  • PIC10
  • *
  • Mensajes: 21
Re:problema con push button
« Respuesta #3 en: 06 de Febrero de 2019, 23:03:56 »
Esclavo/Receptor:

C es case sensitive, asi que K mayuscula (en la interrupcion) no es lo mismo que k minuscula.

El otro problema es que una ves recibido un '1', k mantiene ese valor hasta que no llegue otra cosa... entonces siempre va a aumentar. Dentro del k == '1' pone k igual a 0, asi no hay problemas. Y por otro lado declara a k como volatile.

Maestro/Transmisor:

Deberias tener una especie de bloquo para que no envie muchas veces el '1', asi se envia una sola ves.

Código: C
  1.          if(input(B1)==1)
  2.             {
  3.               PUTC('1');
  4.               delay_ms(10);   // Pequeño antirebote
  5.               while(input(B1)==1); //Espera aca hasta qeu se suelte el boton.
  6.             }

muchas gracias por las respuestas solo tengo duda en como pongo eso de k como volatile osea asi lo escribo volatile k; ¿?

Desconectado Superboy

  • PIC10
  • *
  • Mensajes: 21
Re:problema con push button
« Respuesta #4 en: 06 de Febrero de 2019, 23:35:47 »
Hola, yo utilizo ésta subrutina para detectar sólo una vez una pulsación, también funciona cómo antirrebotes.
Ejem:

if(!boton)          'detecta botón pulsado
  {
    if(Var<250)Var++;
    if(Var==200)"realiza la acción deseada"
  }
else Var=0;
+

gracias por tu respuesta, tengo duda sobre si eso lo usas con el adc o ¿como? o ¿por que el valor de 250?

Desconectado Robert76

  • PIC16
  • ***
  • Mensajes: 123
Re:problema con push button
« Respuesta #5 en: 07 de Febrero de 2019, 00:09:29 »
Ésta subrutina no tiene nada que ver con el ADC.
El valor 250 lo elegí para usar una simple variable int. Porque el valor máximo es 255.
Puedes usar un valor menor si quieres, todo depende de la velocidad cíclica del programa. Ahora, si reduces el número 250, también deberás hacerlo en el 200. Pues a un valor menor, mayor velocidad de respuesta de detección de botón pulsado.


 

anything