Для строчных дисплеев Winstar очень соблазнительно сократить число управляющих соединений, которых даже при четырехпроводном включении получается не меньше шести (R/W можно не подключать, см. вот эту публикацию автора). Говорят (в том числе и сами винстары, см. оф. сайт), что контроллер WS0010 может управляться по SPI (а некоторые даже и по I2C!), но инструкций в документации на эту тему упорно не помещают, и как с этим управляться — непонятно. К тому же SPI помогает не сильно — вместо шести соединений получаем четыре привязанных к дисплею, потому что еще для каких-то целей SPI в любительской практике употребляют нечасто. Потому самое удобное решение в плане сокращения числа соединений для стандартных плат Arduino — использовать так называемый расширитель (экспандер) портов на основе шины I2C под названием PCF8574. Это позволяет сократить число необходимых соединений до двух (не считая питания), причем на основе выводов стандартного порта TWI, что не мешает подключать к нему же различные датчики, часы и т.п.

Вообще-то микросхема PCF8574 может быть приспособлена к большому количеству самых разных применений (считывание кнопок, засвечивание светодиодов и т. п.). В режиме записи микросхема при этом напрямую транслирует значение битов в переданном по шине I2C байте в состояние восьми выходов (при чтении, наоборот, состояние восьми линий передается в передаваемый байт). I2C-адрес в PCF8574 может меняться установкой уровня на трех входах задания адреса, так что с помощью одной шины по двум проводам можно устанавливать или читать состояние до 64 линий. В этом деле имеются некоторые особенности из-за несимметрии состояний «0» и «1» выводов параллельного порта PCF8574, причем как при работе на вход, так и на выход (см. здесь), но нашей задаче управления ЖК- или OLED-дисплеями по шине I2C они не помешают.

Нет даже необходимости разводить переходную плату для дисплеев самостоятельно. Специально для управления HD44780-совместимыми дисплеями выпускаются многочисленные разновидности модулей-переходников (см. фото). По одному краю у них установлен игольчатый однорядный разъем типа PLS, разводка которого позволяет напрямую стыковать такой модуль с ЖК- или OLED-дисплеем.

Модуль для управления дисплеями по шине I2C

Если при этом ориентировать модуль так, чтобы вывод модуля номер 1 (отсчет ведется от входного разъема, см. фото выше) совпадал с выводом 1 дисплея, то плату-переходник можно установить прямо на плату дисплея так, как показано на фото ниже (фото с сайта 9zip.ru). При этом, конечно, должен совпадать и шаг выводов и сам тип разъема. Поэтому среди распространенных строчных OLED-дисплеев Winstar так, как на картинке, подключить можно только типы WEH1602A и 2004A, для типа 1602B модуль придется поворчивать на 180, а для любимых народом 2002A/B и 1202/1204 изготавливать переходные кабелЯ.

Подключение I2C-модуля к дисплею

Разводка выводов для случая OLED-дисплея показана в таблице. Если вы хотите вместо готового модуля самостоятельно подключить микросхему (что позволит уменьшить габариты), но собираетесь использовать описанную далее библиотеку, то по этой таблице можно также определить правильное подключение «голой» микросхемы. Отметим, что фактически здесь используется четырехпроводная схема подключения дисплея и биты DB0-DB3 не подключены никуда, поэтому в таблице обозначены серым цветом.

Разводка выводов при подключении PCF8574 и модуля на ее основе к OLED-дисплею
Разводка выводов при подключении PCF8574 и модуля на ее основе к OLED-дисплею

Синенький подстроечный резистор, а также перемычка на торце платы, которые видны на фото, предназначены для управления подсветкой в ЖК-дисплеях (выводы 15 и 16) и в нашем случае не задействуется. (Кстати, то же самое относится к биту Р3 выходного порта PCF8574, который в нашем случае не используется.) Поэтому при подключении напрямую OLED-дисплея 1602B, у которого выводы 15 и 16 находятся перед выводом 1, их можно просто не подключать (а у модуля при этом 15 и 16 выводы придется удалить, чтобы не мешались).

