Коновалов Дмитрий Александрович


Эта гибридная микросхема содержит литиевый элемент питания, поэтому для экономии его ресурса поставляется с остановленным осциллятором. Не все устройства, использующие этот компонент умеют запускать его после замены.

Согласно документации для запуска осциллятора нужно совершить манипуляции с битом ST в регистре секунд.

Осуществить запуск осциллятора, а заодно и загрузить в регистры значения времени и текущей даты можно с помощью несложной конструкции на базе контроллера Arduino nano.

Конструкция собирается на беспаечной макетной плате по схеме:

Схема.png20231122_100217.jpg

Ниже можно скачать или скопировать скетч.

Несколько пояснений:

  • для первоначального запуска нужно раскомментарить соответствующие строки и вписать актуальные значения даты и времени.
  • после компиляции, загрузки и запуска в последовательный порт раз в секунду будут выводиться считанные из регистров дата и время.

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);}