Autor Tema: Guardar Tecla a tecla en EEprom interna  (Leído 3503 veces)

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

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #15 en: 17 de Junio de 2022, 14:05:52 »
Gracias Eduardo2.

Voy a intentar así..
Código: C++
  1. char abecedario[] = {"abcdefghijklmnopqrstuvwxyz"};

Sin las comillas.

Y probar el string al imprimir.

DominusDRR

Gracias me abrió un mejor panorama tu ayuda. La idea sigue siendo teclear 5 nombres guardar, leer en eeprom e imprimirlo imprimirlo la lcd.

El señor es mi pastor,  nada me faltará.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #16 en: 17 de Junio de 2022, 14:21:31 »
Gracias Eduardo2.

Voy a intentar así..
Código: C++
  1. char abecedario[] = {"abcdefghijklmnopqrstuvwxyz"};

Sin las comillas.

Y probar el string al imprimir.

DominusDRR

Gracias me abrió un mejor panorama tu ayuda. La idea sigue siendo teclear 5 nombres guardar, leer en eeprom e imprimirlo imprimirlo la lcd.

Como quieras, al final es lo mismo (Imagen adjunta)

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #17 en: 18 de Junio de 2022, 15:52:48 »
Hay algunas cosas que se podrian hacer de otra forma...

1- Tener un array "abecedario", se podria quitar directamente...

Las letras minúsculas en su codificación ASCII son todos números que comienza en el 97 (0x61) y va hasta el 122 (0x7A), entonces en ves de hacer:

Código: C
  1. if(!input(pin_a0))                                                      // Aumenta Letra
  2.          {
  3.          letra++;
  4.          if(letra > 25) letra=0;  
  5.          lcd_gotoxy(1,2); printf(lcd_putc,"Letra: %c",abecedario[letra]);
  6.          delay_ms(400);
  7.          }

Podemos hacer:

Código: C
  1. if(!input(pin_a0))                                                      // Aumenta Letra
  2.          {
  3.          letra++;
  4.          if(letra > 122) letra=97;  
  5.          lcd_gotoxy(1,2); printf(lcd_putc,"Letra: %c",letra);
  6.          delay_ms(400);
  7.          }

Y eliminamos una variable....

2- Una cosa que leo es sobre estar pensando en el caracter nulo de "abecedario"... ¿Para que?

Lo que debería estar corroborando es el carácter nulo de otro array que sea "temporal"
La idea es que vaya llenando este array temporal..
Este array serviría para mostrarlo, algo mucho mas rápido que hacerlo tomando todos los datos de la eeprom.
En caso de grabarlo, solo se grabaría una sola vez todo junto y no carácter por carácter. Previo al grabado se pone un carácter nulo al final y llama a la función.
En la lectura, simplemente se lee hasta el carácter nulo en la EEPROM. Y la función de lectura debería poner el carácter nulo como seguridad.

Crear un par de funciones para esto (sin punteros, y considerando globales las variables para que sea mas sencillo para el usuario):

