Эта гибридная микросхема содержит литиевый элемент питания, поэтому для экономии его ресурса поставляется с остановленным осциллятором. Не все устройства, использующие этот компонент умеют запускать его после замены.
Согласно документации для запуска осциллятора нужно совершить манипуляции с битом ST в регистре секунд.
Осуществить запуск осциллятора, а заодно и загрузить в регистры значения времени и текущей даты можно с помощью несложной конструкции на базе контроллера Arduino nano.
Конструкция собирается на беспаечной макетной плате по схеме:
Ниже можно скачать или скопировать скетч.
Несколько пояснений:
- для первоначального запуска нужно раскомментарить соответствующие строки и вписать актуальные значения даты и времени.
- после компиляции, загрузки и запуска в последовательный порт раз в секунду будут выводиться считанные из регистров дата и время.
Sketch: M48T08.ino
#define DQ0 2
#define CE 10
#define _G 11
#define _W 12
void set_addr(byte addr) {
byte i;
for (i = 0; i <= 2; ++i) {
digitalWrite(A0 + i, addr >> i & 1);
}
}
void set_byte(byte data) {
byte i;
for (i = 0; i <= 7; ++i) {
digitalWrite(DQ0 + i, data >> i & 1);
}
}
byte read_byte(byte addr) {
byte
data;
byte i;
for (i = 0; i <= 7; ++i) {
pinMode(DQ0 + i, INPUT_PULLUP);
}
set_addr(addr);
delayMicroseconds(1);
digitalWrite(_G, 0);
delayMicroseconds(1);
data = 0;
for (i = 0; i <= 7; ++i) {
data += digitalRead(DQ0 + i) << i;
}
digitalWrite(_G, 1);
delayMicroseconds(1);
return data;
}
void write_byte(byte addr, byte data) {
byte i;
set_addr(addr);
set_byte(data);
for (i = 0; i <= 7; ++i) {
pinMode(DQ0 + i, OUTPUT);
}
delayMicroseconds(1);
digitalWrite(_W, 0);
delayMicroseconds(1);
digitalWrite(_W, 1);
delayMicroseconds(1);
}
void setup() {
Serial.begin(9600);
digitalWrite(CE, 0);
digitalWrite(_G, 1);
digitalWrite(_W, 1);
pinMode(_G, OUTPUT);
pinMode(_W,
OUTPUT);
pinMode(CE, OUTPUT);
for (byte i = 0; i <= 2; ++i) {
pinMode(A0 + i, OUTPUT);
}
/* Раскомментарить для первого запуска и вставить актуальные значения даты и времени
digitalWrite(CE, 1);
delay(1);
write_byte(0, 0); // Control
// По мануалу для уверенного
первого запуска нужно все равно установить бит ST,
а затем уже снять его
write_byte(1, B10000000); // Стоп
осциллятора
write_byte(1, B00000000); //
Запуск осциллятора
write_byte(0, B10000000); //WRITE
write_byte(1, B00001000); //Set 8 sec
write_byte(2, 0x41); //Set 41 min
write_byte(3, 0x10); //Set 10 h
write_byte(4, 0x04); //Set 4 day
write_byte(5, 0x22); //Set 22 date
write_byte(6, 0x11); //Set 11 month
write_byte(7, 0x23); //Set 23 year
write_byte(0, 0); //No WRITE
digitalWrite(CE, 0);
/**/
}
void loop() {
digitalWrite(CE, 1);
delay(1);
write_byte(0, B01000000); // READ
Serial.print(String(read_byte(0),HEX)+" 20"+String(read_byte(7),HEX)+"-"
+String(read_byte(6),HEX)+"-"+String(read_byte(5),HEX)+" ");
Serial.print(String(read_byte(3),HEX)+":"+String(read_byte(2),HEX)+":"
+String(read_byte(1),HEX));
Serial.println();
write_byte(0, 0); //No READ
digitalWrite(CE,
0);
delay(1000);}