Под этим резистором на плате имеются контакты A0, A1 и A2 для задания младших битов I2C-адреса. По умолчанию они подключены к высокому уровню, поэтому адрес имеет наибольшее возможное значение из заданного диапазона. Микросхемы PCF8574 выпускаются в нескольких модификациях, отличающихся этим диапазоном. Для PCF8574 без буквенного индекса (или у PCF8574Т) адрес по умолчанию будет равен 0x27, и может меняться в меньшую сторону до 0x20. У PCF8574A адрес по умолчанию равен 0x3F и меняется до 0x38.

Для работы с дисплеем, подключенным через PCF8574 по I2C-интерфейсу, имеется рекомендованная библиотека под названием LiquidCrystal_I2C (см. официальный сайт arduino.cc). Разумеется, как и оригинальная LiquidCrystal, она работает только с английским языком. Русскоязычных версий ее не имеется (по крайней мере, таких, которые бы уверенно работали в современных версиях Arduino IDE), и вариант для работы с OLED-дисплеем тоже отсутствует. Поэтому автор взял на себя труд доработки, приняв за исходный самый простой из вариантов LiquidCrystal_I2C.

Очевидным методом русификации было бы объединить LiquidCrystal_I2C и LiquidCrystalRus, доработав последнюю в части инициализации OLED-дисплеев. Но лобовое решение здесь не прокатывает — в I2C-режиме LiquidCrystalRus выводит только первую букву посланной через функцию print() строки. С чем это связано, я разбираться не стал, попросту дополнив библиотеку LiquidCrystal_I2C своей функцией вывода outStr(), которая отбрасывает старший байт кодировки UTF-8, а младший перекодирует в символ из внутренней таблицы ENGLISH_RUSSIAN (0x02) контроллера WS0010.

Исправленную и дополненную версию под названием LiquidCrystal_I2C_OLED можно скачать отсюда. Если строка не содержит русских букв, то ее следует выводить обычной функцией print(), которая работает быстрее. Значок градуса, а также буквы «ё» и «Ё» выводить можно только прямым указанием восьмеричных кодов (например, «всё» — «вс\265», «22,5°» — «22,5\337», см. таблицу далее). Примеры вывода имеются в папке examples (не забудьте сменить адрес микросхемы PCF8574, если у вас версия, отличная от PCF8574A или адрес изменен переключением бит модификации). Пример вывода русского алфавита на дисплей конфигурации 1602 (микросхема PCF8574A, адрес по умолчанию 0x3F):

#include <Wire.h> 
#include <LiquidCrystal_I2C_OLED.h>
LiquidCrystal_I2C OLED1(0x3F,16,2);  // Устанавливаем дисплей
void setup()
{ 
  OLED1.init();                     
  OLED1.clear();
  OLED1.print("Proba"); //вывод английского
  OLED1.setCursor(7, 0); //середина верхней строки
  OLED1.outStr("Проба"); //вывод русского
  OLED1.setCursor(7, 1);//середина нижней строки
  OLED1.print("-22,3\337C"); //"-22,3°C"
  delay(1000);
}
void loop()
{//для дисплея 16х2 или 20х2!!!!
  OLED1.setCursor(0, 0); //начало верхней строки
  OLED1.outStr("АБВГДЕЖЗИЙКЛМНОП");
  OLED1.setCursor(0, 1);//начало нижней строки
  OLED1.outStr("абвгдежзийклмноп");
  delay(2000);
  OLED1.setCursor(0, 0); //начало верхней строки
  OLED1.outStr("РСТУФХЦЧШЩЪЫЬЭЮЯ");
  OLED1.setCursor(0, 1);//начало нижней строки
  OLED1.outStr("рстуфхцчшщъыьэюя");
  delay(3000);
}

Корректный результат вывода первой половины алфавита показан на фото:

результат вывода алфавита

Подчеркнем, что такая русифицированная библиотека (как и LiquidCrystalRus, кстати) предназначена для работы в современных версиях Arduino IDE (начиная примерно с 1.6.1 и далее) в среде Windows 7/8/10. В среде Arduino IDE 1.0, а также в других редакторах и ОС, работающих в однобайтовой кодировке win1251 (ANSI, cp1251), эти библиотеки прямой русский текст в строке не воспринимают. В этом случае следует пользоваться функцией print() с указанием восьмеричных кодов русских букв, согласно таблице ниже, только библиотеку все равно придется использовать эту (либо доработать LiquidCrystal_I2C для переключения в таблицу ENGLISH_RUSSIAN при инициализации, см. здесь). В контроллере WS0010 применен экономичный метод кодирования — вводятся только русские буквы, не совпадающие с английскими по начертанию. Например, «суббота» будет выглядеть, как «cy\262\262o\277a».

