Autor Tema: Problema Guardar teclado en EEprom  (Leído 3297 veces)

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

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Problema Guardar teclado en EEprom
« en: 24 de Noviembre de 2010, 08:53:43 »
Muy wenas, les agradesco a todos los que aportan sus ideas y resuelven dudas. Este es el primer tema que creo ya que me encuentro con una serie de problemas y por mas que le doy vueltas no me encuentro con la solucion. Espero que alguno de ustedes tenga una idea mejor que la mia.
Estoy trabajando con CCCompiler y como simulador el proteus y trabajando con el pic16f877.

El programa es que tengo 3 display's (de catodo comun) con los que trabajo por el puerto C y un teclado 3x4. Por el puerto A multiplexo los 3 display's que van a mostrar lo que pulse en cada tecla. Lo que hago en el programa es ir desplazando las unidades, decenas y centenas; Aqui es donde viene el problema: Cuando tengo ya los 3 digitos pulso la tecla # para almacenarlos en la EEprom los numeros que tengo en centenas y decenas estan correctos al mirarlos en la eeprom, pero en las unidades me almacena la # y no logro que me guarde los 3 digitos despues de pulsarla. Esto es lo que llevo hecho hasta ahora:


#include <16f877.h>
#use delay(clock=4000000)//Trabajo a 4MHz
#Fuses XT, NOWDT
#include <kbd.c>//Libreria del teclado
#byte PORTA=0x05//El puerto a que se encargue del multiplexado
#byte PORTC=0x07//Para el display
#byte PORTD=0X08//Para el teclado
char k;//Variable que almacena la tecla pulsada
int uds=10,dec=10,cen=10,i=0;
byte const display[11]= {0x3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X67, 0x40 };//Array que contiene los numeros que voy a mostrar en mi display

//Funcion de multiplexado
multiplexado(int uds,int dec, int cen){
         output_a(0b11111110);//Habilito el display de las unidades
         portc=display[uds];//muestro el valor de mi display
         delay_ms(1);
         
         output_a(0b11111101);//Habilito el display de las decenas
         portc=display[dec];
         delay_ms(1);
                 
         output_a(0b11111011);//Habilito el display de las centenas
         portc=display[cen];
         delay_ms(1);}

void main(void)
{
  set_tris_a(0b00000000);//Puerto a como salida
  set_tris_c(0b00000000);//Puerto c como salida
  set_tris_d(0b11100000);//Los 4 bits de menor peso como entrada para el teclado
  while(1)
   {     
         do{
         k=kbd_getc();//Almaceno en k la tecla pulsada
         if(k!=0){//Si detecta que ha pulsado tecla
         cen=dec;
         dec=uds;
         uds=k-48;}
         multiplexado(uds,dec,cen);}
         while(k!=35);//Hasta que la tecla de guardar se pulse
         write_eeprom(0,uds);
         write_eeprom(1,dec);
         write_eeprom(2,cen);
         
    }
}
         

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Problema Guardar teclado en EEprom
« Respuesta #1 en: 24 de Noviembre de 2010, 09:35:42 »
Hola, Bienvenido al foro jftrujilloa
Lo que está pasando es que a la asignación de uds, dec y cen, entras cada vez que se presiona una tecla sin importar si es un número o es el #.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #2 en: 24 de Noviembre de 2010, 09:54:28 »
Tal cual te lo dice pablo. En todo caso tendrías que anteponer un if(K != 35).... yo lo pondría así

Código: C
  1. ....
  2. if ((K != 0) && (k != 35)) // si se presiono una tecla y es distinto a #
  3. {
  4.   cen = dec;
  5.   dec = uds;
  6.   uds = k - 48;
  7. }
  8. .....
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #3 en: 24 de Noviembre de 2010, 10:09:13 »
Pfffff  ahora si.. me guarda los tres digitos al pulsar la almoadilla... y ahorrandome un if.. muchisimas gracias pablomanieri y AngelGris.. ahora puedo continuar con el programa porque estaba estancado. El programa me quedo asi:

void main(void)
{
  set_tris_a(0b00000000);//Puerto a como salida
  set_tris_c(0b00000000);//Puerto c como salida
  set_tris_d(0b11100000);//Los 4 bits de menor peso como entrada para el teclado
  while(1)
   {      
         k=kbd_getc();//Almaceno en k la tecla pulsada
         if((k!=0)&&(k!=35)){  
                  cen=dec;
                  dec=uds;
                  uds=k-48;}
            else//Si no es #
                  write_eeprom(0,uds);
                  write_eeprom(1,dec);
                  write_eeprom(2,cen);
     multiplexado(uds,dec,cen);
   }
}

