27 de mar. de 2014

Escrevendo e Lendo a EEprom do PIC16f628 em 8bits.

 Escrevendo e Lendo a EEprom .

Olá pessoal.
Vou postar aqui para vocês de como se  ler e escrever na EEprom  do  microcontrolador PIC16F628A.



Antes de começar a explicar, já vou  dizendo que sou ainda aprendiz de programação em linguagem C,e que estudo por contra própria lendo apostilas e exemplos pela Net.
O compilador ao qual eu melhor me adaptei foi o MIKROC FOR PIC V8.2, é verdade que já tem uma nova versão deste compilador.

Aqui abaixo vou colocar alguns exemplos que aprendi,e que poderá servir de base ou ate mesmo ajudar
a quem também esta  aprendendo ou servir de ideia para um projeto.
Este foi o meu primeiro código escrito para acessar a EEprom do PIC16F628A  me baseando no exemplo do  Data Sheet e algumas informações da Net em linguagem C já que de assembler eu não entendo muita coisa.


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   PRIMEIRO EXEMPLO   EEPROM  PIC16F628A  em 8BITS
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  EEPROM Como Escrever e ler a memória do microcontrolador.
//
//  Configuração:
//  MCU:            PIC16F628A
//  Oscillator:     4.MHz   Interno
//  Ext. Modules:   LCD 2x16
//  SW:             MikroC v8.1

//----------------------- Declarações de Variaveis -----------------------------

    unsigned char valor,dados;
    void Escreve_EEprom(unsigned char Endereco, unsigned char Dados);
    unsigned char Ler_EEPROM(unsigned char Endereco);

//----------------------------- Main Comando -----------------------------------
    void  main(){
    CMCON = 7;  // comparador off, digital I/O
    TRISB = 0;
    PORTB = 0;
    TRISA = 0;
    PORTA = 0;
//------------------------  Configurações do LCD -------------------------------
//  Lcd_Custom_Config(&PORTB,D7,D6,D5,D4 ,&PORTA,RS,RW,E);

    Lcd_Custom_Config(&PORTB,5,4,6,7 ,&PORTA ,7,4,6 );  // Initialize Lcd
    Lcd_Custom_Cmd(Lcd_CURSOR_OFF);   // Desliga o cursor do LCD
    Lcd_Custom_Out(1,2, "ESCREV NA EEPROM");
    Lcd_Custom_Out(2,2, "Info-Tecniko");
    Delay_ms(1800);       //Tempo para visualizar no LCD
    Lcd_Custom_Cmd(Lcd_Clear);            // Limpa o LCD
//---------------------- Execução do Programa ----------------------------------
    dados=245;  // Aqui Voce Escreve o Valor de 0 a 255

    Escreve_EEprom(0x12,dados); // Escreve Dado 245 Na EEPROM no Endereço 0x12
     valor = Ler_EEPROM(0x12);   // Le a EEPROM Endereço 0x12 na Variavel valor

    WordToStr(valor,str);
    Lcd_Custom_Out(2,4,str);    // LCD mostra valor de 0 a 255

    } //Fim Void Man
//--------------
// Esta Função Le o Dado Escrito No Endereço Interno da EEPROM do PIC

//    void Ler_EEPROM(unsigned char Endereco){
    unsigned char Ler_EEPROM(unsigned char Endereco){
    char armazena_dados;
    EEADR = Endereco;
    EECON1.RD = 1; // le a EEPROM
    armazena_dados = EEDATA; // EEDATA obtem os dados armazenados
    return armazena_dados;
    }  // Fim da Função Ler
//---------------
//Esta função escreve dados e Endereco no interior da EEPROM do PIC MCU
    void Escreve_EEprom (unsigned char Endereco,unsigned char Dados){
   // Carrega endereço de escrita //
    EEADR = Endereco;
   // carrega o dado a ser ecrito //
    EEDATA = Dados;
   // sets EECON bits operação de escrita //
    EECON1.WREN = 1;
   // desabilita as Interrupções //
    INTCON.GIE = 0;
   // é necessário esta sequencia para gravar //
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1.WR = 1; // Inicia a escrita //
   // Habilita as interrupções //
    INTCON.GIE = 1;

    while (PIR1.EEIF==0){//Espera a operação da escrita ser completada
    delay_ms(10);//
    }

    // Limpa PIR1.EEIF //
    PIR1.EEIF = 0;
    // limpa a interrupção do flag //
    INTCON.T0IF = 0;
    // Disabilita a escrita //
    EECON1.WREN = 0;
    } // Fim da Função Escrever //
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 Estudando um pouquinho mais sobre o compilador e olhando alguns exemplo contido nele descobri uma outra forma bem mais fácil de executar este programa acima com funções já prontas do próprio compilador.


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//   SEGUNDO EXEMPLO   EEPROM  PIC16F628A  em 8BITS
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  EEPROM Como Escrever e ler a memória do microcontrolador.
//
//  Configuração:
//  MCU:            PIC16F628A
//  Oscillator:     4.MHz   Interno
//  Ext. Modules:   LCD 2x16
//  SW:             MikroC v8.1

//----------------------- Declarações de Variaveis -----------------------------

    unsigned int valor,dados,EEpromL,EEpromWL;
//---------------------- Conversor de string para o LCD -----------------------
    unsigned char str[13];
//----------------------  Comando Para EEprom  --------------------------------
    void EEprom8_Read(void){
    valor= EEpromL;
    EEpromL = EEPROM_Read(0x01); //Lê o endereço 0x01 e atribuir valor para EEpromL
     }

    void EEprom8_Write(void){
    EEpromWL=dados;
    EEPROM_Write(0x01,EEpromWL ); //Escrever na EEPROM interna no endereço 0x01
    delay_ms(20);
    }
//----------------------------- Main Comando -----------------------------------
    void  main(){
    CMCON = 7;  // comparador off, digital I/O
    TRISB = 0;
    PORTB = 0;
    TRISA = 0;
    PORTA = 0;
//------------------------  Configurações do LCD -------------------------------
//  Lcd_Custom_Config(&PORTB,D7,D6,D5,D4 ,&PORTA,RS,RW,E);

    Lcd_Custom_Config(&PORTB,5,4,6,7 ,&PORTA ,7,4,6 );  // Initialize Lcd
    Lcd_Custom_Cmd(Lcd_CURSOR_OFF);       // Desliga o cursor do LCD
    Lcd_Custom_Out(1,1, "ESCREV NA EEPROM");
    Lcd_Custom_Out(2,2, "Info-Tecniko");
    Delay_ms(1800);      // Tempo para visualizar no LCD
    Lcd_Custom_Cmd(Lcd_Clear);            // Limpa o LCD
    Lcd_Custom_Out(1,2, "Info-Tecniko");
//---------------------- Execução do Programa ----------------------------------
    while(1){
    dados=245;  // Aqui Voce Escreve o Valor de 0 a 255

    EEprom8_Read();

    EEprom8_Write();

    WordToStr(valor,str);
    Lcd_Custom_Out(2,4,str);    // LCD mostra valor de 0 a 255
    }
    } //Fim Void Man
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Como podem ver este código ficou bem menor e funciona igual.
Eu não sou um expert em programação ainda, mas não achei nada igual a estes exemplos que acabei de escrever espero que sirva para ajudar. 

Leia também  EEprom do PIC16f628 em  16bits.

3 comentários: