Autor Tema: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano  (Leído 19942 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #30 en: 04 de Abril de 2013, 20:40:06 »
... cuando lo inicio por primera ves, el contador arranca en un valor, el mas alto de la cuenta ...

Hola kapotik, me alegra que tu programa esté progresando.  No te entiendo muy bien lo que quieres decir.  Tal vez si pones el código podamos ver de que se trata.

Saludos!

te adjunto una imagen y el codigo
pero la cuestion es que cuando inicializa por primera ves, no arranca en cero, despues si anda bien



Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#include <lcdb.c>
#include <internal_eeprom.c>

int32 A = 0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Inicializando\n");   // Saca texto
lcd_putc("El Equipo Aguarde");      // Saca texto
delay_ms(5000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("kapotik.\n");      //Saca texto



A = read_int32_eeprom(0x04);   //Lee contador de la EEPROM
  

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

if(A>=9999999)      // Preguto si A es mayor o igual a 9999999,
{               // cuando sea igual iguala "A" a cero
A=0;  

}
}

lcd_gotoxy(1,2);          //Acomoda cursor LCD
printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

write_int32_eeprom(0x04, A);

}
}

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #31 en: 04 de Abril de 2013, 21:49:49 »
Hola, cuando dices: "cuando inicializa por primera ves, no arranca en cero" te refieres a la primera vez que echas a andar el PIC después de grabarlo? o a cuando lo energizas en cualquier momento...  No se como será el comportamiento de esto en Proteus, pero cuando quieres que un valor de la EEPROM se inicialice con el valor deseado la primera vez (me refiero a la primer encendida del PIC después de grabarlo) debes usar la directiva #ROM.  Por ejemplo si quisieras que los 4 pimeros bytes de la EEPROM en un PIC16F84A contuvieran los valores 4, 3, 2, y 1 entonces deberás utilizar en el encabezado del programa la directiva #ROM así:

Código: [Seleccionar]
#rom 0x00={4,3,2,1}
Esto lo que hace es poner esos valores en la EEPROM en el momento de grabar el PIC, y permanecerán allí hasta que el programa que has diseñado se encargue de cambiarlos.  Como veo que estás guardando los 4 bytes de tu dato de 32 bits a partir del quinto byte de la EEPROM, entonces para que la primera vez te aparezca en 0, puedes hacer algo así:

Código: [Seleccionar]
#rom 0x00={0,0,0,0,0,0,0,0}
Con esto estás iniciando los primeros 8 bytes de la EEPROM a 0.

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #32 en: 04 de Abril de 2013, 22:57:47 »
si es a la primera vez que lo hago andar despues de grabarlo.
probe lo que me dijiste pero sigue igual, te pego el codigo, lo unico que le cambie fue 0x00 por 0x04 por que sino me daba error con el 0x00.

Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses xt,nowdt,noprotect
#byte portb=6
#rom 0x04 ={0,0,0,0,0,0,0,0}
#include <lcdb.c>
#include <internal_eeprom.c>



int32 A = 0;

void main(void)
{
lcd_init();                //Inicia LCD
lcd_putc(" Inicializando\n");   // Saca texto
lcd_putc("El Equipo Aguarde");      // Saca texto
delay_ms(5000);            // Retardo
lcd_putc("\f");            // Limpia pantalla
lcd_putc("kapotik.\n");      //Saca texto



A = read_int32_eeprom(0x04);   //Lee contador de la EEPROM
  

while(true)
{

if(input(pin_A0)==0) // Pregunta si RA0 es cero
{
A++;            // Incremento el conteo
delay_ms(1);  // Para visualizar correctamente el conteo

if(A>=9999999)      // Preguto si A es mayor o igual a 9999999,
{               // cuando sea igual iguala "A" a cero
A=0;  

}
}

lcd_gotoxy(1,2);          //Acomoda cursor LCD
printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

write_int32_eeprom(0x04, A);

}
}

saludos
« Última modificación: 04 de Abril de 2013, 23:16:59 por kapotik »

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #33 en: 05 de Abril de 2013, 10:35:37 »
Hola, el valor que te aparece inicialmente es el de la imagen que muestras en Proteus? Porque veo un número de 10 dígitos!  Si el LCD es de 16 caracteres, eso no debería pasar con estas instrucciones:

