Приветствую всех форумчан! Начал недавно разбираться с микросхемой на ТМ1637, но к успеху это не привело . Пробовал сделать на аппаратном I2C, но ничего не получилось, в итоге, сначала решил завести ногодрыгом. Суть в следующем: Для Ардуино есть готовые библиотеки, которые работают нормально, но мне нужно для STM32. В даташите есть пример кода для какого-то микроконтрроллера: Спойлер
Код:
# include <reg52.h> # include <intrins.h> / / Define port sbit clk = P1 ^ 2; sbit dio = P1 ^ 1; / / / ===================== void Delay_us (unsigned int i) // n us delay { for (; i> 0; i--) _nop_ (); } / / / ==================== void I2CStart (void) // 1637 start { clk = 1; dio = 1; Delay_us (2); dio = 0; } / / / ========= void I2Cask (void) // 1637 Answer { clk = 0; Delay_us (5); // After the falling edge of the eighth clock delay 5us, ACK signals the beginning of judgment while (dio); clk = 1; Delay_us (2); clk = 0; } / / / ==== void I2CStop (void) // 1637 Stop { clk = 0; Delay_us (2); dio = 0; Delay_us (2); clk = 1; Delay_us (2); dio = 1; } / / / ===== void I2CWrByte (unsigned char oneByte) // write a byte { unsigned char i; for (i = 0; i <8; i + +) { Clk = 0; if (oneByte & 0x01) // low front {dio = 1;} else {dio = 0;} Delay_us (3); oneByte = oneByte >> 1; clk = 1; Delay_us (3); } } / / / ---------- - unsigned char ScanKey (void) // read buttons \ { unsigned char rekey, rkey, i; I2CStart (); I2CWrByte (0x42); // read command buttons I2Cask (); dio = 1; // read keys before data lines pulled for (i = 0; i <8; i + +) // start reading from the low { Clk = 0; rekey = rekey >> 1; Delay_us(30); clk=1; if(dio) { rekey=rekey|0x80; } else { rekey=rekey|0x00; } Delay_us(30); } I2Cask(); I2CStop(); return (rekey); } void SmgDisplay(void) // Write display register { unsigned char i; I2CStart(); I2CWrByte(0x40); //40H address is automatically incremented by 1 mode, 44H fixed address mode I2Cask(); I2CStop(); I2CStart(); I2CWrByte(0xc0); // Set the first address I2Cask(); for(i=0;i<6;i++) // Addresses from Canada, do not always write address { I2CWrByte(0xff); // Send data I2Cask(); } I2CStop(); I2CStart(); I2CWrByte(0x8f); // Open display, maximum brightness I2Cask(); I2CStop(); } ///========== void init() // Initialization routine { // Initialization slightly } ///========== void main(void) { unsigned char keydate; init(); // Initialization SmgDisplay(); // Write register and open display while(1) { keydate=[b]Scankey[/b](); // Read key value, the key value is not read out for treatment. } } //===========end================
Жирным вsделена функция, написанная с ошибкой (должен быть ScanKey).
Оригинал, с короторого передирал, лежит здесь: https://github.com/lpodkalicki/attiny-tm1637-library Когда делали на аппаратном I2C, возможно не учли, что в "каноничном" I2C передача идет старшим байтом вперед, а ТМ1637 принимает младшим байтом вперед.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
дык яж на TMxxxxx выкладыввал гето на форум на всю серию шиты искать ленива чето инет тормозит
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Дык... пока на глазы в продаже не попадалась - и не интересовалси, а тут вроде как их расплодилось - а почти все ссыли на китая-маму. Воть накопал - теперь и почитамсс.
Микросхема одинакова ВСЕГДА, а вот раскладка выводов индикатора относительно выводов микросхемы может отличаться в зависимости от типа светодиодной матрицы и производителя модуля. Посему и картинка может быть отличной. Этот вопрос ранее уже всплывал в темах о ЖКИ индикаторах - вполне возможно и в данном случае может иметь место. Лучше уж самому программы загрузки по даташиту соорудить и протестировать соответствие бит ОЗУ конкретным сегментам индикатора (посегментный тест привязки бит ОЗУ). Тем более, что микросхема обслуживает 6 позиций , а индикаторы типовые на 4-5 позиций (ежли "часовые" точки считать 5-й) какой порядок соответствия установлен в конкретном изделии - надо тестировать. Будет в лапах образец - составлю и прожку (пойдет "текущим хвостом" - продолжением сюда https://radiokot.ru/forum/viewtopic.php ... 7#p3365177 ).
Завелось таки!!! Основная проблема оказалась задержках. Нужно было увеличить их в 10 РАЗ!!!. Скорее всего это связано с атомарным управлением пинами в STM32. Позже выложу готовый код. Щас надо в порядок его привести.
Как можно сделать настройку с помощью функции типа: pinsSet(GPIOB, 0, 1);? Подозреваю, что это должно как-то быть связано с энумерацией, но пока не соображу чет...
Основная проблема оказалась задержках. Нужно было увеличить их в 10 РАЗ!!!
Ещё нужно учесть, что если используются резисторы подтяжки только те что на плате, то они там 10кОм и параллельно SDA,SLC ещё по 1000пф ёмкость подпаяна
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения