TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: BrunoF en 31 de Agosto de 2007, 16:18:14

Título: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF 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!!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF 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!!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF 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.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF 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.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF 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:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: reiniertl 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
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 31 de Agosto de 2007, 22:44:09
Satamente Marquitos! :D

¿Estaré pidiendole demasiado al CCS?
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno 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 ;
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 01 de Septiembre de 2007, 06:05:05
Gracias Manolón!!!

Como siempre impecable tus apariciones ;)

Mañana lo pruebo.

Saludos!!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT 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:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno en 01 de Septiembre de 2007, 08:48:27
Jajaja, celosooooo
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: reiniertl en 01 de Septiembre de 2007, 14:59:44
Perdonen mi ignominiosa ignorancia, pero yo pensaba que la directiva #rom solo permitía poner cosas en memoria de programas, será por eso que una vez quise meter unas tablas constantes en memoria de programas, para después leerlas (así puedo meter bos bytes en una loc y con la función de CCS para leer la mem de proga, en los PICs que lo permiten, me ahorraba espacio aunque la aplicación anduviese más lenta)
El muy cabrón del compilador metía las cadenas donde le daba su gana y en la dirección que yo le había puesto, Alguien puede documentar más esta directiva, así salgo yo de mi ignorancia.

Reinier
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno en 01 de Septiembre de 2007, 15:14:09
Funciona igual con una zona de la memoria que con otra, depende de la dirección que le pongas.
La 0x2100 es la eeprom de datos.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: reiniertl en 01 de Septiembre de 2007, 16:27:38
Si, pero como se cual es cada espacio de direcciones, porque si cada espacio de direcciones comienza en un lugar distinto para cada PIC estoy frito, diganme nada más, hay que consultar el datasheet, verdá que sí?

Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 01 de Septiembre de 2007, 21:11:47
Deberas aplicar RTFM Reiner !!! :mrgreen: :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: reiniertl en 03 de Septiembre de 2007, 20:25:19
RTFM Y eso que ostras es, no será algo así como?

Prueba y reprueba, hasta que ande? porque si es así habrá que recordarle a alguien (CCS o Microchip) a su progenitora.

Nada es que me parece muy importante poder hacer eso sin mucho lío.

Gracias de todos modos,

Reinier
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 03 de Septiembre de 2007, 22:06:13
Es una sigla de una frase Americana Reiner.. :lol: :lol:
Significa lo siguiente:

Read The Fucking Manual !!

 :D :D :mrgreen: :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 03 de Septiembre de 2007, 22:07:00
Perdon Reiner, me tente !!! :-) :-) :5} :5}
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 03 de Septiembre de 2007, 22:09:40
Entre lo ejemplos de CCS hay uno para escribir en la memoria de programa, te lo busco y te lo paso, para que me perdones, je..je.. :mrgreen: :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 03 de Septiembre de 2007, 22:43:33
WRITE_PROGRAM_MEMORY( )

--------------------------------------------------------------------------------

 

Syntax:
 write_program_memory( address, dataptr, count );

 
 
Parameters:
 address is 16 bits on PCM parts and 32 bits on PCH parts.

dataptr is a pointer to one or more bytes count is a 8 bit integer

 
 
Returns:
 undefined

 
 
Function:
 Writes count bytes to program memory from dataptr to address.  This function is most effective when count is a multiple of FLASH_WRITE_SIZE.  Whenever this function is about to write to a location that is a multiple of FLASH_ERASE_SIZE then an erase is performed on the whole block.

 
 
Availability:
 Only devices that allow writes to program memory.

 
 
Requires:
 Nothing

 
 
Examples:
 for(i=0x1000;i<=0x1fff;i++) {

   value=read_adc();   

   write_program_memory(i, value, 2); delay_ms(1000);

}

 
 
Example Files:
 loader.c
 
 
Also See:
 write_program_eeprom, erase_program_eeprom

 
 
Additional Notes:
 Clarification about the functions to write to program memory:

For chips where
getenv(“FLASH_ERASE_SIZE”) > getenv(“FLASH_WRITE_SIZE”)

WRITE_PROGRAM_EEPROM

Writes 2 bytes, does not erase (use ERASE_PROGRAM_EEPROM)

WRITE_PROGRAM_MEMORY

Writes any number of bytes, will erase a block whenever the first (lowest) byte in a block is written to.  If the first address is not the start of a block that block is not erased.

ERASE_PROGRAM_EEPROM

Will erase a block.  The lowest address bits are not used.

For chips where
getenv(“FLASH_ERASE_SIZE”) = (“FLASH_WRITE_SIZE”)

WRITE_PROGRAM_EEPROM

Writes 2 bytes, no erase is needed. 

WRITE_PROGRAM_MEMORY

Writes any number of bytes, bytes outside the range of the write block are not changed.  No erase is needed.

ERASE_PROGRAM_EEPROM

Not available


Ya ves, el ejemplo es loader.c

Espero te sirva Reiner...

 
 
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 03 de Septiembre de 2007, 22:46:09
Perdon, el ejemplo es EX_Load.c
Loader.c es la libreria... :lol:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: reiniertl en 04 de Septiembre de 2007, 19:29:15
Gracias, eso de la frase está cojonudo, muy bueno.


Y lo mejor es es que luego te haces el santito, JAJAJA, no importa has sido perdonado, es más yo te perdono y exonero de toda culpa..


Saludos
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 05 de Septiembre de 2007, 22:38:15
Hola muchachos!

Vuelvo a la carga con la preguntonta number 2:

¿Cómo hago pa referirme al byte alto o bajo de una variable int16?

Es decir, ¿cómo hago para escribir o leer los bytes alto/bajo(por separado) de una variable int16 que yo creé?

Ejemplo:

int16 mivar;
int8 alta,baja;

alta = ??....//Necesito que en alta se guarde el valor del byte alto de mivar
baja = ??....//Necesito que en baja se guarde el valor del byte bajo de mivar

Se me ocurren muchas alternativas, pero estoy seguro que tiene que haber alguna instrucción que no requiera de mucho cálculo.

Muchísimas gracias!!!

Saludoss
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 05 de Septiembre de 2007, 22:45:56
P.D

baja = mivar

funcionaria para obtener el byte bajo del int16...
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Rulo en 05 de Septiembre de 2007, 22:58:01
   

     yo lo hacia asi:


       Alta=(mivar << 8 ) | (mivar >> 8 );


            saludos
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 05 de Septiembre de 2007, 23:02:10
Mmm pero eso implicaría que el compilador haga 8 rotaciones???

Voy a mirar el código asm que genera. Me muero de la bronca si genera 8 lineas con rotaciones! en assembler son solamente dos...

Gracias!!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Rulo en 05 de Septiembre de 2007, 23:07:47


      existe la funcion MAKE8( ); pero yo no la he implementado y no se cuantas lineas ocupe, fijate en la ayuda de CCS ponen este ejemplo.


Examples:
 int32 x;
 int y;
 y = make8(x,3);  // Gets MSB of x

         suerte.
 
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno en 06 de Septiembre de 2007, 01:59:58
typedef struct {
        byte byte0;
        byte byte1;
} WORD;

WORD mivar;

alta=mivar.byte1;
baja=mivar.byte0;
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 06 de Septiembre de 2007, 02:50:12
Gracias Rulo!

Si, espectacular, creo que con el MAKE8 y MAKE16 estoy hecho segun lo que lei en la ayuda.



Hola manolo!

Pos ahorita yo lo tenia como array:

int8 mivar[2];

lo que sería muy similar a lo que planteas.

Lo que no me queda claro es si creando una estructura de ese tipo, puedo referirme a "mivar" como una variable de 16 bits, o tendre que referirme siempre a su byte bajo(byte0) y alto(byte1).

Voy a probar...mañana cuento que pasó.

Salu2!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno en 06 de Septiembre de 2007, 02:59:53
Sí que puedes, y si no te funciona directamente, esto seguro que funciona:

int16 mivar1;
WORD mivar2;

mivar1=(int16)mivar2;
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: BrunoF en 06 de Septiembre de 2007, 15:10:02
Gracias manolo!

Funciona a la perfección, excepto cuando quiero someter sus 16bits a operadores lógicos. Allí el compilador me arroja error. Igual está de luuujooo!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: aitopes en 29 de Octubre de 2007, 15:35:07
Hola!
Retomo el tema.

Usando
#rom 0x2100 = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }

O lineas parecidas todo funciona bien, pero cuando quiero compilar lo siguiente:

