Autor Tema: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD  (Leído 11210 veces)

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

Desconectado ajye

  • PIC10
  • *
  • Mensajes: 3
memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« en: 04 de Julio de 2008, 17:16:32 »
Hola, el problema que poseo es el siguiente,

estoy buscando, ingresar unos valores tipo Long a la memoria interna del microcontrolador pic16f877a. Estos valores son una suma, que requiero guardar, por medio de unos pulsos, necesito guardar estos valores cada vez que vallan cambiando, dejando almacenada en la memoria el último valor obtenido siempre; es decir a medida que sume guarde el valor actual que está generando la suma del microcontrolador.

este valor guardado en la eeprom, lo necesito visulizar en un LCD 16X2, a traves de un pulso que le de a cualquiera de las entradas del microcontrolador

adjunto programa del contador, y una parte del programa de la grabacion del dato que aun no funciona

//#include <16f877A.h>            //pic a utilizar
#use delay (clock=4000000)         //Fosc=4Mhz
#byte puerto_A = 05
#byte puerto_B = 06
#byte puerto_C = 07
#byte puerto_D = 8
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
#include<Lib_Int_EEProm.c>

//inicio del programa
void main(void)
{

long int  cont=0;
long int  cont2=0;
long int LAST_VOLUME=0,volume; //variables de direccion escritura eeprom y mensaje

set_tris_A (0b11111111);
set_tris_D (0b11111111);
puerto_D = 0;
puerto_A = 0;

lcd_init(); //inicializa lcd



WHILE (TRUE)
   {
        lcd_gotoxy(4,1);
        printf(lcd_putc,"INGRESOS:");
        lcd_gotoxy(4,2);
        printf(lcd_putc,"NRO:%Lu",cont);   //muestra por pantalla el mensaje

      if(input(pin_D0))
         {
            cont=cont+1;
            delay_ms(250);
         }

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   }
////////////////////////////////////////////////////////////////////////////

//grabar el dato en la eeprom
if(cont=1)
   {
void write_int16_eeprom(int8 LAST_VOLUME, int16 cont) {
   int8 i;
   for(i = 0; i < 2; ++i)
   {
   write_eeprom(address + i, *(&data + i));
   }
}

   //write_eeprom(LAST_VOLUME,cont); //escritura de los mensajes...
   //LAST_VOLUME++;

   for( ; ; )
   { //bucle...
   for(LAST_VOLUME=0;LAST_VOLUME<32;LAST_VOLUME++)  //bucle que recorre las posiciones de eeprom
      {
         volume = read_EEPROM (LAST_VOLUME); //almacena mensaje de la direccion eeprom
         printf(lcd_putc,"%Lu",volume) ; //muestra mensaje por pantalla lcd
         delay_ms(500);
         lcd_putc("\f" ); //borra pantalla lcd
      } //...infinito
   }
   }
//////////////////////////////////////////////////////////////////////////////////////


   }
 :-/ 



Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #1 en: 04 de Julio de 2008, 17:25:42 »
Hola.

Sin saber que hace la libreria Lin_int_eeprom.c es como dificil saber si el error estara por alli o no.

Lo que hago normalmente para guardar datos en la EEPROM del PIC es pasarlo a un string y lo guardo posicion a posicion en ella y ya. Cuando quiero leer el numero, leo el string y lo paso a long int o int o lo que sea. Si es para desplegar en la LCD, solo basta con asignar la variable de salida a %s en el printf.

Saludos.
El papel lo aguanta todo

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #2 en: 04 de Julio de 2008, 17:34:57 »
No te sirve escribirlo corriendo los bits? Así lo he hecho yo y me ha funcionado. Algo así:
Código: C
  1. long int dato,direccion;
  2. write_eeprom(direccion,dato>>8); //Escribes primer byte (parte más significativa del int16)
  3. write_eeprom(direccion,dato);         //Escribes segundo byte (parte menos significativa del int16)
Y luego para leer, pues la operación inversa. Qué dices MLO?
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado ajye

  • PIC10
  • *
  • Mensajes: 3
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #3 en: 04 de Julio de 2008, 18:08:12 »
fire pic me gustaria saber como debo declarar cada una de las varaiables, para que puedan ser almacenadas y luego leidas para poder mostrarlas por el LCD

gracias :-/

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #4 en: 04 de Julio de 2008, 18:28:19 »
Ajye, tal como está allí.
La dirección la coloqué mal, no hace falta que sea long int, estaba pensando en memoria externa..
El pic 16F877 tiene 256 posiciones de memoria, entonces con una int es suficiente.
Entonces resumiendo:
- La dirección la declaras entero (int).
- El dato lo declaras como doble entero (long int).
El código que te mandé quedaría modificado así:
Código: C
  1. int direccion = <direccion de la eeprom donde deseas guardar>;
  2. long int dato;
  3. write_eeprom(direccion,dato>>8); //Escribes primer byte (parte m&#225;s significativa del int16)
  4. direccion++;
  5. write_eeprom(direccion,dato); //Escribes segundo byte (parte menos significativa del int16)
Eso sería todo para escribir un long int en la eeprom. Claro que debes recordar que estás ocupando dos posiciones por dato.
Saludos, nos leemos!  :mrgreen:
« Última modificación: 04 de Julio de 2008, 18:41:33 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #5 en: 04 de Julio de 2008, 23:49:29 »
Hola.

Mira las opciones de la funcio itoa:
Código: C
  1. int32 x=1234;
  2. char string[5];
  3.  
  4. itoa(x,10, string);// string is now “1234”

puedes guardar en la eeprom con un for:

Código: C
  1. for(i=0;i<=4;i++)
  2. {
  3.  write_eeprom(i,string[i]);
  4. }

para leerlo igual pero con la funcion read_eeprom(); y para desplegarlo en la LCD despues de haberlo leido de la eeprom:

Código: C
  1. printf(lcd_putc, "Dato: %s", string);

Saludos.
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #6 en: 04 de Julio de 2008, 23:51:42 »
 :-/ :-/ :-/

Hay dos opciones!!!

Saludos
El papel lo aguanta todo

Desconectado ajye

  • PIC10
  • *
  • Mensajes: 3
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #7 en: 07 de Julio de 2008, 11:54:47 »
 :-/ :-/ :-/ :-/ :-/ :D :D :D

listo muchachos, el programa ya funciona a la perfeccion, muchisimas gracias...

aqui lo pongo para que le sirva a otras personas interesadas en el tema.

exitos y gracias..

//#include <16f877A.h>            //pic a utilizar
#use delay (clock=4000000)         //Fosc=4Mhz
#byte puerto_A = 05
#byte puerto_B = 06
#byte puerto_C = 07
#byte puerto_D = 8
#define use_portb_lcd TRUE         //definir portb lcd
#include<lcd.c>                  //libreria manejo lcd
#include<Lib_Int_EEProm.c>

//inicio del programa
void main(void)
{

long int  cont;
long int  cont2=0;
long int LAST_VOLUME=0,volume; //variables de direccion escritura eeprom y mensaje
int direccion = 0;
set_tris_A (0b11111111);
set_tris_D (0b11111111);
puerto_D = 0;
puerto_A = 0;

lcd_init(); //inicializa lcd



WHILE (TRUE)
   {
       
        lcd_gotoxy(4,1);
        printf(lcd_putc,"INGRESOS:");
        lcd_gotoxy(4,2);
        printf(lcd_putc,"NRO:%Lu",cont);   //muestra por pantalla el mensaje

      if(input(pin_D0))
         {
            cont=cont+1;
            cont2=cont2+1;
            delay_ms(250);
         }

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

////////////////////////////////////////////////////////////////////////////

//grabar y mostrar el dato en la eeprom
if(input(pin_A0))
{

cont=0;
lcd_putc("\f" ); //borra pantalla lcd
write_eeprom(direccion,cont2>>8); //Escribes primer byte (parte m&#225;s significativa del int16)direccion++;
write_eeprom(direccion,cont2); //Escribes segundo byte (parte menos significativa del int16)
read_eeprom(cont2);
printf(lcd_putc, "Dato: %Lu",cont2);
delay_ms(2000);
lcd_putc("\f" ); //borra pantalla lcd
}
//////////////////////////////////////////////////////////////////////////////////////


   }


   }
 :-/ :-/ :-/ :-/ :-/ :-/

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #8 en: 07 de Julio de 2008, 12:11:17 »
Ajye, creo que no lo estás haciendo bien. Claro que vas a ver el valor correcto en el lcd, porque estás mostrando la misma variable que estás guardando, pero en realidad no estás haciendo el grabado en la EEPROM correctamente. Y la lectura tampoco.
El código correcto sería así:

Código: C
  1. //#include <16f877A.h>            //pic a utilizar
  2. #use delay (clock=4000000)         //Fosc=4Mhz
  3. #byte puerto_A = 05
  4. #byte puerto_B = 06
  5. #byte puerto_C = 07
  6. #byte puerto_D = 8
  7. #define use_portb_lcd TRUE         //definir portb lcd
  8. #include<lcd.c>                  //libreria manejo lcd
  9. #include<Lib_Int_EEProm.c>
  10.  
  11. //inicio del programa
  12. void main(void)
  13. {
  14.  
  15. long int  cont;
  16. long int  cont2=0;
  17. long int LAST_VOLUME=0,volume; //variables de direccion escritura eeprom y mensaje
  18. long int valor_leido;
  19. int direccion = 0;
  20. set_tris_A (0b11111111);
  21. set_tris_D (0b11111111);
  22. puerto_D = 0;
  23. puerto_A = 0;
  24.  
  25. lcd_init(); //inicializa lcd
  26.  
  27.  
  28.  
  29. WHILE (TRUE)
  30.    {
  31.        
  32.         lcd_gotoxy(4,1);
  33.         printf(lcd_putc,"INGRESOS:");
  34.         lcd_gotoxy(4,2);
  35.         printf(lcd_putc,"NRO:%Lu",cont);   //muestra por pantalla el mensaje
  36.  
  37.       if(input(pin_D0))
  38.          {
  39.             cont=cont+1;
  40.             cont2=cont2+1;
  41.             delay_ms(250);
  42.          }
  43.  
  44.    setup_adc_ports(NO_ANALOGS);
  45.    setup_adc(ADC_OFF);
  46.    setup_psp(PSP_DISABLED);
  47.    setup_spi(FALSE);
  48.    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  49.    setup_timer_1(T1_DISABLED);
  50.    setup_timer_2(T2_DISABLED,0,1);
  51.    setup_comparator(NC_NC_NC_NC);
  52.    setup_vref(FALSE);
  53.  
  54. ////////////////////////////////////////////////////////////////////////////
  55.  
  56. //grabar y mostrar el dato en la eeprom
  57. if(input(pin_A0))
  58. {
  59.  
  60. cont=0;
  61. lcd_putc("\f" ); //borra pantalla lcd
  62. write_eeprom(direccion,cont2>>8); //Escribes primer byte (parte m&#38;#225;s significativa del int16)
  63. write_eeprom(direccion+1,cont2); //Escribes segundo byte (parte menos significativa del int16)
  64. valor_leido = read_eeprom(direccion);
  65. valor_leido = valor_leido<<8;
  66. valor_leido = read_eeprom(direccion+1);
  67. printf(lcd_putc, "Dato: %Lu",[b]valor_leido[/b]);
  68. delay_ms(2000);
  69. lcd_putc("\f" ); //borra pantalla lcd
  70. }
  71. //////////////////////////////////////////////////////////////////////////////////////
  72.    }
  73.    }

Nota que he declarado una nueva variable, "valor_leido", y esa variable, es la que ahora mostrarás al LCD, así sabrás si la escritura y lectura del valor "cont2" en la EEPROM se está ejecutando correctamente.
Haz la prueba de nuevo y debería funcionar bien, en caso de que no, pues lo dices por acá y vemos en qué se puede corregir.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado alexmorales

  • PIC10
  • *
  • Mensajes: 6
Re:memoria EEPROM INTERNA PIC16F877A MOSTRARLA POR EL LCD
« Respuesta #9 en: 02 de Enero de 2018, 16:14:11 »
tiene razon el amigo firepic