Ir ao conteúdo
  • Cadastre-se

PIC Problemas para ler informações da eeprom externa


Posts recomendados

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);
                       


}
}
}
}
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Que tipo de

41 minutos atrás, Mateus Araquam disse:

problemas

?

Dica: a interrupt pode estar zoando a comunicação i2c

 

41 minutos atrás, Mateus Araquam disse:

I2C1_Wr(11010000);

 

41 minutos atrás, Mateus Araquam disse:

I2C1_Init(100000);

meu argumento...estranho argumento

 

Link para o comentário
Compartilhar em outros sites

SImplesmente não lê nada. No I2C debugger(no proteus) fala que não lê nada... Aparece 0xff quando ele vai ler as informações.

adicionado 3 minutos depois
9 minutos atrás, Isadora Ferraz disse:

Que tipo de

?

Dica: a interrupt pode estar zoando a comunicação i2c

 

 

meu argumento...estranho argumento

 

E como eu poderia corrigir isso? Sou novo na programação de Microcontroladores.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 15/01/2018 às 12:18, Mateus Araquam disse:

Acho q foi o forum... no programa tá tudo certinho

Pra constar, algum moderador editou apagando (o que não sei se foi saudável) a menção do meu post quando mencionei algo do gênero. Se achar que deve, alguém da moderação ou administração pode tecer algum comentário sobre.

 

Mas antes de culpar a máquina do forum ou a edição do amigo moderador, vamos tentar ser mais explícitos:...

I2C1_Wr(11010000); // o que está dentro do parêntesis é chamado "argumento". A função I2Cwrite() prefere argumento tipo inteiro ou coerente com a capacidade da eeprom. No caso, ao esquecer de colocar 0b11010000, fica  o compilador a pensar que é um valor muito grande (onze milhões e dez mil) o que é um long ou double, o que devia gerar um warning (aviso) por parte dele.

Explique melhor o que ocorre, o que devia ocorrer, como está ocorrendo, etc. Também publique seu esquema. Com isso pode-se direcioná-lo melhor ao sucesso...

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Esquema.thumb.png.06f7040b93f36e70416f581ab075244f.pngGente, desculpa a demora pra responder... Parece até que é desinteresse meu em resolver o problema, mas é que muita coisa pra fazer. Eu já até olhei o programa procurando por erros mas não consigo encontrar... Já olhei diversas vezes e realmente não sei por que motivo quando vai ler a eeprom externa, só lê 0xFF

adicionado 1 minuto depois

Caso vocês queiram, posso disponibilizar os arquivos pra ver diretamente no mikroc e protheus. Mais uma vez agradeço pela atenção!

adicionado 7 minutos depois

Veja, o que quero fazer é escrever algumas variáveis na eeprom externa, Isadora. Eu mando o pic gravar e ele assim o faz sem nenhum erro(inclusive no i2c debugger do protheus dá tudo certinho). Mas quando mando o pic ler essas informações gravadas, o que é lido é 0xff. Já pesquisei na internet pra ver se era as variáveis que estavam erradas(acredito que estejam certas), já pesquisei pra ver se era algum erro de escrita, enfim... Eu estou sem munições pra atirar mais :(

adicionado 13 minutos depois

VTRX, eu nunca usei esses microcontroladores que tu falou. Vejam, isso que estou fazendo é um projeto de iniciação científica. O projeto em sí será um pluviômetro que estou montando. O pic ficará recolhendo dados de quanto choveu de meia em meia hora( no programa está menos tempo pois estou testando as funções, e se colocasse meia hora demoraria demais pra ver o que está acontecendo) e salvando na eeprom externa. Quando a eeprom estiver ficando cheia, eu irei com o computador e recolherei os dados com o pc( via rs232, que ainda irei implementar). Basicamente isso...

Link para o comentário
Compartilhar em outros sites

@Mateus Araquam ,

 

Já pensou em usar um módulo tipo ESP8266 para isso ? ele já tem o WiFi embutido nele, tem um microprocessador bem rápido, uma Ram bem grande ( nem precisa de eeprom para armazenar as medidas ) e se quiser armazenar em eeprom tem muiiiito espaço também !

 

Ah, pode ser programado pela linguagem do Arduino mediante acrescimo de umas bibliotecas !

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Publique o fonte de novo.

11 horas atrás, Mateus Araquam disse:

ver se era as variáveis que estavam erradas

Certeza que corrigiu o lande do I2C1_Wr(...)? No proteus, o conteúdo da eeprom está correto? O endereço físico está correto? Gravou direito? Sò não consegue ler?  Viu se o mikcoc tem exemplos prontos? Já viu algum exemplo na net? Viu i d.s. e seguiu os algoritimos do fabricante da eeprom?

Vais perceber que escrever e ler uma eeprom i2c é bem simples. De fato, podes usar também um sdcard que tem mais espaço e o preço se aproxima de uma eeprom i2c. A vantagem é que nem precisaria de rs232: basta tirar o cartão. Sdcard usa se comunicar por SPI que também é bem simples: qualquer mc até um pic10f consegue falar com ele. Mas a mais legal mesmo é a ideia do Paulão @aphawk : wifi ... uai... fai!! :P

Link para o comentário
Compartilhar em outros sites

Certeza que sim! Tudo conferido, revisto, relido... Tô dizendo, eu não sei o que fazer mais. Quanto as cartão SD, esse seria o meu proximo passo. Gente de qualquer forma agradeço a todos pela a ajuda! Vou conferir novamente e ver se encontro o erro. Obrigado! E não utilizo outros mc porque o projeto precisa ser usado esse(como falei, sou aluno de iniciação científica e no projeto precisa ser usado esse mc).

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...