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

  • Применение интегральных датчиков магнитного поля

    SS49 - бюджетный, аналоговый, биполярный, фиксированный диапазон ± 1000Gs. 
    AD22151 - прецизионный, аналоговый, диапазон от ±50Gs до ±6000Gs.
    HMC1053 - магниторезистивный 3-х осевой магнитометр, диапазон ±6Gs по каждой оси.
    HMC5883L - магниторезистивный 3-х осевой магнитометр с цифровым выходом, диапазон ±8Gs по каждой оси.

  • Конструкции на микроконтроллерах

    Atmel:  ATtiny13A, ATtiny2313, ATmega8A. 
    STMicroelectronics:  STM32F100RBT6B, STM32L152RBT6

  • 3D принтер с кинематикой Delta

    За основу взяты размеры конструкции Kossel. Каркас собран из алюминиевого профиля 20х20 с V-образным пазом. Вертикальные стойки одновременно являются направляющими для кареток с роликами mini POM Dual V slot Delrin. Приводные зубчатые ремни GT2 спрятаны в пазы профилей. Шарниры диагоналей магнитные. 

  • Устройство для разработки локтевого сустава

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

  • Пассивный ретранслятор радиосигналов дистанционного датчика температуры для погреба

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

  • НБК из стандартных узлов

    НБК собрана из стандартных узлов (куб, царга с СПН, узел отбора, повороты, холодильники и т.п.)

  • Универсальный узел отбора

    Из узла отбора по пару Wein легко сделать универсальный узел отбора.

  • Инициализация M48T08 (DS1643)

    Очень древняя микросхема часов реального времени с оперативной памятью 8 K x 8 SRAMs на борту.
    Но до сих пор производится и продаётся как запчасть, так как использовалась в большом количестве разнообразного компьютеризированного оборудования.

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

Согласно документации для запуска осциллятора нужно совершить манипуляции с битом 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);}




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

Согласно документации для запуска осциллятора нужно совершить манипуляции с битом 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);}





Возврат к списку