Autor Tema: ACTUALIZAR VARIABLES  (Leído 1477 veces)

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

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
ACTUALIZAR VARIABLES
« en: 31 de Agosto de 2015, 05:48:57 »
Hola Amigos, llevo tiempo que intento que las variables que tengo estén funcionando continuamente, y que cuando pulse la tecla muestra la el valor de la variable de ese momento. El programa es el siguiente(tengo el pic18f4550 y cristal de 20MHz):

Código: [Seleccionar]
//Obtener Datos
void Obtenerdatos()
{
   TEMPERATURA_MOTOR();
   NIVEL_COMBUSTIBLE();
   TACOMETRO();
}

void mostrar_variable_1(){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc, "TEMP = %04.1f ºC",TC);

}
void mostrar_variable_2(){
lcd_putc('\f');
printf(lcd_putc, "\fADC = %4ld", l);
printf(lcd_putc, "\nVoltage = %01.2fV", p);
}
void mostrar_variable_3(){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"RPM = %0f RPM",RPM);     
lcd_gotoxy(1,2);
printf(lcd_putc,"Vel = %0f Km/h",VEL);
}

main(){
CONFIGURACIONES Y TAL

while(TRUE){
Obtenerdatos();
k=kbd_getc();

if (k!=0 & j!=k)
{
j=k;
}
else
{
j=0;
}
              //Comprueba que la tecla presionada no sea la misma que se presiono la ultima vez             

switch(Nivelmenu){
   case 0:
          switch (j){                  //Menu principal
          case '1':
                  Mostrar_menu_de_variables();
                  Nivelmenu=1;
                  break;
          case '2':
                  EnviarDatos();
                  break;
          default:
                  break;
          }
          break;
   case 1:                          //Menu de variables, se muestran todas las variables para que se seleccione una
          switch (j){
          case '1':
                  Mostrar_menu_var();
                  variable=1;
                  Nivelmenu=2;
                  break;
          case '2':
                  Mostrar_menu_var();
                  variable=2;
                  Nivelmenu=2;
                  break;
          case '3':
                  Mostrar_menu_var();
                  variable=3;
                  Nivelmenu=2;
                  break;
          case '4':
                  Mostrar_menu_var();
                  variable=4;
                  Nivelmenu=2;
                  break;   
          default:
                 break;
          }
          break;
    case 2:                                     // Menu de cada variable, todas tienen 2 opciones, obtener datos y salir al menu anterior
           switch (variable){
           case '1':                   
                   mostrar_variable_1();                   
                   break;
           case '2':
                   mostrar_variable_2();                   
                   break;
           case '3':
                   mostrar_variable_3();                   
                   break;
     
           default:
                  break;
           }
           if (j=='#')
           {
                   Mostrar_menu_de_variables();
                   Nivelmenu=1;
                   break;
           }
           break;

    default:                                 // Caso unico que por algun problema se llegue este punto, poniendo a 0 y el nivel y mostrando el menu inicial
            Mostrar_menu_inicial();
            Nivelmenu=0;
            break;
}
}

El problema es que en el ultimo cuando pico para que me muestre una variable no entra, se queda como pillado en cambio si pulso a que vuelva atrás funciona correctamente. No entiendo a que es debido este problema.

Probé a quitar el Obtenerdatos() de dentro del while y del main, entonces me muestra el valor de la variable pero no se actualiza, es decir, muestra el valor del momento que has apretado la tecla.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ACTUALIZAR VARIABLES
« Respuesta #1 en: 31 de Agosto de 2015, 06:03:11 »
Creo que hace mucho ya habiamos acordado que el problema era lo que tenias en estas funciones:

   TEMPERATURA_MOTOR();
   NIVEL_COMBUSTIBLE();
   TACOMETRO();

Que tenian un while dentro. y no deberia tener nada de eso..

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: ACTUALIZAR VARIABLES
« Respuesta #2 en: 31 de Agosto de 2015, 06:13:00 »
Si KILLERJC, no tienen ningun tipo de while(). Por eso me intriga que no funcione.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ACTUALIZAR VARIABLES
« Respuesta #3 en: 31 de Agosto de 2015, 07:05:36 »
Veo algunas cosas que me olvide en su momento o tuve ese error

if (k!=0 & j!=k)

por

if (k!=0 && j!=k)

y Agregarle un case, para el nivelmenu=1, de todas formas esto no va a modificarte nada.

Código: C
  1. case '#':
  2.                   Mostrar_menu_inicial();
  3.                   Nivelmenu=0;
  4.                   break;

Imagino que por eso habia puesto como 4 variables. y me olvide de cambiarlo por el #. Por las dudas lo modifique por que si presionabas esa 4ta variable ibas a terminar con el mismo error.

Con respecto a tu problema
Ya encontre el por que.... Cuando hace switch(variable) lo hace por un numero. Pero nuestro case tiene una letra , '3' es distinto que 3. asi que le quite las comillas
          case '3':


Aca esta corregido:

Código: C
  1. main(){
  2.  
  3.  
  4. while(TRUE){
  5. Obtenerdatos();
  6. k=kbd_getc();
  7.  
  8. if (k!=0 && j!=k)
  9. {
  10.    j=k;
  11. }
  12. else
  13. {
  14.    j=0;
  15. }
  16.               //Comprueba que la tecla presionada no sea la misma que se presiono la ultima vez            
  17.  
  18. switch(Nivelmenu){
  19.    case 0:
  20.           switch (j){                  //Menu principal
  21.           case '1':
  22.                   Mostrar_menu_de_variables();
  23.                   Nivelmenu=1;
  24.                   break;
  25.           case '2':
  26.                   EnviarDatos();
  27.                   break;
  28.           default:
  29.                   break;
  30.           }
  31.           break;
  32.    case 1:                          //Menu de variables, se muestran todas las variables para que se seleccione una
  33.           switch (j){
  34.           case '1':
  35.                   Mostrar_menu_var();
  36.                   variable=1;
  37.                   Nivelmenu=2;
  38.                   break;
  39.           case '2':
  40.                   Mostrar_menu_var();
  41.                   variable=2;
  42.                   Nivelmenu=2;
  43.                   break;
  44.           case '3':
  45.                   Mostrar_menu_var();
  46.                   variable=3;
  47.                   Nivelmenu=2;
  48.                   break;
  49.           case '#':
  50.                   Mostrar_menu_inicial();
  51.                   Nivelmenu=0;
  52.                   break;    
  53.           default:
  54.                  break;
  55.           }
  56.           break;
  57.     case 2:                                     // Menu de cada variable, todas tienen 2 opciones, obtener datos y salir al menu anterior
  58.            switch (variable){
  59.            case 1:                  
  60.                    mostrar_variable_1();                  
  61.                    break;
  62.            case 2:
  63.                    mostrar_variable_2();                  
  64.                    break;
  65.            case 3:
  66.                    mostrar_variable_3();                  
  67.                    break;
  68.      
  69.            default:
  70.                   break;
  71.            }
  72.            if (j=='#')
  73.            {
  74.                    Mostrar_menu_de_variables();
  75.                    Nivelmenu=1;
  76.                    break;
  77.            }
  78.            break;
  79.  
  80.     default:                                 // Caso unico que por algun problema se llegue este punto, poniendo a 0 y el nivel y mostrando el menu inicial
  81.             Mostrar_menu_inicial();
  82.             Nivelmenu=0;
  83.             break;
  84. }
  85. }
« Última modificación: 31 de Agosto de 2015, 07:08:10 por KILLERJC »

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: ACTUALIZAR VARIABLES
« Respuesta #4 en: 02 de Septiembre de 2015, 06:00:46 »
Gracias KILLERJC, tenias razon lo que me jodia era el '1'.

Ahora estoy probando de introducirle un retardo al pulsar una tecla debido a que cuando pulsas, le cuesta entrar en los diferentes menus o aveces se salta alguno y va directamente a las variables. Como si no hiciera acción la tecla, he de pulsar mucho para que entre.

Poniendo algún tipo de antirebote serviría?
« Última modificación: 02 de Septiembre de 2015, 06:47:12 por ADY12 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ACTUALIZAR VARIABLES
« Respuesta #5 en: 03 de Septiembre de 2015, 02:36:10 »
Citar
Ahora estoy probando de introducirle un retardo al pulsar una tecla debido a que cuando pulsas, le cuesta entrar en los diferentes menus o aveces se salta alguno y va directamente a las variables. Como si no hiciera acción la tecla, he de pulsar mucho para que entre.

Poniendo algún tipo de antirebote serviría?

Es raro que lo me estas comentando, al menos una parte.

El codigo al comienzo revisa si es que la tecla ya fue presionada. si fue presionada no le da importancia. es decir que por mas que lo tengas presionado no va a haber forma que te lo tome varias veces.
El codigo de multiplezado del teclado 4x4 lo hace aun mas dificil que esto ocurra.
Eso con respecto al antirebote.

Y con respecto a el tema de que tenes que presionarlo mucho , eso es posible si esta tardando demasiado en hacer lo que debe. Pero no creo que tarden segundos para hacerlo ( me refiero a tomar los datos + escribir el LCD)

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: ACTUALIZAR VARIABLES
« Respuesta #6 en: 03 de Septiembre de 2015, 05:58:55 »
Perdona KILLERJC por no explicarme bien.

Le he puesto un retardo en los void_mostrar_variable, para que cuando se visualice por el LCD se vea correctamente. El problema es que por las pruebas que he hecho tiene pinta a que este retardo afecta al teclado también. A parte de saltarse el Mostrar_menu_var();

Código: [Seleccionar]
void mostrar_variable_1(){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc, "TEMP = %04.1f ºC",TC);
delay_ms(100);
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ACTUALIZAR VARIABLES
« Respuesta #7 en: 03 de Septiembre de 2015, 06:11:16 »
Si eso afecta al retardo. Si tu idea es la de que se muestre mas lento, entonces podrias tener una solucion un poco mas simple pero a la ves no tan linda. Crea una variable "cuenta"

Código: C
  1. // Esto global
  2. int cuenta;

Y el resto adentro del swith o dentro de la funcion
Código: C
  1. case 1:
  2.      if (cuenta==10)
  3.      {
  4.          mostrar_variable_1();
  5.          cuenta = 0;
  6.      }
  7.      break;

Este seria el caso de ponerlo dentro de la funcion
Código: C
  1. void mostrar_variable_1(){
  2.   if(cuenta==10)
  3.   {
  4.      lcd_putc('\f');
  5.      lcd_gotoxy(1,1);
  6.      printf(lcd_putc, "TEMP = %04.1f ºC",TC);
  7.   }
  8. }

Esto va a hacer que no se quede en el delay esperando, y que solo actualize el LCD en la decima lectura. Asi de esa forma no cambia demasiado el valor del LCD y es mas legible.
Creo que es esto lo que intentabas hacer. Obviamente vas a tener que buscar el valor que mas te guste.

La otra opcion es la de usar un timer y por interupcion avizar cuando es que se puede actualizar el LCD o no.

Desconectado ADY12

  • PIC10
  • *
  • Mensajes: 43
Re: ACTUALIZAR VARIABLES
« Respuesta #8 en: 15 de Septiembre de 2015, 07:28:19 »
Hola KILLERJC, una cuestión, antes de todo comentarte que ya funciona correctamente el tema del teclado, hice un par de modificaciones, cree un nivelmenu=3, debido a que sino no me actualizaba correctamente y no entraba correctamente. Bueno esto funciona correctamente ya.

Quiero transmitir ver estos datos en LABVIEW, mientras están variando. Tengo un programa hecho que cuando varié un potenciometro veo como varia las graficas de LABVIEW.
Utilizo la comunicacion USB_HID, mi pregunta es a la hora de integrarlo con el while donde esta los menús del teclado, se me producen errores o no entra dentro de los menús.

Como se podría realizar sin que me destrozara lo otro.

tengo estas librerias declaradas y estos devices:

Código: [Seleccionar]
//USB
#define USB_HID_DEVICE  TRUE                      //Se activa la comunicacion USB_HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //Activa EP1 para la entrada de transferencias
#define USB_EP1_TX_SIZE    8                      //Envio de 8 bytes
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //Activa EP1 para la salida de transferencias
#define USB_EP1_RX_SIZE    8                      //Recepcion de 8 bytes
#define LEDR PIN_C0                               //Led rojo USB no conectado
#define LEDV PIN_C1                               //Led  verde USB conectado
#define LED_ON output_low
#define LED_OFF output_high
int8 Salida[8];                                   //Vector de salida de 8, cada posicion del vector va a tener un byte
int8 Entrada[8];                                  //Vector de entrada de 8, cada posicion del vector va a tener un byte

#include <pic18_usb.h>                            //Libreria para la comunicacion entre el pic18 y USB
#include <usb_desc_hid.h>                         //Descripcion del dispositivo, para que el sistema operativo, en este caso WINDOWS, lo reconozca
#include <usb.c>                                  //Libreria para la utilizacion del USB


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ACTUALIZAR VARIABLES
« Respuesta #9 en: 15 de Septiembre de 2015, 07:35:01 »
Lamentablemente, apartir de ahi yo no puedo ayudarte. Trabaje solo una ves con USB , todo muy por encima. Y en XC8, asi que CCS estoy aun mas perdido. Seguro que alguno te va a poder ayudar.
« Última modificación: 15 de Septiembre de 2015, 08:15:00 por KILLERJC »