Witam!
Walcze z tym juz od kilku dni i nie moge przestawic DS1337C na tryb zliczania 12 godz. W trybie 24 godz. wszystko smiga ale na 12 godz. nie chce "przejsc"! W datasheet'cie jest napisane:
Czyli zeby ustawic tryb 12h musze zmienic bit 6 rejestru pod adresem 0x02 [godzina]. Ale jesli to robie to zamiast przestawienia trybu godziny zmienia mi sie godzina 12:30:00 na 52:30:00! Czy ktos jest mi w stanie pomoc?
Oto kod:
Walcze z tym juz od kilku dni i nie moge przestawic DS1337C na tryb zliczania 12 godz. W trybie 24 godz. wszystko smiga ale na 12 godz. nie chce "przejsc"! W datasheet'cie jest napisane:
Cytat:The DS1337 can be run in either 12-hour or 24-hour mode. Bit 6 of the hours register is defined as the 12- or 24-hour mode-select bit. When high, the 12-hour mode is selected. In the 12-hour mode, bit 5 is the AM/PM bit with logic high being PM. In the 24-hour mode, bit 5 is the second 10-hour bit (20–23 hours). All hours values, including the alarms, must be reinitialized whenever the 12/24-hour mode bit is changed. The century bit (bit 7 of the month register) is toggled when the years register overflows from 99–00.
Czyli zeby ustawic tryb 12h musze zmienic bit 6 rejestru pod adresem 0x02 [godzina]. Ale jesli to robie to zamiast przestawienia trybu godziny zmienia mi sie godzina 12:30:00 na 52:30:00! Czy ktos jest mi w stanie pomoc?
Oto kod:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <compat/deprecated.h>
#include "global.h"
#include "string.h"
#include "i2c_master.h"
//*======================================================================*//
#define bit_get(p,m) ((p) & (m))
#define bit_set(p,m) ((p) |= (m))
#define bit_clear(p,m) ((p) &= ~(m))
#define bit_flip(p,m) ((p) ^= (m))
#define bit_write(c,p,m) (c ? bit_set(p,m) : bit_clear(p,m))
#define BIT(x) (0x01 << (x))
#define LONGBIT(x) ((unsigned long)0x00000001 << (x))
#define DS1337C 0xD0 //1101 0000B - adres hardware'owy zegara DS1337C
#define bcd2dec(bcd) (((((bcd) >> 4) & 0x0F) * 10) + ((bcd) & 0x0F))
#define dec2bcd(dec) ((((dec) / 10) << 4) | ((dec) % 10))
//---------------------
// Adresy w DS1337C
//---------------------
#define REG_SEKUNDA 0x00
#define REG_MINUTA 0x01
#define REG_GODZINA 0x02
#define REG_DZIEN_TYG 0x03
#define REG_DZIEN 0x04
#define REG_MIESIAC 0x05
#define REG_ROK 0x06
#define REG_ALARM1_SEKUNDA 0x07
#define REG_ALARM1_MINUTA 0x08
#define REG_ALARM1_GODZINA 0x09
#define REG_ALARM1_DZIEN_TYG 0x0A
#define REG_ALARM1_DZIEN 0x0B
#define MAX_SIZE 0x1E
#define RTC_DTYG_1 PSTR("Poniedzialek")
#define RTC_DTYG_2 PSTR("Wtorek")
#define RTC_DTYG_3 PSTR("Sroda")
#define RTC_DTYG_4 PSTR("Czwartek")
#define RTC_DTYG_5 PSTR("Piatek")
#define RTC_DTYG_6 PSTR("Sobota")
#define RTC_DTYG_7 PSTR("Niedziela")
char bufor[MAX_SIZE];
typedef struct {
u08 godzina;
u08 minuta;
u08 sekunda;
} strCzas;
typedef struct {
u08 dzien_tyg;
u08 dzien;
u08 miesiac;
u08 rok;
} strData;
strCzas czas;
strData data;
u08 prv_sec;
//*======================================================================*//
void delay1s(void)
{
for (int x=0; x<10; x++) {
_delay_ms(100);
}
}
//*======================================================================*//
void writeByteI2C(u08 DevAddress, int Address, u08 Data)
{
i2c_start_wait(DevAddress + I2C_WRITE);
i2c_write(Address);
i2c_write(Data);
i2c_stop();
}
//*======================================================================*//
u08 readByteI2C(u08 DevAddress, int Address)
{
u08 i2c_byte = 0x00;
i2c_start_wait(DevAddress + I2C_WRITE);
i2c_write(Address);
i2c_rep_start(DevAddress + I2C_READ);
i2c_byte = i2c_readNak();
i2c_stop();
return i2c_byte;
}
//*======================================================================*//
void SetTime(void)
{
//ustaw INTCN i A1IE, zeruj A2IE, wylacz oscylator
writeByteI2C(DS1337C, 0x0E, 0x85);
czas.godzina |= (1 << 6); //ustaw tryb 12h
writeByteI2C(DS1337C, REG_SEKUNDA, dec2bcd(czas.sekunda));
writeByteI2C(DS1337C, REG_MINUTA, dec2bcd(czas.minuta));
writeByteI2C(DS1337C, REG_GODZINA, czas.godzina);
//startuj ponownie oscylator i kasuj status
//ustaw INTCN i A1IE, zeruj A2IE, wlacz oscylator
writeByteI2C(DS1337C, 0x0E, 0x05);
//kasuj flagi
writeByteI2C(DS1337C, 0x0F, 0x00);
}
//*======================================================================*//
void SetDate(void)
{
writeByteI2C(DS1337C, REG_DZIEN_TYG, dec2bcd(data.dzien_tyg));
writeByteI2C(DS1337C, REG_DZIEN, dec2bcd(data.dzien));
writeByteI2C(DS1337C, REG_MIESIAC, dec2bcd(data.miesiac));
writeByteI2C(DS1337C, REG_ROK, dec2bcd(data.rok));
}
//*======================================================================*//
void GetTime(void)
{
czas.sekunda = readByteI2C(DS1337C, REG_SEKUNDA);
czas.minuta = readByteI2C(DS1337C, REG_MINUTA);
czas.godzina = readByteI2C(DS1337C, REG_GODZINA);
}
//*======================================================================*//
void GetDate(void)
{
data.dzien_tyg = readByteI2C(DS1337C, REG_DZIEN_TYG);
data.dzien = readByteI2C(DS1337C, REG_DZIEN);
data.miesiac = readByteI2C(DS1337C, REG_MIESIAC);
data.rok = readByteI2C(DS1337C, REG_ROK);
}
//*======================================================================*//
int main(void)
{
lcdInit();
lcdClear();
i2c_init(); // initialize I2C library
czas.godzina = 12;
czas.minuta = 30;
czas.sekunda = 0;
data.dzien_tyg = 1;
data.dzien = 30;
data.miesiac = 6;
data.rok = 8;
SetTime();
SetDate();
while(1)
{
GetTime();
if (czas.sekunda != prv_sec)
{
lcdGotoXY(0,0);
sprintf(bufor, " %.2d:%.2d:%.2d %.2d-%.2d-20%.2d ", bcd2dec(czas.godzina), bcd2dec(czas.minuta), bcd2dec(czas.sekunda), \
bcd2dec(data.dzien), bcd2dec(data.miesiac), bcd2dec(data.rok));
lcdPrintData(bufor, strlen(bufor));
}
prv_sec = czas.sekunda;
GetDate();
switch (data.dzien_tyg)
{
case 1: strcpy_p(bufor, RTC_DTYG_1); break;
case 2: strcpy_p(bufor, RTC_DTYG_2); break;
case 3: strcpy_p(bufor, RTC_DTYG_3); break;
case 4: strcpy_p(bufor, RTC_DTYG_4); break;
case 5: strcpy_p(bufor, RTC_DTYG_5); break;
case 6: strcpy_p(bufor, RTC_DTYG_6); break;
case 7: strcpy_p(bufor, RTC_DTYG_7); break;
}
lcdGotoXY(0,1);
lcdPrintData(bufor, strlen(bufor));
_delay_ms(1000);
}
return 0;
}
//*======================================================================*//
. Wiele sie nauczylem siedzac nad tym zegarkiem [w koncu dopiero raczkuje w uC]. W czasie pisania odpowiedzi nie widzialem, ze BoskiDialer rowniez odpowiedzial w tym samym czasie i dodal kod [oczywiscie poprawny