TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Pchuqui_1 en 28 de Marzo de 2010, 13:44:19

Título: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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





Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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!
Título: Re: Grabar datos en EEprom externa
Publicado por: MGLSOFT 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
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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!!!!!  :-/ :-/ :-/
Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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:
Título: Re: Grabar datos en EEprom externa
Publicado por: mariano_pic 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.


Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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!
Título: Re: Grabar datos en EEprom externa
Publicado por: mariano_pic 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.
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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?   :?
Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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:
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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;              
 
 }
}
Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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!

Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 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
Título: Re: Grabar datos en EEprom externa
Publicado por: Suky 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)
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 en 29 de Marzo de 2010, 00:37:45
Muchas gracias Suky. Ese era el problema.    :-/ :-/ Te molestaria decirme para que sirbe ese anexo en la comunicación I2C. Es la primera ves que lo veo.
Título: Re: Grabar datos en EEprom externa
Publicado por: Suky en 29 de Marzo de 2010, 00:51:08
Por defecto al establecer un canal de comunicación con #use i2c() se trabajará realizando el envío por software, o sea se envía bit por bit en un for y el código es generado automáticamente por CCS. Cuando se colocar force_hw se indica que la comunicación se debe implementar con el módulo dedicado que tiene el microcontrolador, colocando el dato en el registro adecuado (SSPBUF) y habilitando la transmisión (Más detalles en datasheet del microcontrolador  ;-) ).


Saludos!
Título: Re: Grabar datos en EEprom externa
Publicado por: magusito en 29 de Marzo de 2010, 19:56:05
Hola . Tengo unas dudas acerca del tema que estan tratando. Soy nuevo y estoy realizando un pequeño trabajo, en el cual tengo que leer, escribir y guardar  datos de tipo short, int, long, int32, y float usando un teclado, un pic 18F452 y una LCD  en  una memoria EEprom externa.  Les adjunto lo que llevo del  programa, ojala alguien pueda ayudarme con lo que me falta.

#include <18F452.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                      //Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#use delay(clock=4000000)
#include <stdlib.h>
#include <2408.c>

#include<external_eeprom.c>
#define LCD_DATA_PORT getenv("SFR:PORTC")
#include <LCD.C>
#define use_portb_kbd TRUE
#include <KBD.C>

short   Dato_short;
int      Direccion_EEPROM_short[5];
char Caracter,Tecla;
int   Indice;
int   Direccion_EEPROM;
int   Cantidad_Datos;
int   Posicion_bit;



void Teclado_Libre()
{
   do   {
         Tecla = kbd_getc();
      }
      while(Tecla!='\0');
}
void Recibe_Tecla()
{
   do
   {
      Caracter=kbd_getc();
   }while(Caracter==0);

}
void main()
{
   set_tris_a(0x3F);//0011 1111
   set_tris_b(0xE0);//1110 0000
   set_tris_c(0x00);//0000 0000
   set_tris_d(0x00);//0000 0000
   set_tris_e(0x07);//0000 0111

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   lcd_init();
   kbd_init();
   port_b_pullups(TRUE);
   lcd_putc('\f');
   lcd_gotoxy(1,1);
   lcd_putc("1) Escribir Dato");
   lcd_gotoxy(1,2);
   lcd_putc("2) Leer Dato");
   Indice=0;
   while(TRUE)
   {
      Recibe_Tecla();
      if(Caracter!=0)
      {
         if(Caracter=='1')
         {
            Teclado_Libre();
            lcd_putc('\f');
            lcd_gotoxy(1,1);
            lcd_putc("1)Short 2)Int 3)Long");
            lcd_gotoxy(1,2);
            lcd_putc("4)int32 5)Float");
A1:
            Recibe_Tecla();
            if( (Caracter>='1') && (Caracter<='5') )
            {
               if(Caracter=='1')
               {
                  lcd_putc('\f');
                  lcd_gotoxy(1,1);
                  lcd_putc("Ingrese  Dato short");
                  lcd_gotoxy(1,2);
                  lcd_putc("y presione *");
A2:
                  Recibe_Tecla();
                  if( (Caracter>='0') && (Caracter<='1') )
                  {
                     lcd_putc('\f');
                     lcd_gotoxy(1,1);
                     printf(LCD_PUTC"Dato: %c",Caracter);
                     if(Caracter=='1')
                     {
                        Dato_short=True;
                     }
                     else
                     {
                        Dato_short=False;
                     }
A3:
                     Recibe_Tecla();
                     if(Caracter=='*')
                     {
                        lcd_putc('\f');
                        lcd_gotoxy(1,1);
                        lcd_putc("Ingrese  Direccion");
                        lcd_gotoxy(1,2);
                        lcd_putc("EEPROM: ");
                        Cantidad_Datos=0;
                        do
                        {
                           Recibe_Tecla();
                           printf(LCD_PUTC"%c",Caracter);
                           Direccion_EEPROM_short[Cantidad_Datos]=Caracter;
                           Cantidad_Datos++;
                        }while(Cantidad_Datos<=2);
                        Direccion_EEPROM=atoi(Direccion_EEPROM_short);
                        delay_ms(2000);
                        lcd_putc('\f');
                        lcd_gotoxy(1,1);
                        lcd_putc("Ingrese  Posicion");
                        lcd_gotoxy(1,2);
                        lcd_putc("del bit: ");
A4:
                        Recibe_Tecla();
                        if( (Caracter>='0') && (Caracter<='7') )
                        {
                           printf(LCD_PUTC"%c",Caracter);
                           Posicion_bit=Caracter-0x30;
                           write_int1_ext_eeprom(Direccion_EEPROM, Posicion_bit, Dato_short);
                           lcd_putc('\f');
                           lcd_gotoxy(1,1);
                           lcd_putc("Dato short Escrito");
                           delay_ms(2000);
                        }
                        else
                        { 
                           goto A4;
                        }
 
 
                     }
                     else
                     {
                        goto A3;
                     }
                   
                  }
                  else
                  {
                     goto A2;
                  }
           
               }
            }
            else
            {
               goto A1;
            }
             
         }
         if(Caracter=='2')
         {

         }
      } 
   }
}
Título: Re: Grabar datos en EEprom externa
Publicado por: Pchuqui_1 en 30 de Marzo de 2010, 00:31:47
Hola a todos. Bueno sigo renegando, pero cada ves con mas ganas  8). Quisiera preguntarles si existe una libreria para convertir un numero de decimal a coma flotante? El problema es que los datos que guardo en una EEPROM los proceso con la libreria FLOATEE.c que tiene la funcion de convertir un numero en coma flotante a decimal. Bueno ahora yo quiero leer ese numero para mostrarlo, hay librerias o tengo que rebuscarmelo con programación?  Me explico? Gracias.