Ahora puedo continuar.. si me surge otro problema con este ejercicio espero que me podais ayudar..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #4 en: 24 de Noviembre de 2010, 13:38:24 »
Me parece que también tendrías que incluir la evaluación del "*" (asterisco) porque sino te lo puede tomar como un número.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #5 en: 24 de Noviembre de 2010, 13:53:06 »
El # lo quiero para que me guarde los tres numeros y si, el * lo tengo que incluir concretamente para que me compare el sig numero a meter; es decir cuando ya tengo el numero guardado en la EEprom lo siguiente es que se vuelvan a poner en '000' o en  '---' los display's e introducir nuevos numeros y con la tecla * dare aceptar para que me compare. Seria algo como una cerradura electronica. Ahora el problema es que no logro dejar los display's a su valor inicial '---' cuando los guardo se me queda con el numero guardado.

#include <16f877.h>
#use delay(clock=4000000)//Trabajo a 4MHz
#Fuses XT, NOWDT
#include <kbd.c>//Libreria del teclado
#byte PORTA=0x05//El puerto a que se encargue del multiplexado
#byte PORTC=0x07//Para el display
#byte PORTD=0X08//Para el teclado
char k;//Variable que almacena la tecla pulsada
int uds=10,dec=10,cen=10;
byte const display[11]= {0x3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X67, 0x40 };//Array que contiene los numeros que voy a mostrar en mi display

//Funcion de multiplexado
multiplexado(int uds,int dec, int cen){
         output_a(0b11111110);//Habilito el display de las unidades
         portc=display[uds];//muestro el valor de mi display
         delay_ms(1);
         
         output_a(0b11111101);//Habilito el display de las decenas
         portc=display[dec];
         delay_ms(1);
                 
         output_a(0b11111011);//Habilito el display de las centenas
         portc=display[cen];
         delay_ms(1);}

void main(void)
{
  set_tris_a(0b00000000);//Puerto a como salida
  set_tris_c(0b00000000);//Puerto c como salida
  set_tris_d(0b11100000);//Los 4 bits de menor peso como entrada para el teclado
  while(1)
   {     
         //ciclo de programar la clave
         multiplexado(uds,dec,cen);
         k=kbd_getc();//Almaceno en k la tecla pulsada
         if((k!=0)&&(k!=35)){ 
                  cen=dec;
                  dec=uds;
                  uds=k-48;}
            else{//Si no es #
                  write_eeprom(0,uds);
                  write_eeprom(1,dec);
                  write_eeprom(2,cen);}
     }
}

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #6 en: 24 de Noviembre de 2010, 14:00:17 »
Si no me equivoco, dentro del else (que utilizás para grabar en EEPROM) tendrías que incluir una forma de hacer 0 cen, dec y uds.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #7 en: 24 de Noviembre de 2010, 14:25:35 »
Muchas gracias Angel... eh tenido que meter otro if dentro del else porque al no pulsar tecla entraba directamente al else y era ahi donde ponia a ceros uds, dec, cen. Y al final me ha quedado asi:

void main(void)
{
  set_tris_a(0b00000000);//Puerto a como salida
  set_tris_c(0b00000000);//Puerto c como salida
  set_tris_d(0b11100000);//Los 4 bits de menor peso como entrada para el teclado
  while(1)
   {     
         //ciclo de programar la clave
         multiplexado(uds,dec,cen);
         k=kbd_getc();//Almaceno en k la tecla pulsada
         if((k!=0)&&(k!=35)){ 
                  cen=dec;
                  dec=uds;
                  uds=k-48;}
            else{//Si no es #
                  if(k!=0){
                     write_eeprom(0,uds);
                     write_eeprom(1,dec);
                     write_eeprom(2,cen);   
                     uds=10;
                     dec=10;
                     cen=10;}}
  }
}

Ahora estoy trabajando para incluir el * para comparar..

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #8 en: 24 de Noviembre de 2010, 15:11:27 »
Yo lo dejaría así...

Código: C
  1. ........
  2. while (1)
  3. {
  4.   multiplexado (uds, dec, cen);
  5.   k= kbd_getc();
  6.   if ((k != 0) && (k != 35))
  7.   {
  8.      cen = dec;
  9.      dec = uds;
  10.      uds = k - 48;
  11.   }
  12.   else
  13.     if (k = 35)         // así te aseguras que solo entre si presionas #
  14.     {
  15.       write_eeprom (0,uds);
  16.       write_eeprom (1,dec);
  17.       write_eeprom (2,cen);
  18.       uds = 10;
  19.       dec = 10;
  20.       cen = 10;
  21.     }
  22. }

  Básicamente es muy similar al tuyo, solo que en el else no pongo las llaves "{" "}" porque las tiene el if posterior. Y además el if evalúa que la tecla presionada sea #
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #9 en: 24 de Noviembre de 2010, 15:44:24 »
Código: [Seleccionar]
............
while(1)
   {     
         //ciclo de programar la clave
         multiplexado(uds,dec,cen);
         k=kbd_getc();//Almaceno en k la tecla pulsada
         if((k!=0)&&(k!=35)&&(k!=42)){//[color=red]HE AGREGADO UNA CONDICION MAS PARA QUE SOLO ME ACEPTE DESDE EL 0 - 9[/color]
                  i++;//variable para los digitos
                  cen=dec;
                  dec=uds;
                  uds=k-48;}
            else//Si se pulsa el # para guardar los numeros
                  if((k==35)&&(i>=3)){//hay 3 digitos y se guarda
                     write_eeprom(0,uds);//Guardo las unidades
                     write_eeprom(1,dec);//Guardo las decenas
                     write_eeprom(2,cen);//Guardo las centenas   
                     uds=10;//Pongo a cero los display`s
                     dec=10;//"                         "
                     cen=10;//"                         "
                     delay_ms(1);
                     a=read_eeprom(0);//Leo lo que hay en la posicion 0
                     b=read_eeprom(1);//"                           " 1
                     c=read_eeprom(2);//"                           " 2
                     if((a=uds)&&(b==dec)&&(c==cen)){//Comparo si los digitos nuevos corresponden al los de la eeprom
                       if(k==42){//Pulsa la tecla de aceptar (*)
                       i=10;}}//[color=red]HE PUESTO ESTA INSTRUCCION SOLO PARA SABER SI LLEGO HASTA AQUI.[/color]
                     }
  }
}

