Ir ao conteúdo

Como gravar dados na eeprom do pic quando a energia é desligada?


FernandoRodrigue

Posts recomendados

Postado

Olá, programo microcontroladores pic com liguagem C no CCS, a algum tempo atrás fui em uma palestra sobre esses microcontroladores, e o palestrante comentou que o pic16f877 e alguns outros tem uma função para que você possa gravar uma informação na memoria interna dele caso haja o desligamento da tensão, ou seja, se acabar a luz, o pic ainda concegue fazer uma ultima rotina pra gravar uma informação importante, por exemplo uma contagem de produtos, para que quando volte a energia ele possa continuar de onde parou, eu sei que eu poderia fazer com que o pic ficasse quardando essa informação na memoria de minutos em minutos, ou algo assim, mas como todos sabem a memoria tem um limite de quantidades gravação, que se eu nao me engano é algo em torno de 100 mil vezes, então se parar pra pensar ao longo de alguns anos gravando a informação, a memoria vai "gastar", alguem sabe me dizer como uso essa função do pic? Obrigado

Postado


sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
sbit SelectButton at RA4_bit;
long leitura_ad = 0, aux = 0;
char texto[5] = "00.0";
char valor[5] = "00.0";
long setpoint;
char teste = 1;
unsigned int select, update_select;

void debounce_delay(void){
Delay_ms(333);
}

void atualiza_lcd(){ // funçao atualiza lcd
Lcd_Init();

delay_ms(20);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);


}

void escreve_eeprom() {
EEPROM_Write (0,setpoint);
EEPROM_Write (1,setpoint>>8); // quebra var.teste de 16bit em dois de 8

delay_ms(40);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_out(1,4, "SUCESSSO");
Lcd_out(2,1, "AJUSTE GRAVADO");
delay_ms(800);
atualiza_lcd();

}

void main() {
trisa.ra0 = 1;
trisa.ra1= 1; //configrada como entrada
trisa.ra2= 1; //configrada como entrada

PORTC = 0;
TRISB = 3; //'configura todos os pinos do portd como saída
TRISD = 3; //'configura todos os pinos do portd como saída
TRISE = 0; //'configura todos os pinos do porte como saída
TRISC = 0; //'configura todos os pinos do portd como saída

ADCON1 = 0b00001110; //'configura AN0,AN1,AN3 COMO analógico e os demais pinos como digital

Lcd_Init();

Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,13, texto);
Lcd_Out(2,13, valor);
atualiza_lcd();

setpoint = eeprom_Read(1);setpoint<<=8;
setpoint |= eeprom_Read(0);

select = 0;
update_select = 1;

do {
if(!SelectButton){
debounce_delay();
update_select = 1;
switch (select) {
case 0 : select=1;
break;
case 1 : select=2;
break;
case 2: select=3;
break;
case 3: select=4;
break;
case 4: select=0;
break;
} //case end
}
if(select == 0){ // Diode Tester
if(update_select){
Lcd_cmd(_LCD_CLEAR);


update_select=0;
}
////////////////////********/////
leitura_ad = adc_read(0);
aux = leitura_ad;

leitura_ad = leitura_ad*5000/1023;
texto[0] = (leitura_AD%1000)/100 + 48;
texto[1] = (((leitura_AD%1000)%100)/10) + 48;
texto[2] = '.';
texto[3] = (((leitura_AD%1000)%100)%10) + 48;
Lcd_Out(1,13, texto);

if (Button(&PORTD, 0, 20 ,0)){ //verifica tecla1.
setpoint++;
}

if (Button(&PORTD, 1, 20, 0)){ //verifica se a tecla2.
setpoint--;
}
if (PORTA.RA3 == 0){ //se portb.rb0 estiver em nivel baixo chama funçao
escreve_eeprom(); //chama a funçao escreve na eeprom
}
if (PORTA.RA5 == 0 && teste ==1 ){
portc.rc7 = ~portc.rc7;
teste = 0; }
delay_ms(20);
if (PORTA.RA5 == 1 && teste == 0 ){
teste = 1;
delay_ms(20);
}
if(portc.rc7==1){
Lcd_out(2,10, "TL");
} else Lcd_out(2,10, "TD");

valor[0] = (setpoint%100)/10 + 48;
valor[1] = ((setpoint%100)%10) + 48;
valor[2] = '.';
valor[3] = '0';
Lcd_out(2,13, valor);
Lcd_Out(1,1,"TEMPERATURA");
Lcd_Out(2,1,"AJUSTE");
if (aux/2 <= setpoint){
portc.rc0 = 0;
}
else portc.rc0 = 1;
}//FIM DO MENU 0
if(select == 1){ // Diode Tester
if(update_select){

Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"VOLTIMETRO");

update_select=0;
}
///AQUI VAI OS TEXTO
} // End if (detail_select)

if(select == 2){ // Diode Tester
if(update_select){
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"AMPERIMETRO");

update_select=0;
}
///AQUI VAI OS TEXTO
} // End if (detail_select)
if(select == 3){ // Diode Tester
if(update_select){
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"FREQUENCIMETRO");

update_select=0;
}
///AQUI VAI OS TEXTO
} ///FIM DO MENU
if(select == 4){ // Diode Tester
if(update_select){
Lcd_cmd(_LCD_CLEAR);
Lcd_Out(1,1,"CONTA GIRO");

update_select=0;
}
///AQUI VAI OS TEXTO
} ///FIM DO MENU
} while(1);
}
// LCD module connections

Postado

Olá albertoice, estava analizando o codigo, a parte que faz o que eu quero é essa:

if (PORTA.RA3 == 0){ //se portb.rb0 estiver em nivel baixo chama funçao

escreve_eeprom(); //chama a funçao escreve na eeprom

}

que dizer q naverdade ele só verifica se a porta ta setada como zero, que seria uma tensão baixa, e dai grava a informação na eeprom?

que simples, e eu quebrando a cabeça aqui, hahaha

Postado
que dizer q naverdade ele só verifica se a porta ta setada como zero, que seria uma tensão baixa, e dai grava a informação na eeprom?

que simples, e eu quebrando a cabeça aqui, hahaha

hamm :huh::tantan:

Analisando a rotina "escreve_eeprom(); " vi que dura um pouco mais do que 1 segundo. Será que o PIC por sí só aguenta mais de 1 segundo ligado sem fonte? Talves alguns condensadores ajudariam, mas atrapalhariam pelo mesmo motivo.

  • 2 semanas depois...
Postado
Foi ja dado um circuito ,foi ate postado pelo felipao,q verifica a tensão e quando ela cai gera um sinal no pino do pic q começa gravar as informaçoes...

oi amigao você teria o codigo fonte em mikroc de conta giro do cooler para o pc

em display lcd

  • 5 meses depois...
Postado
foi ja dado um circuito ,foi ate postado pelo felipao,q verifica a tensão e quando ela cai gera um sinal no pino do pic q começa gravar as informaçoes...

oi amigo estou interessado no multiteste com pic16f877 você teria algum com codigo fonte

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!