Boa tarde, gostaria de saber se alguem pode me ajudar, estou precisando montar um projeto de um calendário e relógio com um PCF8563 (real time clock) + pic ( pode ser qualque modelo 16f877, 16f628, 16f84).Obrigado..

Exibições: 988

Responder esta

Respostas a este tópico

Esta ai a baixo o código que estou tentando usar, mas o dia não esta funcionando,o restante esta tudo ok. Alguem poderia me ajudar pra saber pq o dia não esta funcionando?

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB6_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 TRISB6_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
unsigned short segundos, minutos, horas, semana, dia, mes, ano;
unsigned short sgs, mins, hrs, ss, dd, mm, yy;
unsigned short cnt=7;
//Função para converter BCD para string e escrever no LCD
void BcdToStr(unsigned short x, unsigned short y, unsigned short var){
unsigned short var1, var2;
var1 = (var >> 4) + 0x30;
Lcd_Chr(x,y,var1);
var2 = (var & 0x0F) + 0x30;
Lcd_Chr_CP(var2);
}
//função que inicializa a comunicação com o DS1307
void programa_i2c(){
I2C1_Init(100000); //inicializa com frequencia de 100KHz
I2C1_start(); //Envia um sinal de START
}
//função para ajustar o valor
void escrita_i2c(unsigned short registro, unsigned short valor){
i2c1_stop(); //caso o barramento estiver ocupado envia um sinal de STOP
i2c1_start(); // envia um sinal de START
i2c1_wr(0xA2); //endereço do RTC no barramento e fazer a escrita
i2c1_wr(registro); //endereço do registro(segundos=0x00, ...)
i2c1_wr(valor); // valor que você quer escrever
i2c1_stop(); //envia um sinal de STOP
}
//função que faz a leitura dos dados
void leitura_i2c(){
i2c1_start(); // Envia um sinal de START
i2c1_wr(0xA2); //endereço no barramento e indicação de escrita
i2c1_wr(0x02); //endereço inicial
i2c1_Repeated_Start(); //Restart no barramento
i2c1_wr(0xA3); // endereço no barramento e indicação de leitura
segundos = i2c1_rd(1)&0x7F; //lê o 2º endereço e informa que ira continuar a leitura
minutos = i2c1_rd(1)&0x7F; //lê o 3º endereço e informa que ira continuar a leitura
horas = i2c1_rd(1)&0x3F; //lê o 4º endereço e informa que ira continuar a leitura
semana = i2c1_rd(1)&0x07; //lê o 5º endereço e informa que ira continuar a leitura
dia = i2c1_rd(1)&0x3F; //lê o 6º endereço e informa que ira continuar a leitura
mes = i2c1_rd(1)&0x1F; //lê o 7º endereço e informa que ira continuar a leitura
ano = i2c1_rd(0); //lê o 7º endereço e informa que não ira mais ler
i2c1_stop(); // envia um sinal de STOP
}
void encontrar_semana(){
switch(semana){
case 0: Lcd_Out(2,10,"DOMINGO");break;
case 1: Lcd_Out(2,10,"SEGUNDA");break;
case 2: Lcd_Out(2,10," TERCA ");break;
case 3: Lcd_Out(2,10,"QUARTA ");break;
case 4: Lcd_Out(2,10,"QUINTA ");break;
case 5: Lcd_Out(2,10," SEXTA ");break;
case 6: Lcd_Out(2,10,"SABADO ");break;
}
}
//função que escreve no LCD qual ajuste você está fazendo
void funcao(unsigned short num){
lcd_Out(1,10,"ADJ");
switch(num){
case 0: Lcd_Out(1,14,"SEG");break;
case 1: Lcd_Out(1,14,"MIN");break;
case 2: Lcd_Out(1,14,"HRS");break;
case 3: Lcd_Out(1,14,"DIA");break;
case 4: Lcd_Out(1,14,"DATE");break;
case 5: Lcd_Out(1,14,"MES ");break;
case 6: Lcd_Out(1,14,"ANO");break;
case 7: Lcd_Out(1,14,"OFF");break;
}
}
void main(){
bit oldstate;
TRISD = 255;
Lcd_Init(); //inicia LCD
Lcd_Cmd(_LCD_CLEAR); //Limpa LCD
Lcd_cmd(_LCD_CURSOR_OFF); //desliga cursor do LCD
programa_i2c();
funcao(7);
while(1){
BcdToStr(1,1,horas);
Lcd_Out_CP(":");
BcdToStr(1,4,minutos);
Lcd_Out_CP(":");
BcdToStr(1,7,segundos);
BCdToStr(2,1,dia);
Lcd_Out_CP("/");
BCdToStr(2,4,mes);
Lcd_Out_CP("/");
BCdToStr(2,7,ano);
leitura_i2c();
if(!PORTD.F0){
oldstate=1;
}
//para cada vez que pressionar o botao, altera a função de ajuste
if(PORTD.F0 && oldstate) {
cnt++;
if(cnt==8) cnt=0;
funcao(cnt);
oldstate=0;
}
if(cnt==0){
if(PORTD.F1 && !PORTD.F2){
sgs = Bcd2Dec(segundos); //recebe o valor, converte-o
sgs++; // incrementa-o
if(sgs==60) sgs=0;
escrita_i2c(0x02,Dec2Bcd(sgs)); //converte-o e escreve no RTC
}else if(!PORTD.F1 && PORTD.F2){
sgs = Bcd2Dec(segundos);
sgs--;
if(sgs<0 || sgs>59) sgs=59;
escrita_i2c(0x02,Dec2Bcd(sgs));
}
}else if(cnt==1){
if(PORTD.F1 && !PORTD.F2){
mins = Bcd2Dec(minutos);
mins++;
if(mins==60) mins=0;
escrita_i2c(0x03,Dec2Bcd(mins));
}else if(!PORTD.F1 && PORTD.F2){
mins = Bcd2Dec(minutos);
mins--;
if(mins<0 || mins>59) mins=59;
escrita_i2c(0x03,Dec2Bcd(mins));
}
}else if(cnt==2){
if(PORTD.F1 && !PORTD.F2){
hrs = Bcd2Dec(horas);
hrs++;
if(hrs==24) hrs=0;
escrita_i2c(0x04,Dec2Bcd(hrs));
}else if(!PORTD.F1 && PORTD.F2){
hrs = Bcd2Dec(horas);
hrs--;
if(hrs<0 || hrs>23) hrs=23;
escrita_i2c(0x04,Dec2Bcd(hrs));
}
}else if(cnt==3){
if(PORTD.F1 && !PORTD.F2){
ss = Bcd2Dec(semana);
ss++;
if(ss==7) ss=0;
escrita_i2c(0x05,Dec2Bcd(ss));
}else if(!PORTD.F1 && PORTD.F2){
ss = Bcd2Dec(semana);
ss--;
if(ss==0) ss=7;
escrita_i2c(0x05,Dec2Bcd(ss));
}
}else if(cnt==4){
if(PORTD.F1 && !PORTD.F2){
dd = Bcd2Dec(dia);
dd++;
if(dd==31) dd=1;
escrita_i2c(0x06,Dec2Bcd(dd));
}else if(!PORTD.F1 && PORTD.F2){
dd = Bcd2Dec(dia);
dd--;
if(dd<1 || dd>31) dd=31;
escrita_i2c(0x06,Dec2Bcd(dd));
}
}else if(cnt==5){
if(PORTD.F1 && !PORTD.F2){
mm = Bcd2Dec(mes);
mm++;
if(mm==13) mm=1;
escrita_i2c(0x07,Dec2Bcd(mm));
}else if(!PORTD.F1 && PORTD.F2){
mm = Bcd2Dec(mes);
mm--;
if(mm==0) mm=12;
escrita_i2c(0x07,Dec2Bcd(mm));
}
}else if(cnt==6){
if(PORTD.F1 && !PORTD.F2){
yy = Bcd2Dec(ano);
yy++;
if(yy==100) yy=0;
escrita_i2c(0x08,Dec2Bcd(yy));
}else if(!PORTD.F1 && PORTD.F2){
yy = Bcd2Dec(ano);
yy--;
if(yy<0 || yy>99) yy=99;
escrita_i2c(0x08,Dec2Bcd(yy));
}
}
encontrar_semana();
delay_ms(200);
}
}

Willian,

Parece que você inverteu a ordem dos registradores:

dia do mês = é o quinto registrador

dia da semana = é o sexto registrador

Boa noite José, eu até tinha percebido isso mas tentei colocar certo pioro tudo kk, se conseguir me ajudar e fazer rodar certo o programa te agradeço, a principio é só esta parte mesmo que esta errada, ta envertido o dia de semana pelo dia do mes...

Erros encontrado, programa rodando certinho hehe....

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço