Не запускается M5450B7

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Здравствуйте!

Приобрёл автоматическую подсветку лестницы, собранную на ATmega8 и M5450B7.

Работает без особых замечаний, но есть один нюанс. В комплекте работают ультразвуковые дальномеры HC-SR04. По их даташиту дальность измерения до 4 м. Однако, тот кто программировал эту плату, поставил максимальное расстояние 1,5 м. А мне, как назло, надо до 3 м.

Изменить в программе не могу, потому что есть только HEX-код. Так как, все настройки сохраняются в EEPROM, я могу изменить только их. Но, это только предисловие. Теперь, по делу!

Решил я залить в МК другую программу (автоматическая подсветка лестницы). Почитал форумы, полазил по Гуглу. В принципе есть два варианта: с библиотеками Ultrasonic и Lightuino, и без библиотек. Вариант с библиотеками не прошёл. При компиляции много ошибок по библиотекам. 

Вариант без библиотек я нашёл на этом форуме "Автоматическая подсветка лестницы и M5450". Адаптировал скетч под эту плату. Залил скетч в МК. И ... ничего. На выходе М5450 как висело +12В так и висит. Вроде и даташит на М5450 читал и всё понимаю как сделать, а не выходит ничего.

Вот скетч, которыя я пробовал загрузить:

//Устанавливаем контакты для драйвера
#define  DATA  9
#define  CLOCK 10
//Устанавливаем контакт фоторезистора
#define  FOTO A2
//Устанавливаем контакты для первого датчика
#define  T1  0
#define  E1  1
//Устанавливаем контакты для второго датчика
#define  T2  A4
#define  E2  A5

//Задаем количество светодиодов
#define NUM_LEDS 14
const uint32_t mask = 0b11111111111111;

void setup()
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, HIGH);
  digitalWrite(FOTO, HIGH);
  pinMode(T1, OUTPUT);
  pinMode(T2, OUTPUT);
  pinMode(E1, INPUT);
  pinMode(E2, INPUT);
  digitalWrite(E1, HIGH);
  digitalWrite(E2, HIGH);
}

void loop()
{
  static bool state;
  
  if (analogRead(FOTO) > 1000) state = 1; // порог освещенности включения
  if (analogRead(FOTO) < 900) state = 0; // порог освещенности выключения
  if (state)
  {
    int D1 = Ultrasonic(T1, E1);    // измеряем расстояние первого датчика
    if (D1 > 0 && D1 < 300)         // если расстояние меньше 300см, то
    {
      for (char i = NUM_LEDS - 1; i >= 0; i--) // зажигаем светодиоды в одну сторону
      {
        MM5450(mask << i);
        delay(300);                 // задержка зажигания
      }

      delay(15000);                  // ждем 15 секунд

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask >> i);
        delay(300);                 // задержка затухания
      }
    }

    int D2 = Ultrasonic(T2, E2);    // измеряем расстояние второго датчика
    if (D2 > 0 && D2 < 300)         // если расстояние меньше 300см, то
    {
      for (char i = NUM_LEDS - 1; i >= 0; i--) // зажигаем светодиоды в другую сторону
      {
        MM5450(mask >> i);
        delay(300);                 // задержка зажигания
      }

      delay(15000);                  // ждем 15 секунд

      for (char i = 0; i <= NUM_LEDS; i++) // тушим светодиоды
      {
        MM5450(mask << i);
        delay(300);                 // задержка затухания
      }
    }
    delay(20);
  }
}


int Ultrasonic(byte Trig_pin, byte Echo_pin)
{
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  return pulseIn(Echo_pin, HIGH, 20000) / 29.0 / 2;
}

void MM5450(uint32_t data)
{
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, LOW);
  digitalWrite(CLOCK, HIGH);
  for (byte i = 0; i < NUM_LEDS; i++)
  {
    if (data & (1UL << i)) digitalWrite(DATA, HIGH);
    else digitalWrite(DATA, LOW);
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
  digitalWrite(DATA, 0);
  for (byte i = 0; i < 35 - NUM_LEDS; i++)
  {
    digitalWrite(CLOCK, LOW);
    digitalWrite(CLOCK, HIGH);
  }
}

Может у кого-нибудь есть какие-нибудь мысли, советы, вопросы. Буду очень признателен. Спасибо!

 

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Я решил конкретизировать свой вопрос.

Меня интересует работа функции MM5450(). Как я понял она выставляет выхода М5450 в соответствие с "mask". "mask" вводится побитно и тактируется сигналом CLOCK. Первый бит "1", далее идут биты "mask", оставшееся место заполняется "0". При получении 36-го бита срабатывает защелка М5450 и всё "слово" выводится на выхода М5450.

Вот как раз в этом моменте и загвоздка. По приходу 36-го бита ничего не происходит.

Какие будут сображения?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если пользоваться этим

http://www.st.com/content/ccc/resource/technical/document/datasheet/e1/1b/1d/f7/3c/33/40/6f/CD00020632.pdf/files/CD00020632.pdf/jcr:content/translations/en.CD00020632.pdf

на 4 странице , то надо делать 36 тактов  причем 1 бит посылки должен быть 1. Вот тогда и микросхема зажжет светодиод.

Цитата от туда: There must be a complete set of 36 clocks or the shift registers will not clear.

на рис 4 CLOCK начинается LOW и заканчивается LOW

void MM5450(uint32_t data)
{
  byte i;
  digitalWrite(CLOCK, 0);  
  digitalWrite(DATA, 1);
  digitalWrite(CLOCK, 1);
  digitalWrite(CLOCK, 0);
  for (i = 0; i < 35; i++)
  {
    digitalWrite(DATA, ((data << i) & 1));
    digitalWrite(CLOCK, 1);
    digitalWrite(CLOCK, 0);
  }
}
Dimonaman
Offline
Зарегистрирован: 27.08.2016

Спасибо за ответ!

Да, в моём скетче была ерунда с тактированием по CLOCK. Я всё исправил, но результата нет. Не зажигается.

Может есть другие варианты реализации работы ММ5450?

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Я снял осцилограммы с входов CLOCK и DATA драйвера ММ5450.

Жёлтый - CLOCK, голубой - DATA.

Вроде всё как по даташиту, но работать отказывается.

Dimonaman
Offline
Зарегистрирован: 27.08.2016

Забыл скетч приложить.

//Устанавливаем контакты для драйвера
#define  DATA  9
#define  CLOCK 10

void setup() 
{
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
}

void loop() 
{
  for(byte i = 0; i <= 17; i++)
  {
    digitalWrite(DATA, 1);
    delayMicroseconds(500);
    digitalWrite(CLOCK, HIGH);
    delay(1);
    digitalWrite(CLOCK, LOW);
    delayMicroseconds(500);
    
    digitalWrite(DATA, 0);    
    delayMicroseconds(500);
    digitalWrite(CLOCK, HIGH);
    delay(1);
    digitalWrite(CLOCK, LOW);
    delayMicroseconds(500);
  }
  delay(100);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну тогда проверте выв 19 BRIGTHNESS CONTROL и  выв 23 /DATA ENABLE . Первый буквально не показывает результат. А второй не загружает .Ну и третье у вас или микросхема битая или на плате обрыв или КЗ.

Dimonaman
Offline
Зарегистрирован: 27.08.2016

qwone пишет:

Ну тогда проверте выв 19 BRIGTHNESS CONTROL и  выв 23 /DATA ENABLE . Первый буквально не показывает результат. А второй не загружает .Ну и третье у вас или микросхема битая или на плате обрыв или КЗ.

Драйвер ММ5450 рабочий. Когда я заливаю в МК родную прошивку (HEX-код), то всё светится и работает как положено.

На выв. 19 всегда висит +3.54В. Он подключен через резистор к +12В. На выв. 23 всегда висит 0В.

При управлении драйвером ММ5450, используется ли вход /DATA ENABLE? Или он должен быть всегда в нуле?

Dimonaman
Offline
Зарегистрирован: 27.08.2016

УРА!!!

Получилось! Всё-таки надо использовать вход /DATA ENABLE.

Загрузил этот скетч и ...

//Устанавливаем контакты для драйвера
#define  ENB  8
#define  DATA  9
#define  CLOCK 10

void setup() 
{
  pinMode(ENB, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(CLOCK, OUTPUT);
  digitalWrite(CLOCK, LOW);
  digitalWrite(ENB, HIGH);
}

void loop() 
{
  digitalWrite(ENB, LOW);
  for(byte i = 0; i <= 17; i++)
  {
    digitalWrite(DATA, 1);
    digitalWrite(CLOCK, HIGH);
    digitalWrite(CLOCK, LOW);
    digitalWrite(DATA, 0);    
    digitalWrite(CLOCK, HIGH);
    digitalWrite(CLOCK, LOW);
  }
  digitalWrite(ENB, HIGH);
}

заработало!

Спасибо за помощь!