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

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #15 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.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Grabar datos en EEprom externa
« Respuesta #16 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!
No contesto mensajes privados, las consultas en el foro

Desconectado magusito

  • PIC10
  • *
  • Mensajes: 30
Re: Grabar datos en EEprom externa
« Respuesta #17 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')
         {

         }
      } 
   }
}

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Grabar datos en EEprom externa
« Respuesta #18 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.