Не запускается M5450B7
- Войдите на сайт для отправки комментариев
Здравствуйте!
Приобрёл автоматическую подсветку лестницы, собранную на 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); } }
Может у кого-нибудь есть какие-нибудь мысли, советы, вопросы. Буду очень признателен. Спасибо!
Я решил конкретизировать свой вопрос.
Меня интересует работа функции MM5450(). Как я понял она выставляет выхода М5450 в соответствие с "mask". "mask" вводится побитно и тактируется сигналом CLOCK. Первый бит "1", далее идут биты "mask", оставшееся место заполняется "0". При получении 36-го бита срабатывает защелка М5450 и всё "слово" выводится на выхода М5450.
Вот как раз в этом моменте и загвоздка. По приходу 36-го бита ничего не происходит.
Какие будут сображения?
Если пользоваться этим
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
Спасибо за ответ!
Да, в моём скетче была ерунда с тактированием по CLOCK. Я всё исправил, но результата нет. Не зажигается.
Может есть другие варианты реализации работы ММ5450?
Я снял осцилограммы с входов CLOCK и DATA драйвера ММ5450.
Жёлтый - CLOCK, голубой - DATA.
Вроде всё как по даташиту, но работать отказывается.
Забыл скетч приложить.
Ну тогда проверте выв 19 BRIGTHNESS CONTROL и выв 23 /DATA ENABLE . Первый буквально не показывает результат. А второй не загружает .Ну и третье у вас или микросхема битая или на плате обрыв или КЗ.
Ну тогда проверте выв 19 BRIGTHNESS CONTROL и выв 23 /DATA ENABLE . Первый буквально не показывает результат. А второй не загружает .Ну и третье у вас или микросхема битая или на плате обрыв или КЗ.
Драйвер ММ5450 рабочий. Когда я заливаю в МК родную прошивку (HEX-код), то всё светится и работает как положено.
На выв. 19 всегда висит +3.54В. Он подключен через резистор к +12В. На выв. 23 всегда висит 0В.
При управлении драйвером ММ5450, используется ли вход /DATA ENABLE? Или он должен быть всегда в нуле?
УРА!!!
Получилось! Всё-таки надо использовать вход /DATA ENABLE.
Загрузил этот скетч и ...
заработало!
Спасибо за помощь!