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.
Parabens
ResponderExcluirParabens
ResponderExcluirPq o meu quando eu salvo um valor e quando reinicio o microcontrolador ele lê o valor 255? E
ResponderExcluir