Autor Tema: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)  (Leído 27942 veces)

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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« en: 31 de Agosto de 2007, 16:18:14 »
Buenas!

Estoy programando en CCS, y tengo la siguiente duda:

¿Cómo hago para pre-grabar en CCS datos en la EEPROM interna de un PIC 16F876A?

En ASM era algo asi:

org 0x2100
0xff,0xaa,...

Tengo mas dudas, ya las ire preguntando si el buscador del foro no me las facilita...

Muchas gracias!!!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #1 en: 31 de Agosto de 2007, 17:01:18 »
Por fin me toca a mi poder ayudarte!! :-/ :-/
En mi libreria de los Numeros Grandes, guardo en memoria EEPROM en tiempo de grabacion los caracteres diseñados que luego se cargan en la CGRAM del LCD.
Lo hago asi:
Código: [Seleccionar]
   #rom  0x2100={16,24,24,24,24,24,24,16, //  Media barra lateral derecha.
                 1,3,3,3,3,3,3,1,         //  Media barra lateral izquierda.
                 31,31,0,0,0,0,0,0,       //  Barra superior sola.
                 0,0,0,0,0,0,31,31,       //  Barra inferior sola
                 31,31,0,0,0,0,31,31,     //  Barra superior e inferior.
                 2,6,14,30,14,6,2,0,      //  Flecha Izquierda.
                 8,12,14,15,14,12,8,0,    //  Flecha Derecha.
                 0,0,0,0,0,0,0,0}         //  Vacio.

Espero te sirva, si tenes consultas aqui estoy...

Este ejemplo es para guardar desde la primer posicion en adelante... :mrgreen: :mrgreen:
« Última modificación: 31 de Agosto de 2007, 17:03:38 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #2 en: 31 de Agosto de 2007, 17:23:39 »
Hola Marcos!!!

Jaja muchas gracias por la data!! :D

Bueno, aca me empiezo a poner exigente! ;)

¿Por que no me permite hacer esto? ¿Acaso le estoy pidiendo demasiado? Es simplemente que reemplace la referencia a la constante por el valor que le asigné!

Código: C
  1. //Constantes INICIALES EEPROM
  2.  
  3. #DEFINE  estadozonas1=0;
  4. #DEFINE  estadozonas2=0;
  5. #DEFINE  estadocentral=0;
  6.  
  7. #DEFINE  zonasactivas1=0;
  8. #DEFINE  zonasactivas2=0;
  9.  
  10. #DEFINE  zonasignoradas1=0;
  11. #DEFINE  zonasignoradas2=0;
  12. #DEFINE  tipozona1=0;
  13. #DEFINE  tipozona2=0;
  14. #DEFINE  usuariosvivos=1;
  15.  
  16. #DEFINE  timeoutzona1=30;
  17. #DEFINE  timeoutzona2=0;
  18. #DEFINE  timeoutzona3=0;
  19. #DEFINE  timeoutzona4=0;
  20. #DEFINE  timeoutzona5=0;
  21. #DEFINE  timeoutzona6=0;
  22. #DEFINE  timeoutzona7=0;
  23. #DEFINE  timeoutzona8=0;
  24.  
  25. #DEFINE  timeoutzona9=0;
  26. #DEFINE  timeoutzona10=0;
  27. #DEFINE  timeoutzona11=0;
  28. #DEFINE  timeoutzona12=0;
  29. #DEFINE  timeoutzona13=0;
  30. #DEFINE  timeoutzona14=0;
  31. #DEFINE  timeoutzona15=0;
  32. #DEFINE  timeoutzona16=0;
  33.  
  34. #DEFINE  nombreusuario1_1="A";
  35. #DEFINE  nombreusuario1_2="D";
  36. #DEFINE  nombreusuario1_3="M";
  37. #DEFINE  nombreusuario1_4="I";
  38. #DEFINE  nombreusuario1_5="N";
  39. #DEFINE  nombreusuario1_6="";
  40. #DEFINE  nombreusuario1_7="";
  41. #DEFINE  nombreusuario1_8="";
  42.  
  43. #DEFINE  passusuario1_1=0x12;
  44. #DEFINE  passusuario1_2=0x34;
  45.  
  46. #DEFINE  permisosusuario1_1=255;
  47. #DEFINE  permisosusuario1_2=255;
  48.  
  49. #DEFINE  zonasusuario1_1=255;
  50. #DEFINE  zonasusuario1_2=255;
  51.  
  52. //Inserto en EEPROM
  53. #rom 0x2100={
  54.       estadozonas1,estadozonas2,estadocentral,zonasactivas1,zonasactivas2,
  55.       zonasignoradas1,zonasignoradas2,tipozona1,tipozona2,usuariosvivos,
  56.      
  57.       timeoutzona1,timeoutzona2,timeoutzona3,timeoutzona4,timeoutzona5,
  58.       timeoutzona6,timeoutzona7,timeoutzona8,timeoutzona9,timeoutzona10,
  59.       timeoutzona11,timeoutzona12,timeoutzona13,timeoutzona14,timeoutzona15,
  60.       timeoutzona16,
  61.      
  62.       nombreusuario1_1,nombreusuario1_2,nombreusuario1_3,nombreusuario1_4,
  63.       nombreusuario1_5,nombreusuario1_6,nombreusuario1_7,nombreusuario1_8,
  64.       passusuario1_1,passusuario1_2,permisosusuario1_1,permisosusuario1_2,
  65.       zonasusuario1_1,zonasusuario1_2      
  66. };

Error que arroja:

Error 27: "Expression must evaluate to a constant"

Gracias!!!
« Última modificación: 31 de Agosto de 2007, 17:28:34 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #3 en: 31 de Agosto de 2007, 17:34:41 »
Bueno, el lenguaje C es muy exigente en cuanto a hacer bien las cosas... :mrgreen:

Yo guardo mis variables en EEPROM asi:

Código: [Seleccionar]
enum Mapa_Memoria
 {
    CTE_CALIB = 0x40,                        //es una Float, ocupa 4 lugares
    LIMITE_INF_PRES = (CTE_CALIB + 4),       //es una Int16, ocupa 2 lugares
    LIMITE_SUP_PRES = (LIMITE_INF_PRES + 2), //es una Int16, ocupa 2 lugares
    LIMITE_MAX_TEMP = (LIMITE_SUP_PRES + 2), //es una Int16, ocupa 2 lugares
    eeOFFSET = (LIMITE_MAX_TEMP + 2),        //es una Int16, ocupa 2 lugares
    eeSPAN = (eeOFFSET + 2),                 //es una Int16, ocupa 2 lugares
    LIMITE_CALIB = (eeSPAN + 2),             //es una Int16, ocupa 2 lugares
    Numero_Conv_AD = (LIMITE_CALIB + 2),     //es una Int8, ocupa 1 lugar
    Mi_Cant_Sal = (Numero_Conv_AD + 1),      //es una Int8, ocupa 1 lugar
    TiempoON = (Mi_Cant_Sal + 2),            //es una Int16, ocupa 2 lugares
    TiempoOff = (TiempoON + 2),              //es una Int16, ocupa 2 lugares
    AlarmaTemp = (TiempoOff + 2),            //es una Int16, ocupa 2 lugares
    AlarmaHum = (AlarmaTemp + 2),            //es una Int16, ocupa 2 lugares
    Cant_Rondas = (AlarmaHum + 2),           //es una Int8, ocupa 1 lugar
    Direccion_Red = (Cant_Rondas + 1),       //es una Int8, ocupa 1 lugar
    Modo_Comm = (Direccion_Red + 1),         //es una Int8, ocupa 1 lugar
    Velocidad_Comm = (Modo_Comm + 1)         //es una Int8, ocupa 1 lugar
 };

No te olvides que el ejemplo anterior es para guardar constantes, si queres asignarles un valor te diria que antepongas Const al nombre.
 :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #4 en: 31 de Agosto de 2007, 17:43:29 »
Hola Marcos.

¿Te parece que mi código esta mal? ¿A que te referis?

Lo que vos ponés ahí es una enumeración. Es simplemente asignarle valores a ciertas etiquetas que ahí mísmo declarás.

¿Vos decis que pase mis definiciones a una enumeracion? Mi problema es que no sé cómo hacer referencia a una enumeración, constante o lo que sea a la hora de grabarla en la EEPROM.

Gracias, y saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #5 en: 31 de Agosto de 2007, 18:08:28 »
Bueno, te pongo un ejemplo de como leo o escribo una variable Enumerada, asi entendes el resto... :mrgreen:

Para leer el valor que esta guardado en EEPROM, sin importar el tipo
Código: [Seleccionar]
/*   Devuelve el valor del factor de calibración */
float Carga_CteKal()
{
  return (read_float_eeprom(CTE_CALIB));
}

Para guardar el valor en la EEPROM....
Código: [Seleccionar]
/*   Guarda el valor de la Constante de Calibracion en la EEPROM.
 *   @parametro CteKal es float.      */
void Guarda_CteKal (float CKal)
{
    if (read_float_eeprom(CTE_CALIB) == CKal)  return;
    write_float_eeprom(CTE_CALIB, CKal);
}

Para usar estas funciones hay que llamar la libreria Lib_Int_EEProm.c
Si no entendes seguimos adelante.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #6 en: 31 de Agosto de 2007, 18:15:12 »
Entiendo perfectamente lo que escribiste y lo que querés decir.
Pero yo no tengo problemas leyendo o escribiendo la EEPROM durante el tiempo de ejecución del programa en el PIC.

Tu enumeración es, precisamente, una especie de mapa de memoria EEPROM, que te facilita la tarea de grabar y escribir datos en la EEPROM para no tener que recordar la posicion de memoria correspondiente a cada dato.

Me malinterpretaste me parece.

Mi anhelo es poder cargarle los valores iniciales a la EEPROM al ser grabada por el programador de PICs de forma un poco más legible.

Es decir, yo queria lograr en lugar de tener que hacer asi:

#rom 0x2100={   0,10,50,...}

hacerlo asi:

#DEFINE   primerbyte=0;
#DEFINE   segundobyte=10;
#DEFINE   tercerbyte=50;
...

#rom 0x2100={  primerbyte, segundobyte,tercerbyte,...}

¿Se entendió mejor?

Es sencillamente porque así me resultaría más fácil modificar los "valores de fábrica" del dispositivo.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #7 en: 31 de Agosto de 2007, 18:31:11 »
Aura entendi!! :-/ :-/
Queres tener una entrada de datos mantenible a lo largo del tiempo!!

Creo que la opcion de los #Define esta bien, solo que esta mal escrito... :mrgreen:

Proba asi:
Código: [Seleccionar]
#define  primerbyte 0
Si anda el resto de tu codigo estaria bien
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #8 en: 31 de Agosto de 2007, 18:41:44 »
:D

No...no hay caso. Me tira un error que dice "Expected comma" precisamente en la primer coma :shock: :shock:
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #9 en: 31 de Agosto de 2007, 19:03:59 »
Vamos a ver si entiendo esto, me parece que están haciendo que el compilador haga lo correcto para meter esos datos en memoria de programas, no en la EEPROM que muchos PICs tienen como periféricos, así que creo debemos comenzar por allí, no vaya a ser que alguien se confunda o ya lo esté.

Saludos

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #10 en: 31 de Agosto de 2007, 21:05:54 »
No Reiner, es en la EEPROM interna, solo que Bruno quiere tener las asignaciones afuera de la rutina de grabacion en la eeprom, para que sea mas legible y posteriormente mantenible el codigo a lo largo del tiempo...
Es asi, Bruno?? :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #11 en: 31 de Agosto de 2007, 22:44:09 »
Satamente Marquitos! :D

¿Estaré pidiendole demasiado al CCS?
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #12 en: 01 de Septiembre de 2007, 04:39:00 »
Así funciona bien, Don Bruno:

Código: [Seleccionar]
#DEFINE   primerbyte 0
#DEFINE   segundobyte 10
#DEFINE   tercerbyte 50


#rom 0x2100={  primerbyte, segundobyte,tercerbyte}

Tenías que quitarle los ;

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #13 en: 01 de Septiembre de 2007, 06:05:05 »
Gracias Manolón!!!

Como siempre impecable tus apariciones ;)

Mañana lo pruebo.

Saludos!!!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
« Respuesta #14 en: 01 de Septiembre de 2007, 08:34:35 »
Aura entendi!! :-/ :-/
Queres tener una entrada de datos mantenible a lo largo del tiempo!!

Creo que la opcion de los #Define esta bien, solo que esta mal escrito... :mrgreen:

Proba asi:
Código: [Seleccionar]
#define  primerbyte 0
Si anda el resto de tu codigo estaria bien
Ehhhh!!!! :shock: :shock: :shock:
Yo lo habia dicho antes!!!! :8} :8} :8}

Claro, Manolo es mas lindo que yo, ja..ja.. :D :D :D
Bien Manolete !!! :mrgreen: :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.