Перейти к содержанию
    

MT-10T11 и PBP

Купил недавно в "Чип-И-Дип"е жидкокристаллический дисплей 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

 

С пожеланиями успехов,

Меджикивис.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выпускает эту сборку отечественная фирма "МЭЛТ".

.....

Прошерстил кучу сайтов, в том числе весь МЭЛТ-овский форум, пока разобрался с этой чехардой с питаниями. В этом году - 11 лет, как производитель не удосуживается поправить документацию! Какое, ббблин, тут импортозамещение"?!!..

[offtopic ON]

....

-А ты на въезде большой красный флаг видел?

-Видел.

-Так вот этот флаг один на все ямки.

[offtopic OFF]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На шине I2C обязательно должны быть подтягивающие резисторы к питанию. У меня стояли 4.7 кОм, как рекомендовано в хелпе команды I2CWRITE.

Но потом я попробовал, оказалось что все работает и на внутренней подтяжке PORTB МК:

OPTION_REG.7 = 0

делайте, как вам удобнее.

Не слушайте Меджикивиса, всегда ставьте внешние подтяжки. Сопротивление внутренних подтяжек имеет большой разброс и на порядок превышает рекомендованное стандартом I2C значение. Разумеется, желающие походить по граблям могут экономить на спичках.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сопротивление внутренних подтяжек имеет большой разброс
Ну, не знаю, с какими контроллерами такая фигня. На ПИКах проблем с подтяжкой нет. А у дисплея входы полевые, им хватает.

 

Что касается рекомендованного значения для I2C вообще, так я про это ничего и не говорил, а только про использование данного конкретного дисплея.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, не знаю, с какими контроллерами такая фигня. На ПИКах проблем с подтяжкой нет.
Вы не поверите... Вот вырезка из техописания указанного в вашем исходнике PIC16F84:

post-17095-1455649004_thumb.jpg

Что касается рекомендованного значения для I2C вообще, так я про это ничего и не говорил, а только про использование данного конкретного дисплея.
Вот этого не понял. Если у дисплея интерфейс I2C, надо делать как требует стандарт I2C. Если интерфейс другой - к чему упоминание I2C? Если стабильная работа не требуется - тогда другое дело, именно это я и имел ввиду, упомянув грабли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А у дисплея входы полевые, им хватает.

И емкости входов и монтажа нет ? Чудеса.... Кто требования стандарта не соблюдает - сам себе злобный Буратино...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы не поверите... Вот вырезка из техописания указанного в вашем исходнике PIC16F84:

* These parameters are characterized but not tested.

 

 

 

 

И емкости входов и монтажа нет ?
Есть. Но 10 см шлейфа видимо недостаточно, чтобы испортить праздник жизни :)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

* These parameters are characterized but not tested.
И что? Производитель обещает, что будет от 50 до 400, этот параметр вытекает из технологии и в отдельном выходном контроле не нуждается.

 

Надо сразу делать хорошо, плохо получится само. И уж тем более не нужно давать вредных советов, раз уж ваше сообщение было адресовано тем, кто не может победить I2C самостоятельно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тем, кто не может победить I2C

тем, кто не может победить дисплей MT-10T11 :) Не надо злонамеренно приписывать мне то, чего я не говорил.

(И вообще, зависть - плохое чувство...)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо топикстартеру, помог!

Купил пару месяцев назад у МЭЛТа такой же усовершенствованный МТ-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 (вроде бы эта команда и отправляет всё)
}

 

Надеюсь, это кому-то поможет.

Индикатор красивый, мне понравился.

Изменено пользователем Kerby

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Kerby сказал:

I2C адрес в документации указан неверно, верный адрес оказался 56 десятичное

Вопрос спорный. Адрес располагается в 7 старших битах 8-битной посылки и некоторые указывают содержимое всего байта. Ваши 56 десятичных - это 00111000, а 0x70 - это 01110000. Как видно, 0x70 - это ваши 56 плюс бит R/W.

9 часов назад, Kerby сказал:

Подтягивающие резисторы использовал 100К при 50 кбит/с.

Удачного хождения по граблям. Кто не хочет граблей - ставят эти резисторы в 20-40 раз меньшего сопротивления. 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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  надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Kerby сказал:

Upd: На 50000 бит/с с единственным приёмником работает стабильно, на 100000 уже не всегда. Провод 2 см. Увы, нет достаточно электричества для 4К7.

Странное заявление. Если немного подумать, то можно догадаться, что увеличение скорости обмена должно снижать потребление. А 50ю килобитами вы сами же себе увеличиваете его. Для экономии энергии следует поставить подтяжки, требуемые спецификацей I2C по верхнему диапазону и работать на максимальной скорости поддерживаемой LCD.

И "нет электричества" это не оправдание для халтуры в разработке. То что "на вашем столе работает стабильно" не гарантирует стабильности работы у пользователя вашего девайса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, jcxz said:

Странное заявление. Если немного подумать, то можно догадаться, что увеличение скорости обмена должно снижать потребление. 

Кстати, да. Процессорное время уменьшается, остальное то же самое.

33 кОм с некоторым запасом для коротких проводов и одного потребителя для 100 кГц как раз по даташиту выходит. Cb - ёмкость шины.

изображение_2023-11-30_092631398.png

* это от ATmega328P.

Изменено пользователем Kerby

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...