Autor Tema: como hago pausas en el programa principal ( pausa reanudar ) mediante un botón  (Leído 3271 veces)

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

Desconectado EDJMM91

  • PIC10
  • *
  • Mensajes: 5
aclaro" soy novato y es mi 5to proyecto después del hola mundo " actualmente trabajo en un proyecto . que es un tester" o punta de prueba enfocado al ramo automotriz usando un ( lcd nokia 5110 de 84*48 ) con un menú y varias teclas para controlarlo .  simplemente necesito una tecla llamada hold que al presionarla se pause el programa en el microcontrolador y se quede el mensaje en la pantalla que mostraba en ese momento . es decir necesito una tecla (hold) como la que traen los tester, que se congele lo que se esta mostrando en la pantalla y al volver a presionar continúe con el programa . este es parte del el código donde necesito tal función .

// en esta función se muestra el voltaje en la entrada del microcontrolador AN0 // el valor mostrado en la pantalla lcd varía dependiendo del voltaje en la entrada   //  falta agregar una tecla en el pin RE0 con una resistencia a PULL LLUP"
Código: C
  1. [b]
  2. //..................................................................//
  3. entonces if((bit_test(porte,0)==0) {
  4. // si esta tecla es presionada . congelar  lo que se esta mostrando en ese momento y si la vuelvo a presionar continúe leyendo el voltaje .
  5. }
  6. //..................................................................//
  7. a[/b]
qui el codigo que llevo :

Código: C
  1. void voltimetro(void){
  2. if((bit_test(porte,1)==0)&&((casse)==7)){
  3. volt=0;
  4. break;
  5. break;
  6. }
  7.  
  8. if((bit_test(porte,1)==0)&&((casse)==1)){
  9. volt=0;    
  10. delay_ms(50);
  11. break;
  12. break;
  13. }
  14. //////////////////////////////////////7
  15. SETUP_ADC(ADC_CLOCK_INTERNAL);  
  16. SETUP_ADC_PORTS(AN0);
  17.  
  18.    while(volt){   // inicio bucle infinito
  19.    
  20.    SET_ADC_CHANNEL(0);
  21.    delay_us(20);
  22.    valor_adc=READ_ADC();
  23.    voltaje=50.0*valor_adc/1023.0;
  24.  
  25.    nokia_gotoxy (10,2);
  26.    printf (nokia_printchar, "volt:%fv  ",voltaje);
  27.  
  28. //////////////rutina para salir /////////
  29. if((bit_test(porte,1)==0)&&((casse)==7)){
  30.  
  31. nokia_clean_ddram();
  32. volt=0;
  33.        
  34. delay_ms(50);
  35. break;
  36. break;
  37. }
  38.  
  39. if((bit_test(porte,1)==0)&&((casse)==1)){
  40.  
  41. nokia_clean_ddram();
  42. volt=0;
  43.        
  44. delay_ms(50);
  45. break;
  46. break;
  47. }
  48. /////////////////////////////
  49.    } // FIN DEL BUCLE WHILE
  50. }  // FIN DEL main

// adjunté 2 imágenes de la simulación en proteus .  gracias y al finalizar el proyecto subo todos los archivos

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Hola, puedes hacer que al presionar la tecla HOLD, el programa entre en una función while o loop infinito, y que sólo esté leyendo el botón HOLD, para poder salir de ese bucle y continuar en el programa principal.
Aclaro, que no acostumbro a ésto, porque el programa principal, pierde control absolutamente de todo,  yo más bien apuesto por la arquitectura multitarea, en el cuál el programa principal recorre todas las acciones posibles, analizando condiciones verdaderas para ejecutar.
Otra alternativa que yo usaría sería, que al presionar la tecla HOLD, el displays no se refresque, y el resto del programa se siga ejecutando normalmente.
« Última modificación: 23 de Mayo de 2019, 22:21:52 por Robert76 »

Desconectado EDJMM91

  • PIC10
  • *
  • Mensajes: 5
Gracias amigo @Robert76  use tu idea de ,el programa entre en una función while y que sólo esté leyendo el botón hold , para poder salir de ese bucle con un break y continuar en el programa principal. le agregue un led a pin_d7 para indicar cuando este en HOLD" .

aquí el código funcionando a la perfección :

Código: C
  1. void voltimetro(void){
  2. if((bit_test(porte,1)==0)&&((casse)==7)){
  3. volt=0;
  4. break;
  5. break;
  6. }
  7.  
  8. if((bit_test(porte,1)==0)&&((casse)==1)){
  9. volt=0;    
  10. delay_ms(50);
  11. break;
  12. break;
  13. }
  14. //////////////////////////////////////7
  15. SETUP_ADC(ADC_CLOCK_INTERNAL);  
  16. SETUP_ADC_PORTS(AN0);
  17.  
  18.    while(volt){   // inicio bucle infinito
  19.    
  20.  ////////////////////funcion HOLD //////////////////////////////
  21.  
  22.              if(!input(HOLD)){         // if 1, HOLD=PIN_E, Esta presionado?  Si lo esta entro
  23.              output_toggle(HOLD_LED);  // Cambio el estado del LED
  24.              delay_ms(10);             // Delay rebote
  25.              while(!input(HOLD));      // Espero hasta que se suelte el boton,
  26.          
  27.              while(true){              // entro en el bucle
  28.              if(!input(HOLD)){         //if 2, Esta presionado?  Si lo esta entro
  29.              output_toggle(HOLD_LED);  // Cambio el estado del LED
  30.              delay_ms(10);             // Delay rebote
  31.              while(!input(HOLD));      // Espero hasta que se suelte el boton,
  32.              break; // salgo del bucle
  33.              } //if 2
  34.           } // FIN DEL BUCLE
  35.        } // if 1
  36. ////////////////////////////////////////////////////////////////////////////
  37.    SET_ADC_CHANNEL(0);
  38.    delay_us(20);
  39.    valor_adc=READ_ADC();
  40.    voltaje=50.0*valor_adc/1023.0;
  41.  
  42.    nokia_gotoxy (10,2);
  43.    printf (nokia_printchar, "volt:%fv  ",voltaje);
  44.  
  45. //////////////rutina para salir /////////
  46. if((bit_test(porte,1)==0)&&((casse)==7)){
  47.  
  48. nokia_clean_ddram();
  49. volt=0;
  50.        
  51. delay_ms(50);
  52. break;
  53. break;
  54. }
  55.  
  56. if((bit_test(porte,1)==0)&&((casse)==1)){
  57.  
  58. nokia_clean_ddram();
  59. volt=0;
  60.        
  61. delay_ms(50);
  62. break;
  63. break;
  64.      }
  65.    } // FIN DEL BUCLE WHILE
  66. }
// FIN DEL M