Código: C
  1. lcd_gotoxy(1,2);          //Acomoda cursor LCD
  2. printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)

Verifica de cuantos caracteres es el LCD que tienes en la simulación, y ocupa todos los campos que sobren con caracteres en blanco para que no te aparezcan números extraños.

Que error te da cuando usas 0x00 con la directiva #ROM?  Es posible que 0x00 no sea la dirección de inicio de la EEPROM del PIC16F84A (no he trabajado nunca la EEPROM con ese PIC), por lo que habrá que investigar sobre este tema.

Saludos!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #34 en: 05 de Abril de 2013, 11:31:16 »
Hola, estuve investigando y parece que con ese PIC se debe usar la directiva #ROM así:

Código: C
  1. #include <16f84a.h>
  2. #fuses xt,nowdt,noprotect
  3. #use delay(clock=4000000)
  4.  
  5. #byte portb=6
  6. #rom 0x2100 = {0,0,0,0}
  7.  
  8. #include <lcd.c>
  9. #include <internal_eeprom.c>
  10.  
  11. int32 A = 0;
  12.  
  13. void main(void)
  14. {
  15.    lcd_init();                      // Inicia LCD
  16.    lcd_putc(" Inicializando\n");    // Saca texto
  17.    lcd_putc("El Equipo Aguarde");   // Saca texto
  18.    delay_ms(5000);                  // Retardo
  19.    lcd_putc("\f");                  // Limpia pantalla
  20.    lcd_putc("kapotik.\n");          // Saca texto
  21.  
  22.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  23.  
  24.  
  25.    while(true)
  26.    {
  27.       if(input(pin_A0)==0)          // Pregunta si RA0 es cero
  28.       {
  29.          A++;                       // Incremento el conteo
  30.          delay_ms(1);               // Para visualizar correctamente el conteo
  31.  
  32.          if(A>=9999999)             // Preguto si A es mayor o igual a 9999999,
  33.          {                          // cuando sea igual iguala "A" a cero
  34.             A=0;  
  35.          }
  36.       }
  37.  
  38.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  39.       printf(lcd_putc, "valor %Lu         ", A);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)
  40.  
  41.       write_int32_eeprom(0x00, A);
  42.    }
  43. }

Ensáyalo así y nos cuentas.

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #35 en: 05 de Abril de 2013, 14:00:57 »
hola bmb, gracias por tu ayuda, si en la simulacion el lcd es de 2x16 si te fijas tiene la palabra "valor" que suma 5 digitos, un espacio en blanco, ya son 6 y los 10 numeros suma 16.

simule el codigo que me dejaste, pero no inicializa, en el display no visualiza nada, no hace nada de nada.
Me parece que este pic el 84a es un poco limitado estoy pensando en migrar el codigo al 16f628a casi igual al 84a pero con muchas mas cosas, por ay a el 16f628a lo conoscas mas.

saludos

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #36 en: 05 de Abril de 2013, 16:20:55 »
Hola kapotik, leyendo el manual de CCS dice que si se debe iniciar la directiva #ROM como te había dicho:

Código: [Seleccionar]
#rom 0x2100 = {0,0,0,0}
Pero el problema puede ser por varias causas.  Si copiaste el código tal cual te lo pase, seguramente no te va a funcionar porque si miras bien, estoy usando la librería del LCD propia de CCS y no la que estás usamdo.  Pero el problema más grave que veo es que la instrucción:

Código: [Seleccionar]
write_int32_eeprom(0x00, A);
Está dentro del ciclo while(), y eso destruiría en pocos segundos la memoria EEPROM en un PIC verdadero, ya que estos tienen un número limitado de grabaciones/lecturas (10,000,000 según la hoja de datos).  Debes poner una condicional para hacer la grabación solamente cuando cambie el valor del dato y no cada ciclo de programa como está ahora.  También estaba a punto de recomendarte que te cambiaras a otro PIC con mejores prestaciones ya que el que estás utilizando está algo anticuado.  Si te fuera posible subir el archivo de simulación de Proteus, podemos examinar mejor el problema.

