Nastavení času RTC8583

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
mrkivka
Příspěvky: 21
Registrován: 22 srp 2010, 00:00

Nastavení času RTC8583

#1 Příspěvek od mrkivka »

Ahoj,
marně se snažím nastavit čas v RTC8583. Pokud zapíšu např na adresu 0x02(sekundy) požadovaný čas například 0x00, přestanou se mi vteřiny přičítat. Naopak když zapíšu 0xFF, počátají se správně. Mám za to, že pouze nastavuji masku, na kterých bitech se bude přičítat a na kterých ne. U hodin se mi to například hodí, protože zamaskuji AM/PM flag, ale nevím jak nastavit aktuální čas.
Zkrácený zdrojový kód:

Kód: Vybrat vše

#define TWI_SLA 0xa2  //1 0 1 0 0 0 1 + 0

int twi_read_bytes(uint8_t twi_sla, uint16_t address,  int length, uint8_t *buf);
int twi_write_bytes(uint8_t twi_sla, uint16_t address,  int length, uint8_t *buf);

void main(void)
{
uint8_t buffer[3];
uint8_t time[3] = {0x35, 0x25, 0x19};   //19:25:35 (hh:mm:ss)
uint8_t stop = 0b10000000;
uint8_t start = 0b00000000;

twi_read_bytes(TWI_SLA, 0x02, 3, buffer);
printf("%02x:%02x:%02x \n", buffer[2],buffer[1],buffer[0]);

twi_write_bytes(TWI_SLA, 0x00, 1, &stop);

twi_write_bytes(TWI_SLA, 0x02, 3, time);

twi_write_bytes(TWI_SLA, 0x00, 1, &start);
}

V tomto případě se mi začně čas počítat naprosto nesmyslně.
Výpis času po vteřinách:

Kód: Vybrat vše

25:00:35 
25:00:34
25:00:35
25:00:30
25:00:31
25:00:00
25:00:01
25:00:00
25:00:01
Uživatelský avatar
mrkivka
Příspěvky: 21
Registrován: 22 srp 2010, 00:00

#2 Příspěvek od mrkivka »

Tak jsem na to přišel sám. Nevím, jestli je to normální chování, ale v datasheetu jsem na nic takového něpřišel. Stačilo před nastavením času přidat masku.
#define TWI_SLA 0xa2 //1 0 1 0 0 0 1 + 0

int twi_read_bytes(uint8_t twi_sla, uint16_t address, int length, uint8_t *buf);
int twi_write_bytes(uint8_t twi_sla, uint16_t address, int length, uint8_t *buf);

void main(void)
{
uint8_t buffer[3];
uint8_t time_mask[3] = {0xFF, 0xFF, 0x3F};
uint8_t time[3] = {0x35, 0x25, 0x19}; //19:25:35 (hh:mm:ss)
uint8_t stop = 0b10000000;
uint8_t start = 0b00000000;

twi_read_bytes(TWI_SLA, 0x02, 3, buffer);
printf("%02x:%02x:%02x \n", buffer[2],buffer[1],buffer[0]);

twi_write_bytes(TWI_SLA, 0x00, 1, &stop);

twi_write_bytes(TWI_SLA, 0x02, 3, time_mask);

twi_write_bytes(TWI_SLA, 0x02, 3, time);

twi_write_bytes(TWI_SLA, 0x00, 1, &start);
}
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#3 Příspěvek od Atlan »

Kód: Vybrat vše

void settime   (void)      //;prenos i2c PCF8583
   {unsigned char tmp=0;

   I2Cstart();
   i2cW(0b10100000);   //ide o zapis do pcf8583; adresa pcf8583
   i2cW(0b00000010);   //zapisovat sa budu sec
   i2cW(0b00000000);   //zapise sa 0sekund

   tmp=desmin<<4;
   tmp|=jedmin;
   i2cW(tmp);      //zapise minuty

   tmp=deshod<<4;
   tmp|=jedhod;
   i2cW(tmp);      //zapise hodiny

   I2Cstop();
   
   return;
   }


Mne to chodi takto.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“