Ir ao conteúdo
  • Cadastre-se
burn/omegafire

Ajuda com eepron 24C32A só lê uma vez.

Recommended Posts

Olá amigos, estou desenvolvendo um projeto de datalogger para temperatura no compilador MikroC. A ideia é utilizar um PIC 16F877A para controlar um modulo DS1307 como este que possui além do relógio RTC,  um modulo de eeprom 24C32A, e usar essa memória eeprom para guardar dados de data e temperatura fornecido por um LM35. O problema é que simulando no proteus, eu consigo escrever na memória e depois executar a leitura, mas apenas uma vez. Quando tento ler de novo, a string que deveria conter a leitura está "zerada". Alguém pode me dar uma ajuda? Acho que estou com algum problema no endereçamento de dados na memória eeprom.

 

Segue o código e o arquivo em formato rar com projeto no mikro c e proteus.

#define Lo(param) ((char *)&param)[0]#define Hi(param) ((char *)&param)[1]char temp[16] = "00:00:00;000,0\r"; //15 caractereschar nome[16];unsigned int endereco=0;char segundos, minutos, horas, dia, date, mes, ano;unsigned long adc;////////////////////////////////////////////////////////////////////////////////void Eeprom_24C32A_WriteByte(char DEVICE, unsigned address, char wData){   I2C1_Start();   I2C1_Wr(0xA0 | (DEVICE << 1));   I2C1_Wr(Hi(address));   I2C1_Wr(Lo(address));   I2C1_Wr(wData);   I2C1_Stop();   Delay_ms(5);}char Eeprom_24C32A_ReadByte(char DEVICE, unsigned address){char rData;   I2C1_Stop();   I2C1_Start();   I2C1_Wr(0xA0 | (DEVICE << 1));   I2C1_Wr(Hi(address));   I2C1_Wr(Lo(Address));   I2C1_Repeated_Start();   I2C1_Wr(0xA1 | (DEVICE << 1));   rData = I2C1_Rd(0);   I2C1_Stop();   return rData;}int Eeprom_24C32A_WriteString(char DEVICE, unsigned address, char *wData){  while(*wData != 0)  {    Eeprom_24C32A_WriteByte(DEVICE, address++, *(wData++));  }return address++;}void Eeprom_24C32A_ReadString(char DEVICE, unsigned address, char *rData, char Size){char i; while(i < Size) {    rData[i++] = Eeprom_24C32A_ReadByte(DEVICE, address++); }}char Eeprom_24C32A_Connected(char DEVICE){char ack;     I2C1_Start();     ack = I2C1_Wr(0xA0 | (DEVICE << 1));     I2C1_Stop();     return !ack;}////////////////////////////////////////////////////////////////////////////////void ds1307_write(unsigned short registro, unsigned short valor){I2C1_Stop();I2C1_Start();I2C1_Wr(0xD0);I2C1_Wr(registro);I2C1_Wr(Dec2Bcd(valor));I2C1_Stop();}void ds1307_read(){I2C1_Start();I2C1_Wr(0xD0);I2C1_Wr(0x00);I2C1_Repeated_Start();I2C1_Wr(0xD1);segundos = Bcd2Dec(I2C1_Rd(1));minutos = Bcd2Dec(I2C1_Rd(1));horas = Bcd2Dec(I2C1_Rd(1));dia = Bcd2Dec(I2C1_Rd(1));date = Bcd2Dec(I2C1_Rd(1));mes = Bcd2Dec(I2C1_Rd(1));ano = Bcd2Dec(I2C1_Rd(0));I2C1_Stop();}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Write1_Line_string(char *msg){      //Escreve string e linha     UART1_Write_text(msg);     UART1_Write(13);     UART1_Write(10);     }void Write1_Line_Int(int *intMsg){ //escreve numero e linha     char cMsg[7];     IntToStr(intMsg,cMsg);     UART1_Write_text(cMsg);     UART1_Write(10);     UART1_Write(13);     }     void Write1_Line_char(int *intMsg){ //escreve numero e linha     char cMsg;     UART1_Write(cMsg);     UART1_Write(10);     UART1_Write(13);     }void Write1_string(char *msg){    //escreve string     UART1_Write_text(msg);     }void Write1_char(char *msg){     //escreve caractere     UART1_Write(msg);     }void Write1_int(int *intMsg){    //escreve numero     char cMsg[7];     IntToStr(intMsg,cMsg);     UART1_Write_text(cMsg);     }////////////////////////////////////////////////////////////////////////////////void main(){       short z;    ADC_Init();    ADCON1 = 0B00001110;    I2C1_Init(100000);    UART1_Init(9600);    for(z=0;z<14;z++){nome[z]=(49+z);}//"Zera" a string de leitura da memoria eeprom    while(1){    adc = ADC_Read(0);  //Leitura do termometro    adc = adc * 1000/204;    temp[9] = (adc/1000) + 48;    temp[10] = ((adc/100)%100) + 48;    temp[11] = ((adc/10)%10) + 48;    temp[13] = (adc%10) + 48;        ds1307_read();  //Leitura do relogio    temp[0] = horas/10 + 48;    temp[1] = horas%10 + 48;    temp[3] = minutos/10 + 48;    temp[4] = minutos%10 + 48;    temp[6] = segundos/10 + 48;    temp[7] = segundos%10 + 48;        delay_ms(10);    endereco=Eeprom_24C32A_WriteString(0, 0, temp); //escrita na memoria    Write1_line_string(temp); //imprime na porta serial o que foi escrito na memoria    delay_ms(10);        Eeprom_24C32A_ReadString(0, 0, nome, 15); //le na memoria o que foi escrito    Write1_line_string(nome);        Write1_line_int(endereco);         //"Zera" a string de leitura da memoria.    for(z=0;z<14;z++){nome[z]=(49+z);}        delay_ms(2000);    }}

eeprom_i2c.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

dê um pause e verifique se a eeprom está zerada mesmo ou se está lendo como zero. rode passo a passo. coloque break points. verifique pullups (no proteus pullup e não resistor) etc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×