

Bom, eu to desenvolvendo um relógio digital, para colocar no meu quarto, e eu tive uma idéia, e queria ver se dá certo.
Eu coloquei no meu esquema eletrico, a fonte para alimentar com 12 volts, e uma bateria, tipow aquelas usadas no computador para alimentar o circuito se acabar a energia, ok
Eu queria que quando houvesse falta de energia, fosse salto a contagem atual do RTC, na EEPROM do microcontrolador.

O RTC ta contando os minutos, 44, 45, 46, 47, 48 PIMBA acabou a energia...
Dai o Microcontrolador pega o 48 e salva na EEPROM ....
Como seria a lógica para isso ?!?!?

- Código: Selecionar todos
//********** Inicio da configuração do LCD 16x4 **********//
void config_lcd(void){
Lcd_custom_Config(&PORTD,7,6,5,4,&PORTE,2,0,1); // Configura portas
Lcd_custom_Cmd(Lcd_Clear); // Limpa o LCD 16x4
Lcd_custom_Cmd(LCD_BLINK_CURSOR_ON); // Apaga o cursor
delay_ms (100); // Duração 100 ms
}
//********** Fim da configuração do LCD 16x4 **********//
//********** Grava os dados do RTC na EEPROM do Microcontrolador **********//
void grava(){
Eeprom_Write(0x32,0x2);
Delay_ms(40);
}
//********** Grava os dados do RTC na EEPROM do Microcontrolador **********//
//********** Inicio das definições globais do programa **********//
unsigned short segundo, minuto, horas, dias_semana, dia, mes, anos;
unsigned short var1, var2;
char *texto;
//********** Fim das definições globais do programa **********//
//********** Inicio da rotina de conversão de dados para BCD **********//
void BCD(unsigned short x, unsigned short y,unsigned short var) {
var1 = (var >> 4) + 0x30; //converte o primeiro nibble em BCD e após isso, em string
LCD_custom_Chr(x,y,var1); //escreve caractere no LCD
var2 = (var & 0x0F) + 0x30; //converte o segundo nibble em BCD e após isso, em string
LCD_custom_Chr_Cp(var2); //escreve caractere no LCD
}
//********** Fim da rotina de conversão de dados para BCD **********//
//********** Inicio da configuração de leitura do DS1307 **********//
void encontra_dia_semana() {
switch (dias_semana) {
case 01: texto = "DOMINGO "; break; //caso dias_semana = 01 então..
case 02: texto = "SEGUNDA "; break; //caso dias_semana = 02 então..
case 03: texto = "TERCA "; break; //caso dias_semana = 03 então..
case 04: texto = "QUARTA "; break; //caso dias_semana = 04 então..
case 05: texto = "QUINTA "; break; //caso dias_semana = 05 então..
case 06: texto = "SEXTA "; break; //caso dias_semana = 06 então..
default: texto = "SABADO "; //se não for nenhum desses então...
}
}
//********** Fim da configuração de leitura do DS1307 **********//
//********** Inicio da configuração de leitura do DS1307 **********//
void leitura_rtc() { //rotina de leitura do DS1307
I2C_Start(); //inicializa comunicação i2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Repeated_Start(); // Issue I2C signal repeated start
I2C_Wr(0xD1); //endereço fixo para a categora do DS1307: 1101000X com o ultimo bit acionado (1) para leitura
segundo = I2C_Rd(1); //lê o primeiro byte segundos e informa que ainda leremos mais dados através do sinalizador (1)
minuto = I2C_Rd(1); //lê o segundo byte minutos e informa que ainda leremos mais dados através do sinalizador (1)
horas = I2C_Rd(1); //lê o terceiro byte horas e encerra as leituras de dados, graças ao sinalizador (0)
dias_semana = I2C_Rd(1);
dia = I2C_Rd(1);
mes = I2C_Rd(1);
anos = I2C_Rd(0);
I2C_Stop(); //finaliza comunicação I2C
}
//********** Fim da configuração de leitura do DS1307 **********//
//********** Inicio da configuração que grava a temporização do DS1307 **********//
void programa_i2c(){
I2C_Init(100000); // iniciliza I2C com frequencia de 100KHz
I2C_Start(); //inicializa a comunicação I2c
I2C_Wr(0xD0); //endereço fixo para a categoria do DS1307: 1101000X, onde x = 0 é para gravação, e X = 1 para leitura.
I2C_Wr(0); //endereço onde iremos começar a programação do relógio, neste caso é o endereço dos segundos.
I2C_Wr(Eeprom_Read(0x32)); //Inicia apartir do segundos gravado em 0x32
I2C_Wr(0x44); //inicializa a contagem apartir de 44 minutos.
I2C_Wr(0x08); //inicializa a contagem dos hora apartir das 08:00hs (formato 24 horas).
I2C_Wr(0x06); //inicializa a contagem da sexta feira da semana
I2C_Wr(0x14); //inicializa a contagem do dia 14 do mes
I2C_Wr(0x10); //inicializa a contagem do mês de setembro
I2C_Wr(0x07); //inicializa a contagem do ano 07.
I2C_Stop(); //condição de finalização da comunicação I2C
}
//********** Fim da configuração que grava a temporização do DS1307 **********//
//********** Inicio da exibição dos dados do DS1307 no LCD **********//
void display_lcd() {
LCD_Custom_Cmd(Lcd_cursor_off); // apaga o cursor do LCD
BCD(1,1,horas); //chama subrotina de conversão da variável horas para BCD
LCD_custom_Chr_Cp(':'); //escreve no display LCD
BCD(1,4,minuto); //chama subrotina de conversão da variável minuto para BCD
LCD_custom_Chr_Cp(':'); //escreve no display LCD
BCD(1,7,segundo); //chama subrotina de conversão da variável segundo para BCD
encontra_dia_semana(); //chama subrotina onde será encontrado o dia da semana
LCD_custom_out(1,10,texto); //escreve no display LCD
BCD(2,1,dia); //chama subrotina de conversão da variável horas para BCD
LCD_custom_Chr_Cp('/'); //escreve no display LCD
BCD(2,4,mes); //chama subrotina de conversão da variável horas para BCD
LCD_custom_out(2,6,"/20"); //escreve no display LCD
BCD(2,9,anos); //chama subrotina de conversão da variável horas para BCD
}
//********** Fim da exibição dos dados do DS1307 no LCD **********//
//********** Inicio do programa principal **********//
void main() {
unsigned char valor;
adcon1 = 0x06; // define pinos AD como I/O de uso geral
trisd = 0; // Define portd como saida
trise = 0; // Define porte como saida
grava();
programa_i2c(); // Inicia a subrotina de leitura do I2C
config_lcd(); // Inicia a configuração do LCD
while(1){ //inicializa loop
display_lcd(); //escreve no display lcd o valor
leitura_rtc(); //efetua leitura de segundo, minuto e horas do DS1307
delay_ms(100); //gera delay de 100 milisegundos
//leitura();
}
}
//********** Fim da programa principal **********//
Mais um desafio rrssss
Falow pessoal, valew !!!!