Todo va bien hasta que comparo los numeros nuevos con los guardados.

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #10 en: 24 de Noviembre de 2010, 15:45:43 »
Perdonar.. he intentado poner en rojo lo que esta en mayusculas....

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #11 en: 24 de Noviembre de 2010, 17:13:32 »
Es que al apretar el # en la segunda oportunidad (con los nuevos números), se guardan nuevamente en la eeprom y a su vez cambias las variables uds, dec y cen para que valgan 10.

O sea que cuando presionás por segunda vez # se graba en nuevo número en la EEPROM.... Si no hay que modificar para que el segundo número no se grabe en EEPROM.

No lo puedo simular porque estoy en otra PC

Algo así tal vez....

Código: C
  1. ......
  2. while (1)
  3. {
  4.   multeplexado (uds, dec, cen);
  5.   k = kbd_getc();
  6.   if ((K != 0) && (K != 35) && (k != '*'))
  7.   {
  8.      i++;
  9.      cen = dec;
  10.      dec = uds;
  11.      uds = k - 48;
  12.   }
  13.   else
  14.     if ((k == 35) && (I == 3)) // si presiono # y ya entre lo 3 digitos...
  15.     {
  16.       write_eeprom (0, uds);    
  17.       write_eeprom (1, dec);
  18.       write_eeprom (2, cen);
  19.       uds = 10;
  20.       dec = 10;
  21.       cen = 10;
  22.     }
  23.     else
  24.       if ((k = '*') && (i == 6)) // si presiono * y ya ingrese los otros 3 digitos, recién entonces evaluo los valores
  25.       {
  26.          a = read_eeprom (0);
  27.          b = read_eeprom (1);
  28.          c = read_eeprom (2);
  29.          if ((a == uds) && (b == dec) && (c == cen))
  30.          {
  31.              //recién acá sé si son iguales los números ingresados
  32.          }
  33.       }
  34. }
« Última modificación: 24 de Noviembre de 2010, 17:36:48 por AngelGris »
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #12 en: 24 de Noviembre de 2010, 19:36:39 »
Código: C++
  1. while(TRUE)
  2.    {      
  3.          //ciclo de programar la clave
  4.          multiplexado(uds,dec,cen);
  5.          k=kbd_getc();//Almaceno en k la tecla pulsada
  6.          if((k!=0)&&(k!=35)&&(k!=42)){//Si se pulsa una tecla del 0 al 9  
  7.             i++;
  8.             cen=dec;
  9.             dec=uds;
  10.             uds=k-48;}    
  11.          else//Si se pulda la tecla de guardar #
  12.             if((k==35)&&(i==3)){
  13.              write_eeprom(0,uds);
  14.              write_eeprom(1,dec);
  15.              write_eeprom(2,cen);  
  16.              uds=10;
  17.              dec=10;
  18.              cen=10;
  19.              delay_ms(1);}
  20.             else
  21.              if((k==42)&&(i==6)){
  22.                a=read_eeprom(0);//Leo lo que hay en la posicion 0
  23.                b=read_eeprom(1);//"                           " 1
  24.                c=read_eeprom(2);//"                           " 2
  25.                if((a==uds)&&(b==dec)&&(c==cen))
  26.                   output_bit(pin_b0,1);// El codigo es correcto
  27.                 else
  28.                   output_bit(pin_b1,1);}//El codigo es incorrecto
  29.    }
  30. }

He tenido que meter dos led's en el puerto B para comprobar que compara los numeros. Ya esta simulado y esta funciona muy bien :lol:

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema Guardar teclado en EEprom
« Respuesta #13 en: 24 de Noviembre de 2010, 19:38:50 »
Me alegro  :-/
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jftrujilloa

  • PIC10
  • *
  • Mensajes: 17
Re: Problema Guardar teclado en EEprom
« Respuesta #14 en: 24 de Noviembre de 2010, 19:47:12 »
Muchisimas gracias!! :-/


 

anything