Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Mateus Araquam

PIC Problemas para ler informações da eeprom externa

Recommended Posts

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


}
}
}
}
}

 

Editado por DiF
Inserir o código usando o botão CODE <>

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

Editado por DiF
erro de digitação

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o tipo de memória?

Dependendo do tamanho da memória,voce tem que enviar a parte alta do endereço e a baixa.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
22 horas atrás, Mateus Araquam disse:

I2C1_Wr(11010000);

Sutil mas parece que esqueceste o 0b e em mais de uma ocasião. Ou foi falha do  'forum'. Confira por gentileza

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, estou usando uma 24c32a. Ela tem 4096 espaços

adicionado 0 minutos depois

@Isadora Ferraz Acho q foi o forum... no programa tá tudo certinho. :(

adicionado 1 minuto depois

@vtrx E como eu poderia enviar por partes?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu só usei o C18 e ASM para grvar numa eeprom destas.

Só vou estar em casa á noite,então procuro o código e posto o algorítmico,mas basicamente tem que enviar uma nova sequencia no inicio da rotina.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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...

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok. boa caça...  depois dela se achar que deve...

Em 31/01/2018 às 22:07, Mateus Araquam disse:

disponibilizar os arquivos pra ver diretamente no mikroc e protheus

disponiblize...

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






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

×