erro no dia da semana do DS1307

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

erro no dia da semana do DS1307

Mensagempor Alvarosan » 27 Jan 2009 18:47

olá pessoal, estou com um problema um pouco estranho, estou usando o ds1307 para mostra a data e hora num lcd, até 31/12/2008, funcionou beleza, pra minha supresa na virada do ano a variavel "dia da semana" não aparece mais no display, fazendo varios testes percebi que isso acontece somente nos anos impares, ou seja, 2005, 2007,2009, etc, alguém já viu esse tipo de problema?

abs...
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Mensagempor rudsomlima » 27 Jan 2009 22:03

Veja seu código. Testei aqui e funcionou normal.
rudsomlima
Bit
 
Mensagens: 37
Registrado em: 26 Nov 2006 21:00

Mensagempor Alvarosan » 27 Jan 2009 22:25

Olá Rudsom, segue abaixo o codigo, nao consegui ver nada de errado, vc pode dar uma olhada...

#include <16f877A.h>
#device *=16
#device adc=10
#fuses NOWDT,HS, NOPROTECT, BROWNOUT,NOLVP,PUT
#use delay(clock=4000000,RESTART_WDT)

#include <ds1307.c>
#include <lcd.c>

// configura os tris

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#byte porte = 0x09

BYTE sec;
BYTE min;
BYTE hrs;
BYTE day;
BYTE month;
BYTE yr;
BYTE dow;

char semana[7][8] = "Domingo","Segunda",
"Terca ","Quarta ",
"Quinta ","Sexta ",
"Sabado ";

int1 le_clock = 0;
int1 le_temperatura = 0;
int1 le_umidade = 0;

float conversao = 0; // armazena o resultado da conversão AD
float media = 0;
int16 i = 0;
static int32 conta;
int16 conta_pulso_rtc = 0;

#int_ext // int externa para rb0 pedal da seladora
void trata_Rb0(void)
{
le_clock = 1;
}

#int_timer0 // int do timer 0 que controla o clock
void trata_t0(void)
{
static boolean led; // variavel para piscar o led clock
static int conta; //contador de pulso para o clock de ~1 segundo
set_timer0(131-get_timer0()); //reinicia o timer em 131 menos a contagem q passou
conta++;
if (conta == 125) le_temperatura = 1;// se ocorreu 125 interrupções 1 seg
if (conta == 250)
{
le_umidade = 1;
conta = 0;
led = !led; // inverte o led
output_bit (pin_d3,led);
}
}
void mostra_clock()
{
ds1307_get_date(day,month,yr,dow);
if (dow == 7) dow = 0;

ds1307_get_time(hrs,min,sec);
lcd_gotoxy(2,1);
printf(lcd_putc,"\%02d/\%02d/\%02d - %s",day,month,yr,semana[dow]);
lcd_gotoxy(7,2);
printf(lcd_putc,"\%02d:\%02d:\%02d", hrs,min,sec);
le_clock = 0;
}

void mostra_temperatura()
{
set_adc_channel (0);
delay_us(50);
for(i=10;i>0;i--)
{
conversao = read_adc(); // inicia conversão AD
delay_us(50);
media = media+conversao;
}
conversao = (((media/10) * 49)/100); // faz regra de 3 para converter o valor,
lcd_gotoxy(22,1);
printf(lcd_putc,"Temp: %2.1fßC", (conversao+1.4));
media = 0;
le_temperatura = 0 ;
}

void mostra_umidade()
{
set_adc_channel (1);
delay_us(50);
for(i=10;i>0;i--)
{
conversao = read_adc(); // inicia conversão AD
delay_us(50);
media = media+conversao;
}
conversao = media/10; // faz regra de 3 para converter o valor,
lcd_gotoxy(22,2);
// printf(lcd_putc,"Umid: %2.1f%%", (conversao/10)+2.1);
printf(lcd_putc,"Umid: %2.1f%%",(((conversao-0.69)/0.031)-10000)/100);
media = 0;
le_umidade = 0 ;
}



void main()
{
set_tris_a(0b001111); // configuração da direção dos pinos de I/O
set_tris_b(0b00000001);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);

// inicializa os ports

porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte

setup_adc_ports (AN0_AN1_AN3); //RA0_RA1_RA3_ANALOG
setup_adc (adc_clock_div_32);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
set_timer0(131);

enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
enable_interrupts(int_timer0);

ds1307_init();
lcd_init();

if (!input(pin_a2)) ds1307_set_date_time(27,1,5,2,17,41,1);

for(;;)
{
if (le_clock) mostra_clock();
if (le_temperatura) mostra_temperatura();
if (le_umidade) mostra_umidade();
}
}

obrigado...
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Mensagempor Alvarosan » 27 Jan 2009 22:29

esqueci de colocar o codigo "ds1307.c"

///////////////////////////////////////////////////////////////////
#define RTC_SDA PIN_C4
#define RTC_SCL PIN_C3
#use i2c(master, sda=RTC_SDA, scl=RTC_SCL)
BYTE bin2bcd(BYTE binary_value);
BYTE bcd2bin(BYTE bcd_value);

void ds1307_init(void)
{

BYTE seconds = 0;
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_start();
i2c_write(0xD1); // RD from RTC
seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307
i2c_stop();
seconds &= 0x7F;
delay_us(3);
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x00); // REG 0
i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value
i2c_start();
i2c_write(0xD0); // WR to RTC
i2c_write(0x07); // Control Register
i2c_write(0x10); // Disable squarewave output pin
i2c_stop();
}

void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow,
BYTE hr, BYTE min, BYTE sec)
{
sec &= 0x7F;
hr &= 0x3F;
i2c_start();
i2c_write(0xD0); // I2C write address
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_write(bin2bcd(sec)); // REG 0
i2c_write(bin2bcd(min)); // REG 1
i2c_write(bin2bcd(hr)); // REG 2
i2c_write(bin2bcd(dow)); // REG 3
i2c_write(bin2bcd(day)); // REG 4
i2c_write(bin2bcd(mth)); // REG 5
i2c_write(bin2bcd(year)); // REG 6
i2c_write(0x10); // REG 7 - Disable squarewave output pin
i2c_stop();
}

void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x03); // Start at REG 3 - Day of week
i2c_start();
i2c_write(0xD1);
dow = bcd2bin(i2c_read() & 0x7f); // REG 3
day = bcd2bin(i2c_read() & 0x3f); // REG 4
mth = bcd2bin(i2c_read() & 0x1f); // REG 5
year = bcd2bin(i2c_read(0)); // REG 6
i2c_stop();
}

void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00); // Start at REG 0 - Seconds
i2c_start();
i2c_write(0xD1);
sec = bcd2bin(i2c_read() & 0x7f);
min = bcd2bin(i2c_read() & 0x7f);
hr = bcd2bin(i2c_read(0) & 0x3f);
i2c_stop();
}
BYTE bin2bcd(BYTE binary_value)
{
BYTE temp;
BYTE retval;
temp = binary_value;
retval = 0;
for(;;)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(temp >= 10)
{
temp -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += temp;
break;
}}
return(retval);
}
// Input range - 00 to 99.
BYTE bcd2bin(BYTE bcd_value)
{
BYTE temp;
temp = bcd_value;
// Shifting upper digit right by 1 is same as multiplying by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto

Mensagempor Alvarosan » 28 Jan 2009 16:23

Só para efeito de conclusão, consegui resolver o problema retirando a linha de comando "#device *=16", porém não me pergunte porque acontece isso.

abs...
Alvarosan
Bit
 
Mensagens: 20
Registrado em: 14 Out 2006 10:55
Localização: Ribeirao Preto


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron

x