Witam,
Problem polega na tym, że chcę odczytać prawidłowo czas z PCF8563 jednak nie udaje mi się to z pełnym powodzeniem. Z PCFa odczytuję 3 rejestry: godziny, minuty i sekundy
gdy sekundy osiągną liczbę 40 wtedy w miejsce godzin również pojawia się liczba 40
po przekręceniu się rejestru godziny z powrotem wracają do normalnego stanu
jeżeli natomiast godziny posiadają już jakąś wartość np.20
wtedy gdy sekundy osiągną wartość 40 to ta wartość dodaje się do godzin
Nie mam pojęcia na czym polega błąd. Poniżej podaje listing najważniejszych funkcji programu.
Za wszelkie sugestie bardzo dziękuję.
Pozdrawiam
Problem polega na tym, że chcę odczytać prawidłowo czas z PCF8563 jednak nie udaje mi się to z pełnym powodzeniem. Z PCFa odczytuję 3 rejestry: godziny, minuty i sekundy
00:00:21
gdy sekundy osiągną liczbę 40 wtedy w miejsce godzin również pojawia się liczba 40
40:00:40
po przekręceniu się rejestru godziny z powrotem wracają do normalnego stanu
00:01:02
jeżeli natomiast godziny posiadają już jakąś wartość np.20
20:00:30
wtedy gdy sekundy osiągną wartość 40 to ta wartość dodaje się do godzin
60:00:40
Nie mam pojęcia na czym polega błąd. Poniżej podaje listing najważniejszych funkcji programu.
#define F_CPU 12000000UL
#define SCL_CLOCK 400000L
/****************************************************************************/
// I2C
/****************************************************************************/
void i2c_init(void)
{
TWSR = 0;
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
}
unsigned char twi_start(void)
{
TWCR |= 0b11100100;
while (!(TWCR & 0b10000000));
TWCR &= 0b01011111;
return 0;
}
void twi_stop(void)
{
TWCR |= 0b10010100;
}
unsigned char twi_wr(unsigned char data_byte)
{
TWDR = data_byte;
TWCR |= 0b10000000;
while (!(TWCR & 0b10000000));
return 0; // zwroc kod !error
}
unsigned char twi_rd(unsigned char ack)
{
if (ack == 1)
{
TWCR |= 0b10000000;
}
else
{
TWCR &= 0b10111111;
};
while (!(TWCR & 0b10000000));
return TWDR;
}
/****************************************************************************/
// z BCD
/****************************************************************************/
unsigned char FROMBCD(unsigned char in)
{
return (((in) >>4) * 10 + ((in) & 0xf));
}
/****************************************************************************/
// odczyt z pcf
/****************************************************************************/
twi_start();
twi_wr(0xA2);
twi_wr(0x04);
twi_start();
twi_wr(0xA3);
roboczy=twi_rd(0);
twi_stop();
roboczy=roboczy&0x3F;
godzina=FROMBCD(roboczy);
twi_start();
twi_wr(0xA2);
twi_wr(0x03);
twi_start();
twi_wr(0xA3);
roboczy=twi_rd(0);
twi_stop();
roboczy=roboczy&0x7F;
minuta=FROMBCD(roboczy);
twi_start();
twi_wr(0xA2);
twi_wr(0x02);
twi_start();
twi_wr(0xA3);
roboczy=twi_rd(0);
twi_stop();
roboczy=roboczy&0x7F;
sekunda=FROMBCD(roboczy);
Za wszelkie sugestie bardzo dziękuję.
Pozdrawiam