Código: C
  1. char temp_pass[11]; // Supongo que son 10 caracteres máximo
  2.  
  3. void escribirPass(cantidad){
  4.    int8 contador = 0;
  5.    while(temp_pass[contador])
  6.      write_eeprom(contador++, temp_pass[contador]);
  7.    write_eeprom(contador, '\0');
  8. }
  9.  
  10. void leerPass(){
  11.    int8 contador = 0;
  12.    do{
  13.       temp_pass[contador] = read_eeprom(contador);
  14.       if(contador >= sizeof temp_pass) contador++; break;
  15.    while(temp_pass[++contador]);
  16.    temp_pass[contador] = '\0';
  17.  
  18. }

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #18 en: 18 de Junio de 2022, 18:51:09 »
SR. KILLERJC

Así puse la variable letra:

Código: C++
  1. char letra =+ 96;

Como bien dice, eliminamos el arreglo de caracteres  ((:-))

Y lo demás, así como lo comenta para aumentar letras y disminuir:

Código: C++
  1. void main(void)
  2.          {
  3.          lcd_init();
  4.          letra=97;
  5.          
  6.          lcd_gotoxy(1,2); printf(lcd_putc,"Letra: %c",letra);
  7.          
  8.          while (true)
  9.          {        
  10.          
  11.          if(!input(pin_a0))                                                      // Aumenta Letra
  12.          {
  13.          letra++;
  14.          if(letra > 122) letra=97;  
  15.          lcd_gotoxy(1,2); printf(lcd_putc,"Letra: %c",letra);
  16.          delay_ms(400);
  17.          }
  18.          
  19.          if(!input(pin_a1))                                                      // Aumenta Letra
  20.          {
  21.          letra--;
  22.          if(letra < 97) letra = 122;  
  23.          lcd_gotoxy(1,2); printf(lcd_putc,"Letra: %c",letra);
  24.          delay_ms(400);
  25.          }
  26. }
  27. }

Y si, silo hace, recorre letra a letra cada vez que se presiona el pulsador if(!input(pin_a0))   y disminuye con if(!input(pin_a1)) :mrgreen:


Ahora en la cita como comentario, como relaciono esto... Para que escriba y lea en Eeprom el nombre escrito y como lo imprimo después ??.

Citar

char temp_pass[11]; // Supongo que son 10 caracteres máximo
 
void escribirPass(cantidad){
   int8 contador = 0;
   while(temp_pass[contador])
     write_eeprom(contador++, temp_pass[contador]);
   write_eeprom(contador, '\0');
}
 
void leerPass(){
   int8 contador = 0;
   do{
      temp_pass[contador] = read_eeprom(contador);
      if(contador >= sizeof temp_pass) contador++; break;
   while(temp_pass[++contador]);
   temp_pass[contador] = '\0';
 
}

Disculpe usted mi ignorancia pero no tengo idea de como relacionarlo con el código de las letras escritas. Podría de favor despejar mis dudas?. Le agradezco!!.
« Última modificación: 18 de Junio de 2022, 18:59:28 por Abner_emanuel »
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #19 en: 20 de Junio de 2022, 19:53:37 »
Creo que estuve divagando y luego cuando fui a crearlo me di cuenta que no era lo que querias hacer, pero si como yo lo haria, aunque eso significa tener mas botones.

Primero que nada escribir y leer el caracter asi como esta no tiene ningun sentido... Suponete que tenes guardado "password" y para poder ver la w, tenes que grabar los 4 primeros caracteres.... es absurdo.. Porque ahora tendrias 4 letras aleatorias que presionaste + el resto. Es decir jamas poder ver lo que esta guardado

Es por eso que considero que es necesario unos botones para "navegar" dentro del texto. Es decir, aumentar y disminuir la letra, derecha e izquierda para navegar hasta el maximo de caracteres, un boton de guardar y un boton de leer. (Al menos seria lo util en cualquier otro proyecto donde lo utilices)

Como no tengo para probarlo, dejo un posible codigo... ¿Puede ser mas compacto? Seguramente se pueda.. Especialmente todas las restricciones para verificar que sea una letra.

Código: C
  1. char temp_pass[11] = ""; // Supongo que son 10 caracteres máximo
  2.  
  3. void main(void) {
  4.        
  5.         lcd_init();
  6.         letra=97;
  7.         int8 indice;
  8.  
  9.         // Limpio por las dudas mi array
  10.         for(indice = 0; indice >= (sizeof temp_pass - 1); indice++ ){
  11.                 temp_pass[indice] = '\0';
  12.         }
  13.  
  14.         indice = 0;
  15.         temp_pass[indice] = 'a';
  16.  
  17.         lcd_gotoxy(1,1);
  18.         printf(lcd_putc,"Pass:");
  19.         lcd_gotoxy(1,2);
  20.         printf(lcd_putc,"%s",temp_pass);
  21.  
  22.         while (true)
  23.         {        
  24.  
  25.                 if(!input(pin_a0))                              // Aumenta Letra
  26.                 {
  27.                         delay_ms(10);
  28.                         while(!input(pin_a0));
  29.                         letra = temp_pass[indice];
  30.                         if(++letra > 122) letra = 97;
  31.                         if(letra < 97) letra = 97;
  32.                         temp_pass[indice] = letra;
  33.                         lcd_gotoxy(indice+1,2); printf(lcd_putc,"%c",letra);
  34.                 }
  35.  
  36.         else if(!input(pin_a1))                 // Disminuye Letra
  37.         {
  38.                         delay_ms(10);
  39.                         while(!input(pin_a1));
  40.                         letra = temp_pass[indice];
  41.                 if(--letra < 97) letra = 122;
  42.                 if(letra > 122) letra = 122;
  43.                 temp_pass[indice] = letra;
  44.                 lcd_gotoxy(indice+1,2); printf(lcd_putc,"%c",letra);
  45.         }
  46.  
  47.                 else if(!input(pin_a2))                 // Derecha
  48.                 {
  49.                         delay_ms(10);
  50.                         while(!input(pin_a2));
  51.                         indice++;
  52.                         if(indice >= (sizeof temp_pass-1)) {    // Si por las dudas me paso
  53.                                 indice = sizeof temp_pass - 1;          // Que quede como limite
  54.                         }
  55.                         if((temp_pass[indice]< 97) || (temp_pass[indice]> 122))  temp_pass[indice] = 'a'
  56.                         lcd_gotoxy(indice+1,2);
  57.                 }
  58.  
  59.                 else if(!input(pin_a3))                 // Izquierda
  60.                 {
  61.                         delay_ms(10);
  62.                         while(!input(pin_a3));
  63.                         if(!indice) {
  64.                                 indice--;
  65.                         }
  66.                         lcd_gotoxy(indice+1,2);
  67.                 }
  68.  
  69.  
  70.                 else if(!input(pin_a4))                 // Guarda
  71.                 {
  72.                         delay_ms(10);
  73.                         while(!input(pin_a4));
  74.                         temp_pass[++indice] = '\0';
  75.                         indice = 0;
  76.                         while(temp_pass[indice++]){
  77.                                 write_eeprom(indice,temp_pass[indice]);
  78.                         indice++;
  79.                         write_eeprom(indice,'\0');
  80.                         }
  81.                 }
  82.  
  83.                 else if(!input(pin_a5))                 // Lee
  84.                 {
  85.                         delay_ms(10);
  86.                         while(!input(pin_a5));
  87.                         for(indice = 0; indice >= (sizeof temp_pass - 1); indice++ ){
  88.                                 temp_pass[indice] = read_eeprom(indice);
  89.                         }
  90.                         temp_pass[++indice] = '\0';             // Por las dudas
  91.                         lcd_gotoxy(1,2); printf(lcd_putc,"%s",temp_pass);
  92.                 }
  93.         }
  94. }
« Última modificación: 21 de Junio de 2022, 16:40:47 por KILLERJC »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #20 en: 21 de Junio de 2022, 18:37:30 »
Esta bien. El código se ve bien pensado, pero creo que trae detalles. Al menos lo e simulado en Proteus y no hace lo que debería. Pero es una buena manera de implementarlo. Al menos me dio otra forma de como lograrlo.

Gracias KILLERJC.
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Guardar Tecla a tecla en EEprom interna
« Respuesta #21 en: 21 de Junio de 2022, 18:53:21 »
Esta bien. El código se ve bien pensado, pero creo que trae detalles. Al menos lo e simulado en Proteus y no hace lo que debería. Pero es una buena manera de implementarlo. Al menos me dio otra forma de como lograrlo.

Gracias KILLERJC.

Seguramente tenga muchos problemas, es que no lo hice en ningun IDE, no lo probe tampoco y lo peor es que lo hice a las apuradas jejeje.
Cuando me acoste me di cuenta que me habia olvidado de los ! de los while jeje (luego se los agregue)


 

anything