Коды кириллических символов и значка градуса для контроллера WS0010 (таблица ENGLISH_RUSSIAN, код 0x02)

Коды кириллических символов для контроллера WS0010

Признаком того, что ваша среда/редактор выдает вместо UTF-8 однобайтную кодировку win1251 будет вывод вместо «А» — «ч», вместо «а» — «Д» и т. п. (фото прислал Tomasina):

Результаты вывода текста в кодировке cp1251

Если не справитесь с выяснением причин, откуда в современных средах под Windows берется однобайтовая кодировка, то остается только либо воспользоваться прямым выводом кодов, как указано выше, либо просто изменить в моей функции outStr() по очереди все коды младшего байта UTF-8 на код из таблицы win1251. Например, оператор case 0x90 (заглавная «А») заменяем на case 0xC0 и так далее, при этом строки, фильтрующие старший байт (case 0xd0: break; и case 0xd1: break;) необходимо удалить.

Комментарии (59)


  1. Dark_Purple
    15.11.2017 10:36

    Заголовок безграмотный.


  1. WebConn
    15.11.2017 13:32

    Ваша работа, бесспорно, полезна. Но заголовок в самом деле неоднозначный.

    Когда я увидел заголовок, сразу вспомнилась проблема с выбором конкретного дисплея, так как не во всех винстаровских дисплеях зашита кириллица. Нарочно не искал способ решения, думал в своё время просто дорисовать недостающие символы в CGRAM, но в итоге просто отложил дисплей на полку.


    1. YRevich Автор
      15.11.2017 15:26

      Поменял, спасибо.


    1. Barnaby
      15.11.2017 16:18

      Это для более быстрой отрисовки и экономии RAM?
      В либе для ssd1306 которую я нашел вся таблица лежит в массиве, можно спокойно рисовать свои символы. Инересно, там тоже есть зашитая в контроллер таблица?


      1. Andy_Big
        15.11.2017 16:23

        Чтобы это выяснить нужно 30 секунд на поиск в гугле и еще 40-50 секунд для беглого просмотра результата поиска — http://www.buydisplay.com/download/ic/SSD1306.pdf :)
        Если это слишком сложно, то ответ — в контроллере нет зашитых таблиц.


  1. Andy_Big
    15.11.2017 13:53

    М-да, мое мнение об ардуинщиках после этой статьи ничуть не повысилось :)


    1. smart_alex
      15.11.2017 15:22

      Наше мнение о снобах, с пустым профилем без единой статьи и проекта тоже не повысилось. И при этом позволяющим себе пренебрежительно высказываться о системе на которой создано бесчисленное количество замечательных проектов и которая позволила приобщиться к миру микроконтроллеров миллионам людей во всём мире. (Это безотносительно этой конкретной статьи.)


      1. Andy_Big
        15.11.2017 15:51

        с пустым профилем без единой статьи

        А если бы у меня в профиле было два десятка статей на медицинскую тему — мое мнение об ардуинах было бы более весомым? :))


        на которой создано бесчисленное количество замечательных проектов и которая позволила приобщиться к миру микроконтроллеров миллионам людей

        Да, а Лего позволил приобщиться миллионам людей к архитектуре и роботостроению :)
        Я не умаляю достоинств ардуины, но нужно называть вещи своими именами: миллионы людей приобщились не к миру микроконтроллеров, а к миру конструктора на их основе.


        1. smart_alex
          15.11.2017 16:07

          Если бы у вас в профиле было 20 статей на медицинскую тему, то тогда была бы объективная возможность отличить вас от досужего болтуна. По моим наблюдениям, чем большее пренебрежение к Ардуино высказывает человек, тем меньше у него проектов, статей и реальных дел.


          1. Andy_Big
            15.11.2017 16:19

            Ваши наблюдения ошибочны :) Я, например, живу за счет своих проектов и реальных дел, которыми пользуются тысячи людей :)


            1. smart_alex
              15.11.2017 16:26

              Ок, но Ардуину мы в обиду не дадим. :)


  1. sav13
    15.11.2017 16:06

    Лучше скажите, где брать недорогие дисплей 1602 с кириллицей?
    Кто-то делает?


    1. WebConn
      16.11.2017 00:41

      Тот же Winstar делает, надо только смотреть даташиты на конкретные дисплеи на предмет кириллической таблицы (там прямо отдельные страницы с этими таблицами).


      1. YRevich Автор
        16.11.2017 06:41

        Их еще делает МЭЛТ у нас, там кириллица гарантированная и притом никаких переключений таблиц не требуется. ЖК у них очень дешевые, но OLED-разновидностей мало, и за ту же цену — думаю, они матрицы готовые покупают.


  1. BARSRAB
    15.11.2017 19:48

    SPI используется нечасто? Серьёзно? При том, что это один из самых быстрых интерфейсов? Может быть у ардуинщиков и не часто, но разработчиков очень часто.


    1. YRevich Автор
      16.11.2017 06:50

      Вы невнимательно читали, там русским по белому написано: «в любительской практике».


      1. BARSRAB
        16.11.2017 07:33

        А для любителей выпускаются отдельные серии микросхем без spi? Дисплеи, АЦП, ЦАП, датчики. Что тогда вообще используют «любители»? Голый МК, кнопки и светодиоды?


        1. Andy_Big
          17.11.2017 02:20

          "Любители" используют широко распространенные ардуиновские библиотеки. Шаг влево или вправо от этих библиотек — и это уже "профессионал" :)


          1. BARSRAB
            17.11.2017 07:23

            Кажется, я выбрал не тот уровень сложности, когда начинал изучать МК, ибо делал это без ардуйни xD


            1. YRevich Автор
              17.11.2017 07:46

              Когда я начинал изучать МК, у них еще не было флеш-памяти, а стирание производилось ультрафиолетом. И о таких инструментах, как AVRStudio, еще и не мечтали, Ардуино и в проекте не существовало, потому как не существовало AVR. Си-компилятор от IAR стоил бешеные деньги, потому все всё делали на ассемблере в текстовом редакторе. Первый AVR1200 встречали, как манну небесную. Я с удовольствием воспринимаю все новое, если оно действительно помогает, облегчает, упрощает и т.п. Но не более того: бритву Оккама никто никогда не отменял.


              1. BARSRAB
                17.11.2017 09:07

                Ардуйня далеко не новое и на счет облегчения и упрощения можно сильно поспорить, т.к. на выходе получаем абсолютно непредсказуемую прошивку, которая может в любой момент повиснуть. Точнее дело не в самой ардуйне, а в их калечных библиотеках. Хотя проблема с готовыми библиотеками не только там. Например встроенная в CodeVision библиотеку 1-Wire запрещает все прерывания при работе с шиной. К зависанию, конечно, это не приводит, но все равно довольно неприятная «фишка». Хотите использовать плюшки ардуйни в виде кучи готовых модулей? Да пожалуйста. Только для этого совсем не обязательно писать код в Arduino IDE. Открываем ту же AVR Studio, пишем свои библиотеки и получаем отличную платформу для обкатки прошивок. Только результат становится абсолютно предсказуемым.


  1. BARSRAB
    15.11.2017 19:54

    Ну и зря считаете, что если у человека нет десятка статей на гиктаймс, то он болтун. На их написание нужно время, а когда человек занят работой, а не баловством с ардуйней, то как раз его у него и нет.


  1. IncVizitor
    16.11.2017 06:41

    Спасибо за то, что вы сэкономили мое время!


  1. enjoyneering
    16.11.2017 06:41

    Зачем вы переписали библиотеку? Можно было создать свою и унаследовать все классы оригинальной, разбавив своим кодом.


    1. YRevich Автор
      16.11.2017 06:46

      А еще можно создать свою среду Arduino — мне в ней тоже не все нравится. Но почему-то я этого не делаю. Интересно, почему?


      1. BARSRAB
        16.11.2017 07:39

        Ясное дело, не умеете, вот и не делаете.


        1. YRevich Автор
          16.11.2017 08:22

          Да ну? Научиться этому не так уж сложно. Проще, чем написать все на чистом ассемблере, как я это делал ранее. Но если у высокоуровневого языка и есть преимущества, то они заключаются именно в готовых библиотеках, макросах и т.п.
          Которые при необходимости можно чуток подрихтовать, не теряя времени на отладку всего массива кода. Я ведь не программы пишу, а работающую схему ваяю. И коли схема работает, то совершенно неважно как там вы все это оформили — чем быстрее справились, тем лучше. Это, если вы не в курсе, нормальный подход электронщика, программеры могут возмущаться сколько влезет.


          1. BARSRAB
            16.11.2017 12:08

            Не сложно, но вам не дано, т.к. без готовых библиотек вы работать не умеете. При этом в корне неверно понимаете смысл применения ОО языков.


            1. YRevich Автор
              16.11.2017 14:29

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


            1. YRevich Автор
              16.11.2017 14:39

              Да, и еще вдогонку: если мне сейчас предложили делать серьезный проект на AVR, я бы не только от ОО отказался, я бы и простое С обошел. На ассемблере много надежней. В том-то и разница между электронщиком и программистом, что для первого чем меньше посредников, тем лучше. Есть и другие принципиальные соображения, применимые конкретно к архитектуре AVR. Ардуино — это удобная прибамбасина, которая позволяет минимумом усилий достичь вполне рабочих результатов. И ничего за этими пределами — если усилия превышают некоторый порог, то проще от такого инструмента отказаться, и делать все руками.


              1. BARSRAB
                16.11.2017 15:17

                На ассемблере много надежней

                Не надо бросаться в крайности. Он лишь быстрее, но надежность с ним ни чем не выше. Да и выигрыш в скорости есть лишь при выполнение каких-то сложных расчетов, для которых AVR в принципе не сильно подходит. Есть еще выигрыш в размере прошивки, но сейчас это мало актуально.


                1. YRevich Автор
                  16.11.2017 15:53

                  Вы просто не в курсе. Размещение данных в SRAM, а не сразу в регистрах (которых у AVR аж 32) дает замедление сразу в два-три раза на каждую операцию с данными. Это если не говорить о таких наворотах, как PROGMEM. А С по-другому не умеет, ибо приспособлен к фон-неймановской архитектуре, а не гарвардской. Это касается скорости. А что до надежности, то когда я сам отвечаю за то, где что разместить и каким путем выполнить, а не дядя, неизвестно какую оптимизацию наворотивший в компиляторе, то это уже не убеждение, а уверенность.


                  1. BARSRAB
                    16.11.2017 16:49

                    дает замедление сразу в два-три раза на каждую операцию с данными.

                    И часто вам надо производить высокоскоростные операции на таких убогих МК (да, да, AVR одни из самых убогих и малофункциональных МК на рыке)? Да такие, когда разница в 2-6 тактов играет существенную роль? Что-то сомневаюсь.

                    А что до надежности, то когда я сам отвечаю за то, где что разместить и каким путем выполнить, а не дядя, неизвестно какую оптимизацию наворотивший в компиляторе, то это уже не убеждение, а уверенность.

                    И что вам дает это знание? Ровным счетом ничего. И уж точно никак не влияет на надежность работы МК.


                    1. YRevich Автор
                      16.11.2017 17:29
                      +1

                      «И часто вам надо производить высокоскоростные операции на таких убогих МК (да, да, AVR одни из самых убогих и малофункциональных МК на рыке)»
                      — вы не поверите, но часто. Причем именно 8-разрядные тут рулят. Насчет убогости — это типичное приглашение поучаствовать в очередном холиваре, и не заслуживает внимания.


                      1. BARSRAB
                        16.11.2017 17:39
                        -1

                        Расскажите, в чем же они рулят. И почему именно AVR, где даже тактовую на ходу поменять нельзя. Или рулят по тому, что с другими вы не умеете работать?


                      1. BARSRAB
                        17.11.2017 08:55

                        Так что же, расскажете, по какой причине AVR и 8-битники «рулят»?

                        P.S.
                        Вот и минусовщики подтянулись. Самим сказать нечего, а вот оценки ляпать — самое то.


                    1. YRevich Автор
                      16.11.2017 17:36

                      Вдогонку — я был неточен в предыдущем посте: в регистрах нужно размещать, конечно, не «данные», а «переменные». Прошу прощения за оговорку.


                      1. Andy_Big
                        17.11.2017 03:08

                        Интересное уточнение. Тоже много говорящее о Вашем опыте :)


                  1. Andy_Big
                    17.11.2017 02:39

                    Си вообще пофиг где располагаются переменные — это епархия компилятора. И архитектура к Си имеет очень слабое отношение.


                    когда я сам отвечаю за то, где что разместить и каким путем выполнить, а не дядя, неизвестно какую оптимизацию наворотивший в компиляторе

                    Я же говорю — Вы просто не освоили нормально Си и директивы его компилятора :) И имеете какое-то устаревшее лет на 15 представление о возможностях нормальных компиляторов :)


              1. Andy_Big
                17.11.2017 02:29

                На ассемблере много надежней

                Обычно так говорят те, кто не освоил нормально С/С++ :) На ассемблере не надежнее, и даже почти не быстрее и почти не компактнее. Современные компиляторы в умелых руках создают очень оптимальный код.


                В том-то и разница между электронщиком и программистом, что для первого чем меньше посредников, тем лучше.

                То электронщик у Вас любит ардуину потому что "совершенно неважно как там вы все это оформили — чем быстрее справились, тем лучше", то электронщик не любит лишних посредников, чьим очень жирным представителем является ардуина. Вас, электронщик, не поймешь :)


      1. enjoyneering
        16.11.2017 19:59

        Ну вот смотрите, например автор исходников LiquidCrystal_I2C исправит кучу багов или перелопатит весь код сделая ее быстрее. Вам придется посидеть вечерок занимаясь копи-пастой, чтоб привести ваш код к новому виду.
        С наследованием такого не будет — вам только нужно будет перезаписать LiquidCrystal_I2C в папке библиотек и все.


        1. Andy_Big
          17.11.2017 03:09

          Он не умеет, все же просто.


  1. CyberKot
    16.11.2017 08:52

    Ардуинскую библиотеку TWI тоже поправить нужно. У неё внутре неонка есть весёлый while без выхода по таймауту (или количеству циклов), который вешает всю ардуину при малейших косяках при коммуникации по этому протоколу.
    Особенно актуально при наводках или помехах по питанию.


    1. YRevich Автор
      16.11.2017 09:23

      Вы, наверное, программист, а не электронщик. Посмотрите на аппноты Atmel — там куча образцов алгоритмов, в которых бесконечные циклы ожидания без всяких выходов. Почему так? А потому, что конструкция все равно не будет работать, если в TWI обрыв. Куда ее выводить по таймауту? Эта только лишнее и ничем не оправданное усложнение в программе, все равно ничего продуктивного она не сделает.


      1. CyberKot
        16.11.2017 09:45

        Если, доспустим, мой терморегулятор будет делать своё дело, но на экране будет пусто или крякозябры — то флаг ему в руки. А если при попытке вывода температуры на экран он зависнет и заморозит (или наоборот вскипятит) всё вокруг — то тут начинаются вопросы.
        А дело всего-навсего в одной проверке, которая резко повысит стабильность системы.


        1. YRevich Автор
          16.11.2017 11:18

          В этом конкретном случае возможно. Но дело в том, что нет никаких оснований считать интерфейс TWI менее надежным, чем компоненты терморегулятора. Скорее (точнее, наверняка) наоборот. И под этот редчайший случай загромождать библиотеку операциями, которые никогда не будут востребованы? В космосе или военке, в медицине я бы, безусловно, так и сделал, а для бытового прибора, у которого скорее перегорит нагреватель от того, что забыли налить воду — совершенно ни к чему.


          1. BARSRAB
            16.11.2017 13:11

            TWI надежен ровно до тех пор, пока к нему не лепят библиотеки от ардуйни, 90% которых кривые и глючные. И не надо думать, что для бытовых применений не нужна надёжность. Представьте, что ваш телевизор по 5 раз в день зависает. Понравится?


            1. YRevich Автор
              16.11.2017 14:25

              BARSRAB, мне казалось, что мы серьезно обсуждаем организацию процесса, а не «библиотеки от ардуйни, 90% которых кривые и глючные». Это вообще не о том и голословная болтовня, а не аргумент. Никакой такой особой глючности в TWI я не замечал. Ни при собственной реализации на ассемблере, ни путем ардуино-библиотеки. Годами работает без единого сбоя, по собственному опыту. Там, что ни говори, есть немало упущений, но уж к TWI это точно не относится. Он и спроектирован так, чтобы работать с минимальными хлопотами.


              1. BARSRAB
                16.11.2017 15:34

                Он и спроектирован так, чтобы работать с минимальными хлопотами.

                К TWI у меня никаких претензий, только к ардуйне, с ее внезапными бесконечными циклами ожидания.


                1. YRevich Автор
                  16.11.2017 16:04

                  Еще раз — поглядите аппноты от Atmel. Я попервоначалу — лет двадцать назад — тоже дергался, искал способы выхода из таких бесконечных циклов, но потом понял, что это просто не надо.


                  1. BARSRAB
                    16.11.2017 16:32

                    искал способы выхода из таких бесконечных циклов

                    Ок. Представим ситуацию. МК управляет неким объектом, пусть будет теплица. К нему подключена та же EEPROM по I2C, в которую он раз в некий промежуток времени записывает температуру, влажность и т.п. Как видно, функция второстепенная. А теперь представим, что EEPROM перестала отвечать (умерла, намокла, и.д.) и МК тупо висит в цикле и ждет второго пришествия, вместо того, чтобы сообщить оператору о неисправности. Считаете, что это нормальная ситуация? Лично я нет. МК никогда и ни при каких ситуациях не должен виснуть. Если же он виснет от элементарной поломки I2C периферии, то место такого девайса на свалке.


                    1. YRevich Автор
                      16.11.2017 16:47

                      Я же совсем не отрицаю, что такие ситуации бывают. Сам искал когда-то выходы из неисправности EEPROM и внутренней (в Classic она была слабо защищена) и внешней, хотя бы в виде диагностики ошибок. И намоделировать таких случаев можно много. Но это не значит, что всегда и во всех случаях бесконечные циклы совершенно неприемлемы и их нужно пугаться. Просто трезво оценивать вероятности и последствия и цену их преодоления. То, что в библиотеках Arduino их применяют — не катастрофа, и даже не противоречит официальной идеологии производителя. Вот я о чем.


                      1. Andy_Big
                        17.11.2017 03:04

                        Использование библиотек с такими "бомбами" — это катастрофа и есть. Потому что их используют по большей части те, кто не сможет их проверить, даже если и захочет — элементарно знаний не хватит.
                        Вас вон не хватило даже на то, чтобы найти причину глюка в библиотеке LiquidCrystalRus, то есть Вы не знаете что творится внутри используемой Вами библиотеки, хотя точно знаете, что работает она некорректно.
                        Нет, извините, но такой подход к проектированию — это диагноз, и большинство ардуинщиков как раз его и практикуют. Взять какие-то библиотеки, зачастую левые, найденные в сети, кое-как костылями заставить их заработать по нужному сценарию — и все, изделие готово!
                        Представляю беседу инженеров в каком-нить самсунге:


                        • У нас тут одна подпрограмма в смартфоне не очень, может зависнуть и привести к возгоранию батареи...
                        • Да хрен с ней, это же не для военки. Все равно пользователь скорее всего раньше уронит и разобьет телефон.


          1. Andy_Big
            17.11.2017 02:49

            Но дело в том, что нет никаких оснований считать интерфейс TWI менее надежным, чем компоненты терморегулятора. Скорее (точнее, наверняка) наоборот.

            Как бы то ни было, но любую часть системы нужно делать максимально надежной. Вы-то, как электронщик, должны знать как считается надежность изделия в целом :) А рассуждать "да все равно вон та деталь менее надежна, так что можно и над надежностью других деталей не париться" :)


            И под этот редчайший случай загромождать библиотеку операциями, которые никогда не будут востребованы?

            Простите, но по отношению к ардуине это выглядит просто смешным :) Когда при использовании ее библиотек код имеет объем раза в полтора-два больше, чем написанный без ее использования :) И быстродействие настолько же меньшее.


            В космосе или военке, в медицине я бы, безусловно, так и сделал, а для бытового прибора, у которого скорее перегорит нагреватель от того, что забыли налить воду — совершенно ни к чему.

            А вот это вообще прекрасно. Бытовому прибору надежность ни к чему :) В ногу со временем шагаете, любой производитель Вас поддержит. Главное, чтобы Ваше "ни к чему" в период гарантии не случилось :)
            Ну и никто Вас не пустит к военке или космосу с ардуинами, разумеется :)


            1. YRevich Автор
              17.11.2017 07:02

              Andy, когда некто упорно не желает читать то, что написано, а выдумывает из собственной головы за оппонента, и сутками приходится доказывать, что «я имел в виду это, а не это» (хотя там все было сформулировано и без того), желание общаться пропадает напрочь. Вы вместе с BARSRAB — сутяжники, цель которых, очевидно, доказать, что оппонент дурак и недоучка. А я уже скоро лет тридцать, как вышел из возраста, в котором непременно требуется сказать последнее слово. Удачи вам в ваших добрых делах!


              1. BARSRAB
                17.11.2017 08:39

                Если бы проблема была лишь в одной библиотеке, то ладно. Но это болезнь агрдуйни.


              1. Andy_Big
                17.11.2017 17:05

                Я прочитал и даже процитировал что написано.
                И доказать я стараюсь, что Ваш подход к разработке микроконтроллерных систем непригоден для серьезных задач, применять его можно только для мелких домашних поделок типа часов или "метеостанций".
                Микроконтроллеры и компиляторы для них за 30 лет сильно изменились, но Вы, кажется, этого не заметили.


                ЗЫ: Вы мне напоминаете моего знакомого, который тоже перешел от ассемблера к бейсику для AVR, так и не сумев освоить Си, и всем доказывал, что Си — это глючно и сложно, Си++ вообще неприменим для контроллеров, а вот Бейсик — это самое то.


                1. YRevich Автор
                  17.11.2017 18:06

                  А откуда вы знаете мой «подход к разработке микроконтроллерных систем»? По этой публикации? А, да, по моим комментам, я понял. Я бы не стал на вашем месте делать подобных обобщений (и, собственно, никогда и не делал). Чтобы понять «подход к разработке микроконтроллерных систем», никаких комментов не может быть достаточно (потому я обычно на них не реагирую, и очень жалею, что сейчас ввязался). Я не считаю вообще правомерным понятие «подход к разработке микроконтроллерных систем». Этих подходов ровно столько, сколько проектов. И крупной ошибкой будет считать, что в этом плане существуют готовые рецепты на все случаи жизни. Для любительского термостата более, чем достаточно того, что я здесь излагал. Для медицинского прибора недостаточно даже этих ваших гарантированных выходов из цикла — там куда более крутые меры надо применять, чтобы ничего и ни-ни. Для космического аппарата без тщательно продуманного дублирования, линий связи с квитанциями, восстановлением ошибок и так далее даже подходить к проекту не стоит. И, кстати, там в начале всего даже не эта программная уйня, а продуманная схемотехника и выбор компонентов. Потому вы ничего не можете заключить о «подходе» из анализа того, что я говорил о любительском термостате.

                  ЗЫ: А насчет того, что «Си — это глючно и сложно» я с вашим знакомым согласен. Бейсик, правда, для контролеров не годится напрочь, потому что еще хуже Си, и вообще не годится не для чего — это говорит человек, который когда-то на встроенном MS-Бейсике кучу программ наваял, и ими пользовались. Но Си (который я изучал, когда вы еще в школу ходили, наверное) всегда мне напоминал произведение пьяного художника-конструктивиста. Менее логичный, хуже читаемый и более неудобный практически синтаксис еще надо очень постараться придумать.


  1. VT100
    18.11.2017 19:42

    К тому же SPI помогает не сильно — вместо шести соединений получаем четыре и опять же наглухо привязанные к дисплею, потому что еще для каких-то целей SPI в любительской практике употребляют нечасто.

    Прошу извинить, если недостаточно внимательно прочитал статью и обсуждение, но это… это похоже на незнание основ схемотехники, а именно — наличия входов разрешения (ChipSelect, CS, Enable, Inh[ibit] и т.п.). Всё с чем не требуется общение в данное время может быть отключено от шины.
    Даже, внезапно!, ЖКИ с параллельной шиной. И именно тем самым входом E[nable], которым снабжены контроллер HD44780 и армия его клонов. К сожалению, этот момент работы контроллера не выделен явно в тексте datasheet. Но из анализа временных диаграмм обмена и транзисторной структуры порта ввода-вывода данных — это следует как 2х2. Пытлиыве читатели могут найти не только явное подтверждение моим словам в документации на HD44780 или SPLC780, но и косвенные — в документации на алфавитно-цифровые модули с размером 40х4.