Ir ao conteúdo

Dificuldade com código de hora,data,temperatura Pic 16f877a.


Kibbi

Posts recomendados

Postado

Olá amigos ! Venho até vocês pois não estou conseguindo fazer um circuito que achei na net de um LCD que mostre a hora, data e duas temperaturas com um pic 16f877a. Até consegui compilar com MikroC, consertando alguns erros que apareciam com o pouquissimo conhecimento que tenho. Só que só aparece as temperaturas, a hora e data não. Se alguem me ajudar eu agradeço. Obrigado a todos.

O código é esse :

//DS1307 RTC Interfacing with PIC16F877A
sbit I2C1_Scl at RC3_bit;
sbit I2C1_Sda at RC4_bit;
sbit I2C1_Scl_Direction at TRISC3_bit;
sbit I2C1_Sda_Direction at TRISC4_bit;
// End Software I2C connections// LCD module connections
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// botões de acerto de hora
#define BUTTON_SET (PORTD.F0 == 0)
#define BUTTON_ADVANCE (PORTD.F1 == 0)
#define BUTTON_NEXT (PORTD.F2 == 0)//define functions
unsigned short read_ds1307(unsigned short address);
void write_ds1307(unsigned short address,unsigned short w_data);
void print_dia(unsigned short dia);
void rodizio(unsigned short dia,unsigned short hora_atual); //Checa dia e horario de rodizio e pisca o led DO DS1307
unsigned char BCD2UpperCh(unsigned char bcd);
unsigned char BCD2LowerCh(unsigned char bcd);
void acerta_relogio(unsigned short xchart, unsigned short xtipo);
void Display_Temperature(unsigned int temp2write, unsigned int linha);
//end define functionsunsigned short sec;
unsigned short minute;
unsigned short hour;
unsigned short day;
unsigned short date;
unsigned short month;
unsigned short year;
unsigned char time[9];
unsigned char ddate[9];
unsigned char *ddia; //dia da semana
//variaveis usadas no acerto do relogio
unsigned char setchar[2]; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio
unsigned short xchar; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio
unsigned short charint; //dois digitos do valor (hora, mes, dia..) para a funcao de acerto do rlogio
unsigned short xlimite; //limite para acerto do relogio - ex: hora 23, minuto 59, dia 31.</code>

//variaveis do termometro
char *tempC = "000.0";
unsigned int tempinC;
unsigned long temp_value;

void main(){

I2C1_Init(32768); //Inicia o DS1307 I2C e define a frequencia do xtal - xtal do tipo de relogio

TRISB = 0; // PORTB saida do display lcd
TRISC = 0xFF; //PORTC as input from DS1307
TRISD = 0xFF; //PORTD input botões de acerto de hora

//termometro porta analogicas
ADCON1 = 0b10000001; // 1- opcao osc, 0- left justif, 00-void, 0001 - vref+=an3 vref-=vss todas as portas an = A analogicasA
TRISA = 0b00110011; //ra0/an0 e ra1/an1 inputs lm35
CMCON = 0x07; // Disable Comparators

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD display
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off

//Set Initial Time - remover quando ligar a bateria
/*
write_ds1307(0,0x80); //write sec stop oscilator
write_ds1307(1,0x38); //write min
write_ds1307(2,Dec2Bcd(21)); //write hour
write_ds1307(3,0x04); //write day of week 2:Monday
write_ds1307(4,0x17); // write day
write_ds1307(5,0x09); // write month
write_ds1307(6,0x11); // write year 09 = 2009
write_ds1307(7,0x00); //SQWE output at 1 Hz pino 7 do ds1307

*/
//================= loop principal - inicio =================//
//================= loop principal - inicio =================//
//================= loop principal - inicio =================//

while(1)
{

//comandos do termometro

Lcd_Chr(1,15,223); //imprime o grau celcius e o C
Lcd_Chr(1,16,'C');
Lcd_Chr(2,15,223);
Lcd_Chr(2,16,'C');

temp_value = ADC_Read(0); // le o sensor numero 1
temp_value = temp_value*1077; //1168;
tempinC = temp_value/1000;
tempinC = tempinC*10;
Display_Temperature(tempinC,1);
Delay_ms(50);

temp_value = ADC_Read(1); //le o sensor numero 2
temp_value = temp_value*1077;//1168;
tempinC = temp_value/1000;
tempinC = tempinC*10;
Display_Temperature(tempinC,2);
Delay_ms(50);

sec=read_ds1307(0); // read second
minute=read_ds1307(1); // read minute
hour=read_ds1307(2); // read hour
day=read_ds1307(3); // read day
date=read_ds1307(4); // read date
month=read_ds1307(5); // read month
year=read_ds1307(6); // read year

time[0] = BCD2UpperCh(hour);
time[1] = BCD2LowerCh(hour);
time[2] = ':';
time[3] = BCD2UpperCh(minute);
time[4] = BCD2LowerCh(minute);
time[5] = ':';
time[6] = BCD2UpperCh(sec);
time[7] = BCD2LowerCh(sec);
time[8] = '';

ddate[0] = BCD2UpperCh(date);
ddate[1] = BCD2LowerCh(date);
ddate[2] ='.';
ddate[3] = BCD2UpperCh(month);
ddate[4] = BCD2LowerCh(month);
ddate[5] ='.';
ddate[6] = BCD2UpperCh(year);
ddate[7] = BCD2LowerCh(year);
ddate[8] = '';

print_dia(day); //imprime dia da semana

rodizio(day,hour); //checa rodizio e se estiver no dia e horario, pisca o led do ds1307

Lcd_Out(1,1,time);
Lcd_Out(2,1,ddate);

if(BUTTON_SET) //****************** acerta relogio
{

VDelay_ms(15) ;
while(BUTTON_SET) ; // debounce button
VDelay_ms(15) ;

write_ds1307(0,0x80); //write sec stop oscilator
acerta_relogio(hour, 1);
write_ds1307(2,Dec2Bcd(xchar)); //write hour
acerta_relogio(minute, 2);
write_ds1307(1,Dec2Bcd(xchar)); //write min
acerta_relogio(date, 3);
write_ds1307(4,Dec2Bcd(xchar)); //write dia
acerta_relogio(month, 4);
write_ds1307(5,Dec2Bcd(xchar)); //write mes
acerta_relogio(year, 5);
write_ds1307(6,Dec2Bcd(xchar)); //write ano
acerta_relogio(day, 6);
write_ds1307(3,Dec2Bcd(xchar)); //write dia da semana, seg, ter

write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator

}

Delay_ms(50);
}
}
//================= loop principal - final =================//
//================= loop principal - final =================//
//================= loop principal - final =================//

unsigned short read_ds1307(unsigned short address)
{
I2C1_Start();
I2C1_Wr(0xd0); //address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C1_Wr(address);
I2C1_Repeated_Start();
I2C1_Wr(0xd1);
I2C1_Rd(0);
I2C1_stop();
}

void write_ds1307(unsigned short address,unsigned short w_data)
{
I2C1_Start(); // issue I2C start signal
//address 0x68 followed by direction bit (0 for write, 1 for read) 0x68 followed by 0 --> 0xD0
I2C1_Wr(0xD0); // send byte via I2C (device address + W)
I2C1_Wr(address); // send byte (address of DS1307 location)
I2C1_Wr(w_data); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
}

void print_dia(unsigned short dia) //Imprime o dia da semana
{
switch (dia) {
case 1 : ddia ="Dom"; break;
case 2 : ddia ="Seg"; break;
case 3 : ddia ="Ter"; break;
case 4 : ddia ="Qua"; break;
case 5 : ddia ="Qui"; break;
case 6 : ddia ="Sex"; break;
case 7 : ddia ="Sab"; break;
}
Lcd_Out(1,9,ddia);
}

void rodizio(unsigned short dia, unsigned short hora_atual) //Checa dia e horario de rodizio e acende o led caso esteja no rodizio
{
if (dia == 2) //definindo rodizio para 4a feira
{
switch (hour)
{
case 7 : write_ds1307(7,0x10); break; //acende o led para horas do rodizio
case 8 : write_ds1307(7,0x10); break;
case 9 : write_ds1307(7,0x10); break;
case 0x17 : write_ds1307(7,0x10); break;
case 0x18 : write_ds1307(7,0x10); break;
case 0x19 : write_ds1307(7,0x10); break;
default: write_ds1307(7,0x00);
}
}
}