void main(void)
{
   //
   //------------------------------------------------------------------------------
   #rom 0x2100 = {0x00}; // Demora (1/10s) entre cada paso del Prog.1
   // 64 valores del programa 1
   #rom 0x2101 = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }
   #rom 0x2109 = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }
   #rom 0x210A = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }
   #rom 0x2112 = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }
   #rom 0x211A = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }
   #rom 0x2122 = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }
   #rom 0x212A = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }
   #rom 0x2132 = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }


Me da errores en todas las lineas debajo del comentario "//// 64 valores del programa 1". Los errores son:

Error 51: A numeric expression must appear here.

Y por lo que veo, SON expresiones numericas.

¿Que me esta pasando? :(

Saludos!

"
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: Nocturno en 29 de Octubre de 2007, 15:47:34
¿No será que te sobra un ";"?
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 29 de Octubre de 2007, 15:59:01
Por supuesto que le sobra el ";"   :mrgreen: :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: aitopes en 29 de Octubre de 2007, 16:30:09
Efectivamente...sobraba el ";". Ahora....que atorrante darme error en TODAS las lineas siguientes en lugar de venir civilizadamente y decirme "Ariel, fijate con atencion en la linea XXX, hay un ; de mas....¿lo remuevo por ti?".... :D :D

GRACIAS!!!!!!!!!
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 29 de Octubre de 2007, 16:34:44
En ese caso seria otro BUG del CCS!! :D
Te imaginas hablando en español al CCS !! :mrgreen: :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: aitopes en 29 de Octubre de 2007, 16:36:55
No me hables de bugs....que no me he topado con ninguno. Debe ser por que estoy usando cosas SUPER-BASICAS.

Espero seguir asi. :)

Saludos.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: PalitroqueZ en 29 de Octubre de 2007, 19:05:46
si Ariel, hay veces que cometemos errores de sintaxis y el compilador nos tira un error que en realidad no sabemos donde está o de que se trata, me ha pasado muchas veces y sobre todo cuando se usa codigos en otros archivos .h (me recuerda los cuentos de la cripta sobre el cobol  :shock:) 

Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 29 de Octubre de 2007, 23:11:56
Igual si haces click sobre las lineas de errores o advertencias te llavara a la linea de programa donde se encuentra el error... :lol: 8)
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: aitopes en 30 de Octubre de 2007, 18:47:17
Hola amigos!
Ya se que me pongo pesado...pero tengo una bolsa llena de dudas y algunas no las puedo resolver sin su sapiencia :)


Sigo jugando con la EEPROM internar de un 16F628A. Segun la datasheet, son 128 bytes ordenados desde 0x00 a 0x7F. Intento leer una serie de valores de la eeprom, y sacarlos por el puerto B, pero....el puerto muestra "basura". Evidentemente estoy apuntando para cualquier lado.

¿Sera que la eeprom efectivamente esta a partir de 0x2100 ?

¿Eso significa que la variable que uso para recorrer la memoria tiene que ser de 16 bits de ancho?

Gracias por la paciencia...
Saludos.
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: aitopes en 30 de Octubre de 2007, 18:59:35
Perdooooonnnn!

Calculaba la direccion de la memoria (que efectivamente esta a partir de 2100) con una cuenta que implicaba el uso de una potencia. Use "^" como en BASIC, pero en CCS hace algo muy distinto. Debi usar POW().

Ya lo corrijo y les cuento. El error en el calculo es lo que hacia que al usar las direcciones 2100 en adelante me mostrara basura, por que el  "puntero" estaba en cualquier parte.  :?
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: quirogaareal en 12 de Noviembre de 2007, 22:32:50
Hola Gente :

Ya que estamos con el tema de las memorias  como haria para guardar una variable de 10 bit en memoria interna del pic cen lenguaje C?

Saludos
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: MGLSOFT en 12 de Noviembre de 2007, 22:41:42
Debes usar dos bytes, en uno guardas el byte alto y en otro el byte bajo.
CCS tiene librerias que permiten utilizar ese formato y guardar hasta flotantes, que ocupan 4 bytes... :mrgreen:
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: quirogaareal en 13 de Noviembre de 2007, 17:51:27
Hola
muchas gracias por responder. Sin embargo podrian indicarme donde hay un ejemplito para fijarme. me seria un poco mas didactico

Saludos
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: khn945 en 27 de Junio de 2015, 21:03:16
ola amigos una pregtun tota tengo un proble resulta que hice un carrito pero me pidieron que con un teclado matricial la cosa es que yto por ejemplo presiona derecha izquierda adelan atras o cualquier conbinacion y despues debe ejecutarlas como las presione la cosa es qwue no loo eh logrado hacer lo unico qyue tengo es que lo haga por separado osea uno por uno  me podrian ayudar de favor gracias 
Título: Re: Pre-Grabar Datos en EEPROM interna en CCS(PIC 16F876A)
Publicado por: KILLERJC en 27 de Junio de 2015, 22:40:05
ola amigos una pregtun tota tengo un proble resulta que hice un carrito pero me pidieron que con un teclado matricial la cosa es que yto por ejemplo presiona derecha izquierda adelan atras o cualquier conbinacion y despues debe ejecutarlas como las presione la cosa es qwue no loo eh logrado hacer lo unico qyue tengo es que lo haga por separado osea uno por uno  me podrian ayudar de favor gracias  

Deberias crear un tema explicando bien como es que debe funcionar (si lees lo que pusiste no se entendio nada) y el programa que tenes, asi por lo menos se te pueden dar ideas de como solucionarlo para que funcione como vos necesitas.
Si esta programado en C, deberias hacerlo aca

http://www.todopic.com.ar/foros/index.php?board=4.0

Sino crealo y algun moderador lo va a mover donde corresponda