Меджикивис 0 15 февраля, 2016 Опубликовано 15 февраля, 2016 · Жалоба Купил недавно в "Чип-И-Дип"е жидкокристаллический дисплей MT-10T11. Думаю, что рассказ про этот цирк будет небесполезен :) MT-10T11 -это семисегментный дисплей, 10 разрядов, собран на контроллере PCF8576C. Подключается по интерфейсу I2C, что меня и привлекло; требует только двух линий, помимо питания. Выпускает эту сборку отечественная фирма "МЭЛТ". Выпускает в двух вариантах: с трехвольтовым питанием и с 5-вольтовым. (Собственно, контроллер работоспособен от 2 до 6 вольт, на 3 или 5V расчитывается стекло с жидкими кристаллами). Особый прикол заключается в том, что у 3-вольтового дисплея питание подсветки- 5 вольт! Из двух светодиодов последовательно; от трех вольт не зажигается. Смотрите, чтоб не нарваться на такое сочетание. Эти дисплеи имеют маркировку с дополнительным индексом "3V0". Например: MT-10T11-3TLA пятивольтовый (оранж. подсветка); MT-10T11-3TLA-3V0 трехвольтовый. В "Чип-И-Дип"е персонал достаточно адекватен, они продают полностью 5-вольтовый вариант. Но и тут, блин не обошлось без поднаколки! Скачиваю на сайте "Чип-И-Дип"а описание на дисплей, ПДФка от производителя. И в ней, без указания типов, однозначно написано: питание - 3 вольта, точка. Ну-дык, я не ожидая подвоха, распроектировал схему на 3 вольта, натравил платку, спаял, подключаю - фигушки! - ничего не работает (дисплей-то 5-вольтовый!) Прошерстил кучу сайтов, в том числе весь МЭЛТ-овский форум, пока разобрался с этой чехардой с питаниями. В этом году - 11 лет, как производитель не удосуживается поправить документацию! Какое, ббблин, тут "импортозамещение"?!!.. Пришлось всю плату переделывать(((( Теперь про программирование. Даташит на контроллер найти несложно. Но во-первых, он на инглише, и не всем будет легко прочесть. А во-вторых, имеет кучу режимов, и не ясно какие именно из них производитель задействовал в дисплее. В сопроводиловке об этом нет ни слова. Выяснил, что режимы следующие: I2C-адрес устройства: 70h bias=1/2, mux=1:2 выбор устройства: 0 банк: 0 Программирую я на PBP (PicBasic PRO). А примеры в Инете - все на Си, либо на Ардуино. Пришлось разбираться самому... В PBP есть команда передачи по I2C: называется I2CWRITE. Она предназначена для работы с внешним ЗУ по I2C, и под это распланированы ее аргументы. Для нас она может сделать только две вещи: кинуть на шину байт из параметра Control, и опционально перейти на метку, если устройство не отвечает. У меня семь потов сошло, пока я заставил дисплей все же заработать... Пожалуй не буду объяснять в словах, а выложу полный листинг тестовой программы. Всё подробно откомментировал. Добавлю только еще следующее. На шине I2C обязательно должны быть подтягивающие резисторы к питанию. У меня стояли 4.7 кОм, как рекомендовано в хелпе команды I2CWRITE. Но потом я попробовал, оказалось что все работает и на внутренней подтяжке PORTB МК: OPTION_REG.7 = 0 делайте, как вам удобнее. Итак, код тестовой программы. Может быть я управляю контроллером не самым оптимальным образом, но, по крайней мере, так - работает. '==================================================================== ' PIC16F84 программа: Тест дисплея MT-10T11 '==================================================================== ' ' ' конт PIN что подключается ' ------------------------------------------------------- ' 17: PORTA.0 - ' 18: PORTA.1 - ' 1: PORTA.2 - ' 2: PORTA.3 - ' 3: PORTA.4 - ' ' 6: PORTB.0 - ' 7: PORTB.1 - ' 8: PORTB.2 - ' 9: PORTB.3 - ' 10: PORTB.4 - ' 11: PORTB.5 - ' 12: PORTB.6 - MT-10T11, SDA (конт. 1) ' 13: PORTB.7 - MT-10T11, SCL (конт. 2) ' ' ------------+----------------------------------------- ' 15: CLKOUT | R C Режим ' 16: CLKIN | 8.2 к 15 пФ RC ' _____ +----------------------------------------- ' 4: сброс | 4.7 к ' ------------+----------------------------------------- ' 14: +5V | MT-10T11 конт: 3, 5 ' ------------+------------------------ ' 5:земля,общ.| MT-10T11 конт: 4, 6 ' ------------------------------------- '================================================================ 'Инициализация портов TRISB = %11000000 PORTB = %11000000 ' Объявление переменных 'I2C SDA VAR PORTB.6 'данные SCL VAR PORTB.7 'тактирование LCDpos VAR byte 'счетчик позиций вывода на дисплей LCDchr VAR byte 'код для вывода на дисплей i VAR byte PAUSE 10 'раскрутка контроллера дисплея maincycle: GOSUB CLS FOR i=0 TO 9 PAUSE 500 LCDchr = i GOSUB CHR7 GOSUB PRINT 'вывод очередного знака NEXT i GOSUB endprn PAUSE 1000 LCDpos=2 'вывод с позиции номер 2. GOSUB LOCATE FOR i=1 TO 6 'вывод шести знаков LCDchr = i+9 'hex-буквы GOSUB CHR7 GOSUB PRINT NEXT i GOSUB endprn PAUSE 2000 goto maincycle '================================================== ' ПОДПРОГРАММЫ '================================================== ' УПРАВЛЕНИЕ ПО I2C ДИСПЛЕЕМ MT10T11 '--------------------------------------- CLS: 'очистка дисплея. 'Подготавливает дисплей к выводу. 'Если была нужна только очистка, без вывода, 'все равно надо вызвать завершающую подпрограмму endprn. LCDpos=10 LOCATE: 'инициализирует дисплей; подготавливает к последующему выводу, 'устанавливает начало вывода на позицию LCDpos. 'Если LCDpos превышает 9, то производит очистку всего дисплея 'и устанавливает начальную позицию LCDpos=0 '(Изменяет переменную LCDchr). I2CWRITE SDA,SCL,$70 'старт, адрес устройства I2CWRITE SDA,SCL,%11001110 'вкл, bias=1/2, mux=1:2 I2CWRITE SDA,SCL,%11100000 'выбор устройства 0 I2CWRITE SDA,SCL,%11111000 'банк 0 I2CWRITE SDA,SCL,%11110000 'режим мерцания: normal, off IF LCDpos>9 then FOR LCDpos=0 TO 11 I2CWRITE SDA,SCL,0 NEXT LCDpos LCDpos=0 GOTO LOCATE ENDIF LCDchr=LCDpos<<2 I2CWRITE SDA,SCL,LCDchr Return CHR7: 'Знакогенератор для формирования семисегментных знаков. ' побитовая раскладка (старший бит слева): abfgecd. 'LCDchr содержит знак, который будет конвертирован в код для вывода. ' 0 1 2 3 4 5 6 7 8 9 A b C d E F LOOKUP LCDchr,[$EE,$44,$DA,$D6,$74,$B6,$BE,$C4,$FE,$F6,$FC,$3E,$AA,$5E,$BA,$B8],LCDchr Return SPC: 'Вывод одного пробела на дисплей. LCDchr=0 PRINT: 'Вывод кода, содержащегося в LCDchr на дисплей. IF LCDpos<10 then I2CWRITE SDA,SCL,LCDchr LCDpos=LCDpos+1 ENDIF Return endprn: 'Завершение вывода. 'Следует обязательно вызывать после вывода нужного количества символов. 'Дополняет вывод пробелами до последнего знакоместа, 'обеспечивает команду Стоп I2C. FOR LCDpos=LCDpos TO 10 I2CWRITE SDA,SCL,0 NEXT LCDpos Return END С пожеланиями успехов, Меджикивис. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 15 февраля, 2016 Опубликовано 15 февраля, 2016 · Жалоба Выпускает эту сборку отечественная фирма "МЭЛТ". ..... Прошерстил кучу сайтов, в том числе весь МЭЛТ-овский форум, пока разобрался с этой чехардой с питаниями. В этом году - 11 лет, как производитель не удосуживается поправить документацию! Какое, ббблин, тут импортозамещение"?!!.. [offtopic ON] .... -А ты на въезде большой красный флаг видел? -Видел. -Так вот этот флаг один на все ямки. [offtopic OFF] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 февраля, 2016 Опубликовано 15 февраля, 2016 · Жалоба На шине I2C обязательно должны быть подтягивающие резисторы к питанию. У меня стояли 4.7 кОм, как рекомендовано в хелпе команды I2CWRITE. Но потом я попробовал, оказалось что все работает и на внутренней подтяжке PORTB МК: OPTION_REG.7 = 0 делайте, как вам удобнее. Не слушайте Меджикивиса, всегда ставьте внешние подтяжки. Сопротивление внутренних подтяжек имеет большой разброс и на порядок превышает рекомендованное стандартом I2C значение. Разумеется, желающие походить по граблям могут экономить на спичках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба Сопротивление внутренних подтяжек имеет большой разброс Ну, не знаю, с какими контроллерами такая фигня. На ПИКах проблем с подтяжкой нет. А у дисплея входы полевые, им хватает. Что касается рекомендованного значения для I2C вообще, так я про это ничего и не говорил, а только про использование данного конкретного дисплея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба Ну, не знаю, с какими контроллерами такая фигня. На ПИКах проблем с подтяжкой нет.Вы не поверите... Вот вырезка из техописания указанного в вашем исходнике PIC16F84: Что касается рекомендованного значения для I2C вообще, так я про это ничего и не говорил, а только про использование данного конкретного дисплея.Вот этого не понял. Если у дисплея интерфейс I2C, надо делать как требует стандарт I2C. Если интерфейс другой - к чему упоминание I2C? Если стабильная работа не требуется - тогда другое дело, именно это я и имел ввиду, упомянув грабли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба А у дисплея входы полевые, им хватает. И емкости входов и монтажа нет ? Чудеса.... Кто требования стандарта не соблюдает - сам себе злобный Буратино... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба Вы не поверите... Вот вырезка из техописания указанного в вашем исходнике PIC16F84: * These parameters are characterized but not tested. И емкости входов и монтажа нет ? Есть. Но 10 см шлейфа видимо недостаточно, чтобы испортить праздник жизни :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 16 февраля, 2016 Опубликовано 16 февраля, 2016 · Жалоба * These parameters are characterized but not tested.И что? Производитель обещает, что будет от 50 до 400, этот параметр вытекает из технологии и в отдельном выходном контроле не нуждается. Надо сразу делать хорошо, плохо получится само. И уж тем более не нужно давать вредных советов, раз уж ваше сообщение было адресовано тем, кто не может победить I2C самостоятельно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Меджикивис 0 17 февраля, 2016 Опубликовано 17 февраля, 2016 · Жалоба тем, кто не может победить I2C тем, кто не может победить дисплей MT-10T11 :) Не надо злонамеренно приписывать мне то, чего я не говорил. (И вообще, зависть - плохое чувство...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kerby 0 22 ноября, 2023 Опубликовано 22 ноября, 2023 (изменено) · Жалоба Спасибо топикстартеру, помог! Купил пару месяцев назад у МЭЛТа такой же усовершенствованный МТ-10Т11-1 трёхвольтоввый без подсветки. Поделюсь нюансами. Контрастность при комнатной температуре отличная. I2C адрес в документации указан неверно, верный адрес оказался 56 десятичное, подобрал перебором в цикле и дихотомией этого цикла. Теоретически в другом образце может быть и другой. Подтягивающие резисторы использовал 100К при 50 кбит/с. Быстрее не пробовал, должно хватать и на 100 кбит/с. Расчет показывает, что при коротких проводах и единственном приёмнике запас по быстродействию большой. В стандарте резисторы на абсолютно все случаи жизни, работать-то оно с ними будет, только электричества может не хватить. Открытый коллектор I2C - идеально для согласования уровней при разных напряжениях питания. Порядок сегментов теперь другой - abfgecdh от старшего бита слева к младшему справа. Удобнее стандартного порядка при написании знакогенератора. Текст из примера с сайта производителя корректно не отобразился. Символы записываются в дисплей слева направо, если отправить меньше 10-ти, на незаписанном месте отображаются старые с прошлой записи, не сдвигаются и не стираются сами. Код для Ардуино для проверки индикатора, переписанный под Ардуино из примера с сайта производителя (закомменчены строки для поиска адреса): #include <Wire.h> const char Logo10[10] = { 0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000, 0b10000000, 0b11111111 }; //abfgecdh получилось void setup() { Wire.begin(); Wire.setClock(100000); // для 8МГц (200000); // for(byte checkaddr=1; checkaddr<127; checkaddr++) // { // Wire.beginTransmission(checkaddr); Wire.beginTransmission(56); //Сформировать на I2C шине комбинацию START и передать SLAVE адрес устройства с битом операции записи Wire.write(0xCE); //11001110b - Kоманды настройки индикатора, в т.ч. экономичный режим LP выкл. Wire.write(0xE0); //11100000b - Адреса A2, A1, A0 = 000 Wire.write(0xF8); //11111000b - Банки памяти 0 на вход и на выход Wire.write(0xF0); //11110000b - не мигать //эти команды нужно передавать всякий раз, иначе вывод на дисплей не происходит несмотря на то, что в инструкции к PCF8576C написано, что достаточно оставить одну. Wire.write(0x00); //00000000b - Всё, команды выданы, дальше пойдут данные изображения, сначала самый левый for(byte i=0; i<10; i++) { //Цикл вывода байтов изображения Wire.write(Logo10[i]);//Вывод очередного байта в индикатор } Wire.endTransmission() ; //Завершить цикл передачи, сформировав на I2C шине комбинацию STOP, вроде бы она и запускает передачу всего вышенаписанного. // } } Код для Ардуино для вывода через знакогенератор: Чтобы не перегружать программу вывода на дисплей проверками, создал знаки для всей таблицы ASCII, кроме пяти последних. Какие-то из них кракозябры, какие-то похожи. Буквы W, M и X занимают по два знакоместа, писать их надо Ww, Mm и Xx соответственно, а лучше вообще не использовать, как и K. Вместо z знак тождества. Вместо + писать +- . Заглавные и строчные буквы отличаются, когда могут. Для красоты надписи может иметь смысл те или те. Всё лежит в памяти программ и не копируется без нужды в память данных. #include <Wire.h> #include <avr/pgmspace.h> char Logo10StringVar[11] = "HELLOWwORD"; const byte ASCIItab[91] PROGMEM = { 0b00000000, 0b01000001, 0b01100000, 0b11110000, 0b10110110, 0b01011000, 0b11111010, 0b01000000, 0b10101010, //( 0b11000110, //) 0b10010000, 0b01010100, 0b00000001, 0b00010000, 0b00000001, 0b01011000, 0b11101110, //0 0b01000100, 0b11011010, 0b11010110, 0b01110100, 0b10110110, 0b10111110, 0b11000100, 0b11111110, 0b11110110, //9 0b10110010, 0b11010010, 0b00011010, 0b00010010, 0b00010110, 0b11011000, 0b10011110, 0b11111100, //A 0b00111110, 0b10101010, 0b01011110, 0b10111010, 0b10111000, 0b10101110, 0b01111100, //H 0b01000100, 0b01000110, 0b10111100, 0b00101010, 0b11101000, 0b11101100, 0b11101110, 0b11111000, //P 0b11110100, 0b10101000, 0b10110110, 0b00111010, 0b01101110, 0b00001110, 0b00101110, 0b11000110, 0b01110110, 0b11011010, //Z 0b10101010, 0b00110100, 0b11000110, 0b11100000, 0b00000010, 0b00100000, 0b11111100, //a 0b00111110, 0b00011010, 0b01011110, 0b11111010, 0b10111000, 0b11110110, 0b00111100, //h 0b00101000, 0b01000110, 0b10111100, 0b00101010, 0b11100100, 0b00011100, 0b00011110, 0b11111000, //p 0b11110100, 0b00011000, 0b10110110, 0b00111010, 0b01101110, 0b00001110, 0b01001110, 0b10101010, //x 0b01110110, 0b10010010 }; //abfgecdh // 1 // 3 2 // 4 // 5 6 // 7 8 void setup() { Wire.begin(); Wire.setClock(100000); // для 8МГц (200000); Wire.beginTransmission(56); //Сформировать на I2C шине комбинацию START и передать SLAVE адрес устройства с битом операции записи Wire.write(0xCE); //11001110b - Kоманды настройки индикатора, в т.ч. экономичный режим LP выкл. Wire.write(0xE0); //11100000b - Адреса A2, A1, A0 = 000 Wire.write(0xF8); //11111000b - Банки памяти 0 на вход и на выход Wire.write(0xF0); //11110000b - не мигать //эти команды нужно передавать всякий раз, иначе вывод на дисплей не происходит несмотря на то, что в инструкции к PCF8576C написано, что достаточно оставить одну. Wire.write(0x00); //00000000b - Всё, команды выданы, дальше пойдут данные изображения, сначала самый левый for(byte i=0; i<10; i++) { //Цикл вывода байтов изображения Wire.write(pgm_read_byte(&ASCIItab[Logo10StringVar[i]-32]));//Вывод очередного знака в индикатор. 32 - это код первого (нулевого) отображаемого символа, пробела. } Wire.endTransmission() ; //Завершить цикл передачи, сформировав на I2C шине комбинацию STOP (вроде бы эта команда и отправляет всё) } Надеюсь, это кому-то поможет. Индикатор красивый, мне понравился. Изменено 23 ноября, 2023 пользователем Kerby Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 ноября, 2023 Опубликовано 23 ноября, 2023 · Жалоба 9 часов назад, Kerby сказал: I2C адрес в документации указан неверно, верный адрес оказался 56 десятичное Вопрос спорный. Адрес располагается в 7 старших битах 8-битной посылки и некоторые указывают содержимое всего байта. Ваши 56 десятичных - это 00111000, а 0x70 - это 01110000. Как видно, 0x70 - это ваши 56 плюс бит R/W. 9 часов назад, Kerby сказал: Подтягивающие резисторы использовал 100К при 50 кбит/с. Удачного хождения по граблям. Кто не хочет граблей - ставят эти резисторы в 20-40 раз меньшего сопротивления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kerby 0 30 ноября, 2023 Опубликовано 30 ноября, 2023 · Жалоба On 11/23/2023 at 11:50 AM, Сергей Борщ said: Удачного хождения по граблям. Кто не хочет граблей - ставят эти резисторы в 20-40 раз меньшего сопротивления. Upd: На 50000 бит/с с единственным приёмником работает стабильно, на 100000 уже не всегда. Провод 2 см. Увы, нет достаточно электричества для 4К7. On 11/23/2023 at 11:50 AM, Сергей Борщ said: Вопрос спорный. Адрес располагается в 7 старших битах 8-битной посылки и некоторые указывают содержимое всего байта. Ваши 56 десятичных - это 00111000, а 0x70 - это 01110000. Как видно, 0x70 - это ваши 56 плюс бит R/W. Точно! Получается, если вручную бит менять/отправлять, 0x70 зайдёт отлично, а если через библиотеку Ардуиновскую, то сдвигать до 0x38 надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 30 ноября, 2023 Опубликовано 30 ноября, 2023 · Жалоба 1 час назад, Kerby сказал: Upd: На 50000 бит/с с единственным приёмником работает стабильно, на 100000 уже не всегда. Провод 2 см. Увы, нет достаточно электричества для 4К7. Странное заявление. Если немного подумать, то можно догадаться, что увеличение скорости обмена должно снижать потребление. А 50ю килобитами вы сами же себе увеличиваете его. Для экономии энергии следует поставить подтяжки, требуемые спецификацей I2C по верхнему диапазону и работать на максимальной скорости поддерживаемой LCD. И "нет электричества" это не оправдание для халтуры в разработке. То что "на вашем столе работает стабильно" не гарантирует стабильности работы у пользователя вашего девайса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kerby 0 30 ноября, 2023 Опубликовано 30 ноября, 2023 (изменено) · Жалоба 22 hours ago, jcxz said: Странное заявление. Если немного подумать, то можно догадаться, что увеличение скорости обмена должно снижать потребление. Кстати, да. Процессорное время уменьшается, остальное то же самое. 33 кОм с некоторым запасом для коротких проводов и одного потребителя для 100 кГц как раз по даташиту выходит. Cb - ёмкость шины. * это от ATmega328P. Изменено 1 декабря, 2023 пользователем Kerby Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться