Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...