Saludos!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #37 en: 05 de Abril de 2013, 18:48:01 »
Bueno, tuve un rato libre ahora y le hice unas pequeñas variaciones al programa para comprobar el funcionamiento de las instrucciones para grabar y leer la EEPROM y también hice la simulación en Proteus.  Efectivamente como te había indicado, se inicia correctamente la directiva #ROM.  También pude ver que el Proteus no guarda nada en la EEPROM al apagar la simulación, o no se como hacerlo...  :shock:  porque cada que inicio la simulación aparece el primer valor en 0, pero como podrás ver en el código lo que aparece como valor está siendo leído directamente de la EEPROM.  Aquí estoy usando la librería propia de LCD del CCS. Te dejo los archivos.

Código: C
  1. #include <16f84a.h>
  2. #fuses xt,nowdt,noprotect
  3. #use delay(clock=4000000)
  4.  
  5. #byte portb=6
  6. #rom 0x2100 ={0,0,0,0}
  7.  
  8. #define LCD_ENABLE_PIN  PIN_B1
  9. #define LCD_RS_PIN      PIN_B2
  10. #define LCD_RW_PIN      PIN_B3
  11. #define LCD_DATA4       PIN_B4
  12. #define LCD_DATA5       PIN_B5
  13. #define LCD_DATA6       PIN_B6
  14. #define LCD_DATA7       PIN_B7
  15.  
  16. #include <lcd.c>
  17. #include <internal_eeprom.c>
  18.  
  19. int32 A = 0, B = 0;
  20. int1 boton = false;
  21.  
  22. void main(void)
  23. {
  24.    lcd_init();                      // Inicia LCD
  25.    lcd_putc(" Inicializando\n");    // Saca texto
  26.    lcd_putc("El Equipo Aguarde");   // Saca texto
  27.    delay_ms(500);                   // Retardo
  28.    lcd_putc("\f");                  // Limpia pantalla
  29.    lcd_putc("kapotik.\n");          // Saca texto
  30.  
  31.    A = read_int32_eeprom(0x00);     // Lee contador de la EEPROM
  32.  
  33.  
  34.    while(true)
  35.    {
  36.       if(!input(pin_A0) && !boton)  // Pregunta si RA0 es cero
  37.       {
  38.          A++;                       // Incremento el conteo
  39.          boton = true;
  40.          write_int32_eeprom(0x00, A);
  41.       }
  42.       if(input(pin_A0))
  43.          boton = false;             // Al soltar el Boton...
  44.  
  45.       if(A>=9999999)             // Preguto si A es mayor o igual a 9999999,
  46.       {                          // cuando sea igual iguala "A" a cero
  47.          A=0;  
  48.       }
  49.  
  50.       B = read_int32_eeprom(0x00);
  51.       lcd_gotoxy(1,2);                             // Acomoda cursor LCD
  52.       printf(lcd_putc, "valor %Lu         ", B);   // Imprime 16 espacios en el LCD (Los caracteres de %Lu no se cuentan)
  53.    }
  54. }

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #38 en: 06 de Abril de 2013, 00:59:56 »
Citar
Proteus no guarda nada en la EEPROM al apagar la simulación, o no se como hacerlo... 

que bueno que despues de tanta ayuda que me has dado, te pueda devolver algo, aunque se pequeñito!!!

Proteus si simula el guardado de la eproom, para ello hay que crear un archivo con extencion .bin, cualquiera sea el nombre, pero con la extencion .bin, para crearlo simplemente abrir el block de notas, y sin colocar nada dentro darle guardar como, colocarle el nombre que mas nos paresca, por ejemplo lcd.bin, y guardarlo en la carpeta donde tengamos los demas archivos, (se puede guardar en cualquier lugar del computador pero yo lo coloco alli por cuestion de organizacion),  adjunto imagen.



luego vamos al proteus hacemos doble click sobre el microprocesador vamos a donde dice propiedades avansadas y buscamos "initial contents EEPROM"



despues al lado derecho nos aparece una carpeta para buscar nuestro archivo bin



y listo esto lo hacemos una sola ves, no hay que hacerlo nuevamente si cerramos y volvemos abrir el proteus.



Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #39 en: 06 de Abril de 2013, 01:10:04 »
hola bmb, simule el codigo y no me esta guardando el dato en la eeprom

