TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
Cambia:
#include <floatee.c>
#include <EEPROM_24512.c> //Ficheros driver de los periféricos
por:
#include <EEPROM_24512.c> //Ficheros driver de los periféricos
#include <floatee.c>
;-)
Saludos!
-
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
-
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!!!!! :-/ :-/ :-/
-
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:
-
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.
-
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!
-
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.
-
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? :?
-
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:
// 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:
-
Gracias Suky, eso yo lo habia leido. Solo me preguntaba porque es necesario hacer eso. Saludos
-
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;
}
}
-
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!
-
Gracias Suky por tu respuesta. Pero no entiendo eso de "force_hw en #use i2c()", en que parte del codigo lo anexo? Gracias
-
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)
-
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.
-
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!
-
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')
{
}
}
}
}
-
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.