unsigned char BCD2UpperCh(unsigned char bcd)
{
return ((bcd >> 4) + '0');
}

unsigned char BCD2LowerCh(unsigned char bcd)
{
return ((bcd & 0x0F) + '0');
}

// ============= acerta hora ==============//

void acerta_relogio (unsigned short xchart, unsigned short xtipo)
{
Lcd_Cmd(_LCD_CLEAR);
// xchar=Bcd2Dec(xchart); //converte hexadecimal para decimal para mostrar no display
xchar=0;

for(;
{
if (xtipo==1) {Lcd_Chr(1,1,'H');Lcd_Chr(1,2,'o');Lcd_Chr(1,3,'r');Lcd_Chr(1,4,'a');Lcd_Chr(1,5,':');xlimite=23;}
if (xtipo==2) {Lcd_Chr(1,1,'M');Lcd_Chr(1,2,'i');Lcd_Chr(1,3,'n');Lcd_Chr(1,4,':');xlimite=59;}
if (xtipo==3) {Lcd_Chr(1,1,'D');Lcd_Chr(1,2,'i');Lcd_Chr(1,3,'a');Lcd_Chr(1,4,':');xlimite=31;}
if (xtipo==4) {Lcd_Chr(1,1,'M');Lcd_Chr(1,2,'e');Lcd_Chr(1,3,'s');Lcd_Chr(1,4,':');xlimite=12;}
if (xtipo==5) {Lcd_Chr(1,1,'A');Lcd_Chr(1,2,'n');Lcd_Chr(1,3,'o');Lcd_Chr(1,4,':');xlimite=15;}
if (xtipo==6) {Lcd_Chr(1,1,'S');Lcd_Chr(1,2,'e');Lcd_Chr(1,3,'m');Lcd_Chr(1,4,'a');Lcd_Chr(1,5,':');xlimite=7;}
//IntToStr(xchar, setchar);
//Lcd_Out(1,6,setchar);
setchar[0] = (xchar)%10 + 48;
setchar[1] = (xchar/10)%10 + 48;
Lcd_Chr(1,9,setchar[1]);
Lcd_Chr(1,10,setchar[0]);
if(BUTTON_ADVANCE) // advance hour ?
{
//VDelay_ms(15) ; // debounce button
//while(BUTTON_ADVANCE) ;
VDelay_ms(150) ;

xchar++;
if (xchar>xlimite) xchar=0;
}

if(BUTTON_NEXT) // valid ?
{
//VDelay_ms(15) ;
//while(BUTTON_NEXT) ; // debounce button
VDelay_ms(150) ;
break ; // exit loop
}
}
}

void Display_Temperature(unsigned int temp2write, unsigned int linha) {
if (temp2write/10000)// convert Temp to characters// 48 is the decimal character code value for displaying 0 on LCD
tempC[0] = temp2write/10000 + 48;
else tempC[0] = ' ';
tempC[1] = (temp2write/1000)%10 + 48; // Extract tens digit
tempC[2] = (temp2write/100)%10 + 48; // Extract ones digit
tempC[4] = (temp2write/10)%10 + 48; // Extract tens digit
Lcd_Chr(linha,13,tempC[1]); // print temperature on LCD
Lcd_Chr(linha,14,tempC[2]);
}

post-989564-13884964116084_thumb.jpg

Postado

Cara, se você quiser em CCS, pesquisa que no forum tem muita coisa de relógio + temperatura + DS1307 + LCD.

Eu mesmo tenho alguns códigos prontos.

Já pra MikroC tem pouca coisa.

Postado

Olá ! É que o pouco conhecimento que possuo com pic, aprendi na internet, e me adaptei melhor com o MikroC, já tentei compilar com o CCS e não consegui. Talvez por falta de conhecimento mesmo. Se tiver algo que possa me ajudar em CCS eu agradeço. É justamente deste site http://antoniopolo.wordpress.com/201...80%93-2x-lm35/ que peguei este projeto, mas não consigo fazer funcionar. Muito obrigado a todos.

  • Coordenador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

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!