RTC, I2C e EEPROM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

RTC, I2C e EEPROM

Mensagempor gilliard » 23 Nov 2009 19:49

:D Bom, vamos a um novo desafio !!!! :D

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.

:arrow: Exemplo:

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 ?!?!?

:arrow: Meu programa do relógio.


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 !!!! :arrow:
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor fabim » 23 Nov 2009 20:11

meo, vou fazer de conta que não li isto, nem tanto a aplicação....

Bom, quando acabar a energia da rede, tu quer guardar o horario na eeprom ?

affemaria, PIPPOT
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 23 Nov 2009 20:47

:D

Esta duplicado remova abaixo.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 23 Nov 2009 20:55

Algum problema fabim ?!?!? Não entendi !!!!

É uma experiência, não entendi sua irônia cara !!!!

E queria aproveitar, e pedir para o administrador remover o post duplicado, desculpe cara !!!!
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 23 Nov 2009 22:20

Clicka em X canto superior direito mas,

antes que um incauto responda aí já era .

Não va perder a hora - :D :D
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor gilliard » 23 Nov 2009 22:33

Q ???
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor Djalma Toledo Rodrigues » 23 Nov 2009 22:39

Abra a MSG

no canto superior direito tem um X

X de fechar , anular

Esta assim botões : quote edit.. X
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Jozias del Rios » 23 Nov 2009 23:07

Quer que a gente desenhe? :x
Os vencedores são aqueles que sabem o que fazer se perderem.
Os perdedores são aqueles que não sabem o que fazer se ganharem.
Avatar do usuário
Jozias del Rios
Byte
 
Mensagens: 279
Registrado em: 31 Out 2009 03:36
Localização: SJCampos-SP

Mensagempor msamsoniuk » 23 Nov 2009 23:30

eh que se vc ficar 1h sem luz, o relogio vai voltar 1h atrasado! daih meio que nao adianta salvar na eeprom hehehe :)

uma solucao mais inteligente: separe a alimentacao do mcu e dos outros perifericos de modo que, qdo a alimentacao principal for cortada, o mcu principal continue funcionando com uma pequena bateria ou pilhas. assim o mcu vai continuar contando a hora normalmente, apenas nao vai exibir no lcd... quando a luz voltar, o relogio vai mostrar exatamente a hora que deveria. para aumentar a durabilidade o ideal eh vc setar um timer e colocar o mcu inteiro para dormir, acordando ele periodicamente pelo timer apenas para atualizar o contador de horas. vc pode testar se a alimentacao principal esta ou nao presente, assim nao perde nem tempo atualizando o lcd e economiza mais ainda.

outra opcao eh vc comprar um chip rtc com bateria integrada e interface spi, assim nao precisa desenvolver quase nada.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor gilliard » 24 Nov 2009 00:50

:D Primeiramente, em nenhum momento eu disse, que eu ia salvar a hora, para não ter que acertar o relógio, disse ?!?!? Bom, creio que não !!!!

Segundo: Quero salvar a hora, com o objetivo de saber a hora que ocorreu tal evento. capiche ?!?!?

Quem será que é mané agora ?!?!?

Ou vocês querem que eu desenhe ?!?!? rrssss

Vocês estão tiram sarro da minha cara, sem me perguntar o objetivo da aplicação !!!! Antes de me zoarem, pergunta antes !!!!

A Boa educação agradece !!!!

Falow.
Editado pela última vez por gilliard em 24 Nov 2009 00:57, em um total de 1 vez.
Avatar do usuário
gilliard
Byte
 
Mensagens: 121
Registrado em: 26 Ago 2008 13:32

Mensagempor vtrx » 24 Nov 2009 07:10

gilliard,eu sei que voce deve ta com uma pressa danada de aprender a programar,pegou um compilador C e procurou por rotinas na net etc,mas voce tem que desenvolver um pouquinho tambem ou não será capaz de desenvolver nada sosinho...
Digo isso pois as rotinas postadas são muito mais complexas que sua pergunta.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor fabim » 24 Nov 2009 07:22

giliard, assim ó.

Existem questões as quais não a necessidade de de escrever um livro para que as pessoas entendam e ofereçam ajuda...
Existem questões as quais exigem um descritivo mais apurado da aplicação, pois caso contrario seram dadas dicas incorretas, e para você até sem nexo.
Porêm para as pessoas, "que não formularam a questão e não estão fazendo o circuito" esta correta a dica, veja o que o tchelo entendeu, foi o mesmo que eu entendi, eis o motivo do sarro.

Por este e outros motivos tens 2 opções.
Se for uma aplicação ultra secreta, e não pode dar mais detalhes como ja aconteceu aqui, vire-se sozinho e não faça perguntas sem nexo.
Se for algo simples para aprendizado e estudo, quando postar a pergunta coloque o que puder de informação para que o pessoal lhe ajude na rotina, circuito, ou seja como um todo.

Não se ofenda com as brincadeiras, caso não tenha percebido o pessoal é muito descontraido e brincalhão, e caso não tenha observado mais ainda, estas brincadeiras são apenas com amigos como você que sempre estão participando, e que os meninos ja pegaram uma certa simpatia.

Eu quando não entendo do assunto, ou acho o assunto chato, ou não vou com a cara do peão, nem entro pra ver o que esta escrito no post do cabra...

Comece a deixar a casa mais legal de participar, faça brincadeiras tambem, e seja irônico de forma construtiva. Isto deixa o ambiente virtual muito legal, e leve.

!!!Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor renatokodaira » 24 Nov 2009 08:12

Gilliard eu faria assim:

Um dos pinos do PIC (com recurso de ativar a interrupçao) ficaria ligado na alimentaçao vinda da rede, de forma que quando acabasse a energia da rede o PIC entrasse na rotina de interrupçao e esta faria o armazenamento do horario do momento da falta de energia na memoria eeprom , mas o PIC continuaria funcionando, alimentado pela bateria.

O que voce escreveu na primeira mensagem já indicava o uso da bateria, portanto dá pra entender e inferir o que voce queria.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor msamsoniuk » 24 Nov 2009 10:51

ueh, se vc nao gostou das respostas, nao deveria ter perguntado! :)

veja que ninguem tem interesse em perguntar como sua aplicacao funciona, muito pelo contrario, o interesse em obter as respostas eh todo seu! entao nao inverta o jogo, quando for perguntar algo, pergunte direito e forneca todas as informacoes que acha q vao precisar, pois ninguem tem bola de cristal para adivinhar o que vc quer :)

gilliard escreveu::D Primeiramente, em nenhum momento eu disse, que eu ia salvar a hora, para não ter que acertar o relógio, disse ?!?!? Bom, creio que não !!!!

Segundo: Quero salvar a hora, com o objetivo de saber a hora que ocorreu tal evento. capiche ?!?!?

Quem será que é mané agora ?!?!?

Ou vocês querem que eu desenhe ?!?!? rrssss

Vocês estão tiram sarro da minha cara, sem me perguntar o objetivo da aplicação !!!! Antes de me zoarem, pergunta antes !!!!

A Boa educação agradece !!!!

Falow.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Alesandro F Zagui » 24 Nov 2009 11:17

Voce não precisa salvar os dados depois que acabar a energia. Cada vez que o seu programa ler o RTC, compare se o valor lido é diferente do valor anterior, se for, salve o novo valor.
Assim quando acabar a energia, você terá na eeprom o valor da ultima vez que salvou a hora.
Alesandro Freire Zagui
Alesandro F Zagui
Byte
 
Mensagens: 154
Registrado em: 12 Mai 2009 11:03
Localização: Campo Mourao, Pr

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x