TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: QIQE en 27 de Abril de 2006, 16:59:56

Título: eeprom adjunto programa
Publicado por: QIQE en 27 de Abril de 2006, 16:59:56
Hola amigos vuelvo a dar guerra que raro!! tengo una memoria 24lc1025 la borro le grabo valores y luego me vuelve los numeros pares bien y los impares con valor de 255, nisiquiera los borro alguna sugerencia??


Código: [Seleccionar]
#include <16F877A.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT   //Crystal osc <= 4mhz
#FUSES NOPUT  //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG   //No Debug mode for ICD
#FUSES BROWNOUT  //Reset when brownout detected
#FUSES NOLVP       //No Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD     //No EE protection
#FUSES NOWRT    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)

#include <ctype.h>
#include <string.h>

#define eep_escribir 0b10100000  //Primeros 512kas
#define eep_leer 0b10100001

#define eep1_escribir 0b10101000  //Primeros 512kas
#define eep1_leer 0b10101001

int const longitud=4;
char rcvchar=0x00;
int xbuff=0x00;
char cbuff[longitud];


#int_RDA

void serial_isr()
{
rcvchar=0x00;
if (kbhit())
   {
   cbuff[xbuff++]=getc();

   if (xbuff>longitud)
      xbuff=longitud;
   }
 
}



   int dato=0,AUX,i=0;
   long int direccion=0,direccion1=0;
   short int status;

void main()
{

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(VREF_LOW|-2);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   
           
      i2c_start();
     
      i2c_write(eep_escribir);
     
      i2c_write(direccion1>>8);
      i2c_write(direccion1);

   while (direccion1<6400 )
      {
      i2c_write(0);
      delay_ms(5);
      i2c_stop();
     
      direccion1++;
      }

      direccion1=0;
     
      i2c_start();
     
      i2c_write(eep1_escribir);
     
      i2c_write(direccion1>>8);
      i2c_write(direccion1);

   while (direccion1<6400 )
      {
      i2c_write(0);
      delay_ms(5);
      i2c_stop();
     
      direccion1++;
      }

while (1)
   {
   
   if (direccion<64000 )
      {   
      printf("%u ",i);     
      i2c_start();     
      i2c_write(eep_escribir);     
      i2c_write(direccion>>8);
      i2c_write(direccion);
      i2c_write(i);
      delay_ms(100);
      i2c_stop();     
      i++;
      direccion++;
      }


   while (cbuff[0]=='a'&& cbuff[1]=='0')
         {
         disable_interrupts(INT_RDA);
         printf("valor\r");         
         direccion=0;
         
         WHILE (direccion!=6400)
            {     
            for (AUX=0; AUX<8; ++aux)
               {
               i2c_start();
               i2c_write(eep_escribir);         
               i2c_write(direccion>>8);
               i2c_write(direccion); 
               i2c_start();
               i2c_write(eep_leer);
               dato=i2c_read(0);
               i2c_stop();
               printf("%u ",dato);
               direccion++;
               }
            printf("\r");
            }           
         strcpy(cbuff," ");
         xbuff=0;
         enable_interrupts(INT_RDA);
         }
   }
}


muchas gracias compañeros
Título: Re: eeprom adjunto programa
Publicado por: maunix en 27 de Abril de 2006, 17:31:42
No he tenido tiempo de ver todo el codigo pero el compilador es case sensitive? o sensible a mayusculasy minusculas?

Porque fijate esta linea

Código: C
  1. for (AUX=0; AUX<8; ++aux)

Si tu compilador es case sensitive en realidad AUX y aux debieran ser dos variables diferentes.

Puedes confirmarme este dato?
Título: Re: eeprom adjunto programa
Publicado por: QIQE en 28 de Abril de 2006, 09:52:41
no no sensible a las mayusculas/minusculas esa parte me la hace bien el problema esta en la lectura o escritura de la eeprom
Título: Re: eeprom adjunto programa
Publicado por: BrunoF en 28 de Abril de 2006, 10:12:05
Hola. las memorias I2C poseen un contador interno. Cada vez que leas un o escribas un dato en modo Current Address Read/Write, el contador interno de la EEPROM se autoincrementa en 1, por lo tanto, no necesitas incrementarlo desde el programa.Por eso seguramente te estas salteando las impares.
Revisa bien la hoja de datos de la memoria para mayor informacion.
Saludos.
Título: Re: eeprom adjunto programa
Publicado por: QIQE en 01 de Mayo de 2006, 08:50:57
no sigue sin funcionar :S:S no se que hago mal si que incrementa él solo la dirección. pero me sigue leyendo dato correcto 255 dato correcto 255 dato correcto y asi sucesivamente hasta el fin de los tiempos :(  alguna idea de loq ue puede suceder?? muchas gracias a todos
Título: Re: eeprom adjunto programa
Publicado por: maunix en 01 de Mayo de 2006, 10:46:06
no sigue sin funcionar :S:S no se que hago mal si que incrementa él solo la dirección. pero me sigue leyendo dato correcto 255 dato correcto 255 dato correcto y asi sucesivamente hasta el fin de los tiempos :(  alguna idea de loq ue puede suceder?? muchas gracias a todos

Fijate bien en el datasheet a ver que comando estas usando para escribir.

Como dijo BrunoF algunos comandos de 'write' tienen un autoincremento del address interno, aunque estos comandos en gral suelen necesitar que uno le envié el siguiente byte en el siguiente ciclo (sin tener que mandar toda la trama nuevamente) ya que permiten cierto cache de escritura para hacer las cosas más velozmente. 

De todas formas, hay comandos write que no tienen autoincremento y puedes enviarle la dirección como tu dices, ahora bien puedes apuntarnos al menos a la datasheet del IC que estas usando? Por ahi veamos algo en las datasheet que nos de otra pista. 

;)

Título: Re: eeprom adjunto programa
Publicado por: QIQE en 01 de Mayo de 2006, 12:38:41
http://www.microchip.com/ParamChartSearch/chart.aspx?branchID=70012&mid=&lang=en
Esta es la memoria que estoy usando una 24lc1025 muchas gracias ;)
Título: Re: eeprom adjunto programa
Publicado por: marcegoncba en 02 de Mayo de 2006, 12:25:37
El problema parece estar aquí:
     i2c_write(0);
      delay_ms(5);
      i2c_stop();

La memoria comienza el proceso interno de escritura después del STOP, y estas poniendo el retardo antes de enviarle el STOP y es por eso que te ignora las direcciones impares ya que está aún grabando la dirección par anterior.

Probá:
     i2c_write(0);
      i2c_stop();
      delay_ms(5);

Saludos
Marcelo
Título: Re: eeprom adjunto programa
Publicado por: QIQE en 02 de Mayo de 2006, 16:04:15
Muchas gracias compañeros correcto el error estaba en los delays aun se estaba grabando cuandoq ueria meter otro dato :S:S enfin tropezando se aprende :S:S muchas gracias de nuevo