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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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

    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

    ×