Olá pessoal. Estou com problemas para ler dados que são escritos numa eeprom externa. Utilizo o mikroc e para simular, utilizo o proteus. O pic é o 16F877A. Se alguém puder me ajudar, fico muito grato!! A seguir está o programa.
unsigned char segundos = 0;
unsigned char minutos = 0;
unsigned char horas = 0;
unsigned long int i = 0;
unsigned char count = 0;
unsigned char recebe;
unsigned long contagem = 0;
unsigned long int j;
void interrupt()
{
//if(INTCON.TMR0IF)
{
contagem++; //para cada interrpção do TMR0 incrementa a variável contagem
TMR0 = 0;
INTCON.TMR0IF = 0; //limpa o overflow.
}
}
void main(){
{
TRISB0_bit = 1;
TRISD = 0x00;
PORTD = 0b00000000;
INTCON.GIE = 1; //habilita interrupção global;
INTCON.PEIE = 1; //habilita interrupção dos perifericos;
INTCON.TMR0IE = 1; //habilita interrupção do TMR0;
TMR0 = 0; // TIMER0 inicia com o valor 0;
OPTION_REG = 0b10000001; // Modo Temporizador, prescaler 1:4;
I2C1_Init(100000);
UART1_Init(73);
delay_ms(100);
TXSTA.CSRC = 0;
TXSTA.TX9 = 0;
TXSTA.TXEN = 1;
TXSTA.SYNC = 0;
TXSTA.BRGH = 0;
TXSTA.TRMT = 0;
TXSTA.TX9D = 0;
RCSTA.SPEN = 1;
RCSTA.RX9 = 0;
RCSTA.SREN = 0;
RCSTA.CREN = 1;
RCSTA.ADDEN = 0;
RCSTA.FERR = 0;
RCSTA.OERR = 0;
RCSTA.RX9D = 0;
//Configuração da velocidade de transmissão
SPBRG = 6;
while(1){
if(Button(&PORTB, 0, 0, 1)){ //Quando aperto o botão, um contador é incrementado
count++;
PORTD.RD7 = 1;
delay_ms(200);
}
else
PORTD.RD7 = 0;
if(contagem == 40) //quando a contagem = 40, tempo = 40 * 0,125s = 5s
{
I2C1_Start(); //Essa parte recebe as horas, minutos e segundos do RTC
I2C1_Wr(11010000);
I2C1_Wr(0x00);
I2C1_Repeated_Start();
I2C1_Wr(11010001);
segundos = I2C1_Rd(1);
minutos = I2C1_Rd(1);
horas = I2C1_Rd(0);
I2C1_Stop();
delay_ms(20);
I2C1_Start(); //Nesta parte, escrevo os dados de segundos na eeprom externa
I2C1_Wr(0b10100000);
I2C1_Wr(i);
I2C1_Wr(segundos);
//delay_ms(20);
I2C1_Stop();
I2C1_Start(); //Aqui escrevo os minutos na eeprom
I2C1_Wr(0b10100000);
I2C1_Wr(i+1);
I2C1_Wr(minutos);
//delay_ms(20);
I2C1_Stop();
I2C1_Start(); //Aqui escrevo os segundos
I2C1_Wr(0b10100000);
I2C1_Wr(i+2);
I2C1_Wr(horas);
//delay_ms(20);
I2C1_Stop();
I2C1_Start(); //Aqui escrevo a quantidade de vezes que eu apertei o botão
I2C1_Wr(0b10100000);
I2C1_Wr(i+3);
I2C1_Wr(count);
//delay_ms(20);
I2C1_Stop();
i=i++;
count = 0;
contagem = 0;
}
if(Button(&PORTC, 0, 0, 1)){ //Quando aperto esse botão, leio as informações da eeprom e envio via serial
for(j=0;j<4;j++){
delay_ms(20);
I2C1_Init(100000);
I2C1_Start();
I2C1_Wr(0b10100000);
I2C1_Wr(j);
I2C1_Repeated_Start();
I2C1_Wr(0b10100001);
recebe = I2C1_Rd(0);
delay_ms(20);
I2C1_Stop();
UART1_Write(recebe);
TXREG = recebe;
while(PIR1.TXIF == 0);
PIR1.TXIF = 0;
delay_ms(20);
}
}
}
}
}