Autor Tema: Grabar datos en EEprom externa  (Leído 8856 veces)

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Grabar datos en EEprom externa
« en: 28 de Marzo de 2010, 13:44:19 »
Hola a todos. Estoy realizando un pequeño proyecto, en el cual tengo que guardar los datos que me entrega un acelerómetro en una memoria EEprom externa. Por lo que estuve averiguando, no es posible guardar datos en coma flotante en una EEprom. Por lo tanto hay que convertirlos de alguna forma. Yo estoy intentando usar la librería FLOATEE.C pero no logro comprender el porqué de los errores. Les adjunto el programa y los errores, quizás alguien pueda ayudarme.   :oops:



#include <18f2550.h>

#fuses XT,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN // el fuse
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_B0,scl=PIN_B1)

#define _FLEX_LCD
#define LCD_DB4   PIN_B3
#define LCD_DB5   PIN_B4
#define LCD_DB6   PIN_B5
#define LCD_DB7   PIN_B6

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_B2

#include <flex_lcd.c>
#include <floatee.c>
#include <EEPROM_24512.c>                        //Ficheros driver de los periféricos

#define EEPROM_ADDRESS long int

float dato;
int16 address=0;
//int dat_serie[7];

void main() {
disable_interrupts(global); 
address=0;
   
   lcd_init();
   printf(lcd_putc,"Temp");
 
    setup_adc_ports (all_analog);           
    setup_adc (adc_clock_internal);                           //enciende adc
     set_adc_channel(0);                                           //elige canal a medir RA0
     delay_us(10);

while(1){
 
   dato=read_adc();
   
   WRITE_FLOAT_EXT_EEPROM(address,dato);        //Guarda 4 bytes del FLOAT
   address=address+4;


      printf(lcd_putc,"Temp=%4.1f C\n",dato);            //Visualiza en LCD la temperatura

}
}


Executing: "C:\Program Files\PICC\Ccsc.exe" +FH "Accelerometer_1.c" I*="C:\Program Files\PICC\Devices;C:\Program Files\PICC\Drivers"  #__DEBUG=true +ICD +DF +LN +T +A +M +Z +Y=9 +EA #__18F2550=TRUE
*** Error 12 "C:\Program Files\PICC\Drivers\floatee.c" Line 20(22,23): Undefined identifier  -- write_ext_eeprom
*** Error 12 "C:\Program Files\PICC\Drivers\floatee.c" Line 28(46,47): Undefined identifier  -- read_ext_eeprom
      2 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Sun Mar 28 13:42:02 2010






Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #1 en: 28 de Marzo de 2010, 14:49:00 »
Cambia:

Código: [Seleccionar]
#include <floatee.c>
#include <EEPROM_24512.c>                        //Ficheros driver de los periféricos

por:

Código: [Seleccionar]
#include <EEPROM_24512.c>                        //Ficheros driver de los periféricos
#include <floatee.c>

 ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Grabar datos en EEprom externa
« Respuesta #2 en: 28 de Marzo de 2010, 15:52:18 »
Me estaba rompiendo la cabeza buscando el error y estaba ante la vista!!! :D :D :D :D

No todo lo que ves es lo atiendes, no?? :5] :5] :D :D :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #3 en: 28 de Marzo de 2010, 16:16:30 »
Jaaa hace 3 días que estoy leyendo y buscando el error... Bueno les cuento que esto es para usar un acelerometro te la familia MMA73x0L, voy a intentar leer los ejes x, y , z y guardarlos en la memoria EEPROM. Luego por medio del LABVIEW leer la EEPROM para ver que se guardó.  Cuando lo termine lo posteo. Gracias por su ayuda!!!!!  :-/ :-/ :-/

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #4 en: 28 de Marzo de 2010, 16:21:36 »
Me estaba rompiendo la cabeza buscando el error y estaba ante la vista!!! :D :D :D :D

No todo lo que ves es lo atiendes, no?? :5] :5] :D :D :D :D

 :D :D La clave está en leer el error que devuelve el compilador  :roll:
No contesto mensajes privados, las consultas en el foro

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: Grabar datos en EEprom externa
« Respuesta #5 en: 28 de Marzo de 2010, 16:49:32 »
Hola a todos. Estoy realizando un pequeño proyecto, en el cual tengo que guardar los datos que me entrega un acelerómetro en una memoria EEprom externa. Por lo que estuve averiguando, no es posible guardar datos en coma flotante en una EEprom. Por lo tanto hay que convertirlos de alguna forma. Yo estoy intentando usar la librería FLOATEE.C pero no logro comprender el porqué de los errores. Les adjunto el programa y los errores, quizás alguien pueda ayudarme.   :oops:

  Hola la mejor forma de guardar variables en eeprom ya sea externa o interna segun creo:

  Explicacion:
  Lo primero que hay que entender es que una variable en alto nivel puede estar conformada por uno
  o varios bytes, uno al lado del otro, teniendo por ejemplo un dato tipo unsigned dos bytes, un byte
  alto y un byte bajo, otras variables tienen mas bytes, 4 u 8.
  La clave es usar una funcion del compilador que seleccione un byte de una variable y luego guardarla
  en la eeprom externa o interna.

  Por ejemplo yo uso mikroc, y uso la funcion HI, para tomar el byte alto, y Lo para tomar el byte bajo
  asi:
  unsigned dato   (16 bits)
  unsigned short datoh, datol (8 bits)

  datoh=Hi(dato);
  datol=Lo(dato);

  ahora se puede guardar en la eeprom:
  eeprom_write(0,datoh)
  eeprom_write(1,datol)

  Ahora si quieres que sea continuo, puedes usar una variable para la direccion de la eeprom, e ir aumentando
  en la medida que va avansando.

  Si alguien puede completar mi idea en ccs, para ayudar a nuestro amigo, seria muy bueno.


Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #6 en: 28 de Marzo de 2010, 17:02:50 »

  Hola la mejor forma de guardar variables en eeprom ya sea externa o interna segun creo:

  Explicacion:
  Lo primero que hay que entender es que una variable en alto nivel puede estar conformada por uno
  o varios bytes, uno al lado del otro, teniendo por ejemplo un dato tipo unsigned dos bytes, un byte
  alto y un byte bajo, otras variables tienen mas bytes, 4 u 8.
  La clave es usar una funcion del compilador que seleccione un byte de una variable y luego guardarla
  en la eeprom externa o interna.

 

Es lo que implementa la librería FLOATEE.C  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: Grabar datos en EEprom externa
« Respuesta #7 en: 28 de Marzo de 2010, 17:08:13 »
Citar

Es lo que implementa la librería FLOATEE.C  ;-)
Saludos!
ok gracias a mi tambien me sirve, para cuando retome el ccs, ya se me esta olvidando.
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #8 en: 28 de Marzo de 2010, 21:14:22 »
Si la libreria LOATEE.c  inplementa eso. Pero tambien hay que salter cuatro lugares de memoria para guardar los siguientes datos. Eso lo hace por el tamaño que puede tomar la variable a cargar?   :?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #9 en: 28 de Marzo de 2010, 21:21:17 »
Si la libreria LOATEE.c  inplementa eso. Pero tambien hay que salter cuatro lugares de memoria para guardar los siguientes datos. Eso lo hace por el tamaño que puede tomar la variable a cargar?   :?

Esto dice la librería:

Citar
// n is an offset into the eeprom.  For floats
// you must increment it by 4.  For example if
// the first float is at 0 the second one should
// be at 4 and the third at 8.

WRITE_FLOAT_EXT_EEPROM(long int n, float data)

Entonces si!  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #10 en: 28 de Marzo de 2010, 22:26:07 »
Gracias Suky, eso yo lo habia leido. Solo me preguntaba porque es necesario hacer eso. Saludos

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #11 en: 29 de Marzo de 2010, 00:08:37 »
Hola a todos de nuevo. Tengo un problema que es difícil de explicar, estoy probando el programa que se encuentra debajo con un micro PIC16F876 y funciona bien, pero cuando lo utilizo con el 18F2550 entra en la librería de la memoria EEPROM (EEPROM_24512.c) y se queda clavado ahí no sale nunca. Yo lo estoy simulando con el Proteus, pero también en la protoboard me hace lo mismo. No puedo entender porque no sale de esa rutina. Gracias



#include <18F2550.h>
#fuses XT,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,NOPBADEN // el fuse
#use delay(clock=4000000)
#use i2c(Master,sda=PIN_B0,scl=PIN_B1)

#define _FLEX_LCD
#define LCD_DB4   PIN_B3
#define LCD_DB5   PIN_B4
#define LCD_DB6   PIN_B5
#define LCD_DB7   PIN_B6

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_B2

#include <flex_lcd.c>   
#include <EEPROM_24512.c>     
#include <floatee.c>

int16 address=0;
float dato;


void main() {
 
   lcd_init();
   enable_interrupts(int_rda);
   enable_interrupts(global);
   address=0;
   
 printf(lcd_putc,"Activado"); 
   delay_ms(3000);

   setup_adc_ports(all_analog);           
    setup_adc(adc_clock_internal);                       
     set_adc_channel(0);                                   
     delay_us(10);


while(1){

   dato=read_adc();       
   delay_ms(100);
   WRITE_FLOAT_EXT_EEPROM(address,dato);    //ACA SE CLAVA NO SALE NUNCA
   address=address+4;
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Temp=%4.1f C\n",dato);        
   if (address==0xffff) address=0;              
 
 }
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #12 en: 29 de Marzo de 2010, 00:18:56 »
Se me ocurre que pueden estar faltando las resistencias pull-up a las lineas SCL y SDA  :tongue: Otro detalle es que al no colocar el parámetro force_hw en #use i2c() la comunicación se realiza por software.


Saludos!

No contesto mensajes privados, las consultas en el foro

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #13 en: 29 de Marzo de 2010, 00:22:14 »
Gracias Suky por tu respuesta. Pero no entiendo eso de  "force_hw en #use i2c()", en que parte del codigo lo anexo? Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #14 en: 29 de Marzo de 2010, 00:28:00 »
Gracias Suky por tu respuesta. Pero no entiendo eso de  "force_hw en #use i2c()", en que parte del codigo lo anexo? Gracias

#use i2c(.....,force_hw)
No contesto mensajes privados, las consultas en el foro