pregunto, y hablo sin entender como lo estas usando, pero le colocaste una "B" al grabado de la eeprom

Código: [Seleccionar]
B = read_int32_eeprom(0x00);
y cuando inicializa le estas diciendo que "B" es cero?

Código: [Seleccionar]
int32 A = 0, B = 0;
o yo lo estoy interpretando mal, por que sino en cada inicio pone a cero B, perdiendo el dato guardado
podrias explicarme como lo as usado

Saludos
« Última modificación: 06 de Abril de 2013, 01:18:11 por kapotik »

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #40 en: 06 de Abril de 2013, 09:20:28 »
Por lo que yo veo, B es una variable y la utiliza para leer la EEPROM. Al menos con la instrucción que tu muestras kapotik
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #41 en: 06 de Abril de 2013, 10:02:40 »
hola bmb, simule el codigo y no me esta guardando el dato en la eeprom

pregunto, y hablo sin entender como lo estas usando, pero le colocaste una "B" al grabado de la eeprom

Código: [Seleccionar]
B = read_int32_eeprom(0x00);
y cuando inicializa le estas diciendo que "B" es cero?

Código: [Seleccionar]
int32 A = 0, B = 0;
o yo lo estoy interpretando mal, por que sino en cada inicio pone a cero B, perdiendo el dato guardado
podrias explicarme como lo as usado

Saludos

Hola kapotik, muchas gracias por la explicación.  Es como te dice AngelGris, como este es solo un código de prueba, en la variable B almaceno el dato que leo en la EEPROM y lo hago así solamente para comprobar que el dato en A ha sido guardando correctamente.  Es una buena práctica de programación inicializar las variables ya que si no lo haces pueden tener en el inicio algún valor aleatorio, pero como puedes ver, en este caso el código se encarga de darles sus valores antes de mostrar algo en la LCD, por lo que finalmente lo que se muestra en pantalla es el valor de la EEPROM.  Más tarde voy a ensayar lo que me explicaste y a hacer unos cambios en el código para ver que pasa y te comento.

Saludos!

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #42 en: 06 de Abril de 2013, 11:25:29 »
Hola kapotik, hice lo que me explicaste, pero veo que es el Proteus el que no está haciendo nada con ese archivo, pues en ningún momento accede a el para escritura.  Creo que esa opción que me diste es solo para tomar los datos iniciales de la EEPROM, pero nada más.  Según la ayuda del VSM, al guardar la sesión se deberían guardar los datos de la EEPROM, pero en este caso no hace nada.  Lo que hice entonces, fue utilizar la opción Debug del Proteus y al simular el programa paso a paso, puedo ver que graba muy bien los datos en la ventana de la EEPROM.  Te adjunto nuevamente el programa con unas correcciones y el archivo de Proteus.  Le adicione a la simulación un switch manual para poder activarlo sin salir del modo Debug.

Saludos!

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #43 en: 06 de Abril de 2013, 14:31:08 »
Hola kapotik, hice lo que me explicaste, pero veo que es el Proteus el que no está haciendo nada con ese archivo, pues en ningún momento accede a el para escritura.  Creo que esa opción que me diste es solo para tomar los datos iniciales de la EEPROM, pero nada más.  Según la ayuda del VSM, al guardar la sesión se deberían guardar los datos de la EEPROM, pero en este caso no hace nada.  Lo que hice entonces, fue utilizar la opción Debug del Proteus y al simular el programa paso a paso, puedo ver que graba muy bien los datos en la ventana de la EEPROM.  Te adjunto nuevamente el programa con unas correcciones y el archivo de Proteus.  Le adicione a la simulación un switch manual para poder activarlo sin salir del modo Debug.

Saludos!

Para salir de dudas voy a armar el circuito real y probarlo, luego te comento que hace.

saludos

Desconectado kapotik

  • PIC16
  • ***
  • Mensajes: 121
Re: contador lcd llega A 255 y se vuelve a 0 alguien que me de una mano
« Respuesta #44 en: 07 de Abril de 2013, 16:50:47 »
Bueno una imagen vale por mil palabras, y si es un video? :D



que opinan?
« Última modificación: 07 de Abril de 2013, 16:53:30 por kapotik »