SSD1306+PROTEUS+DIGISPARK

14.06.2022 21:34, автор DiEitch

Всем привет.

Сегодня я отвечу сразу на три актуальных вопроса, на которые любители ардуино хотели бы получить ответ, да вопрос задать стесняются:

  • как достать прошивку для DigiSpark из среды Arduino для симуляции в Proteus;
  • как симулировать любимые всеми дисплей OLED в Proteus;
  • как настроить среду Arduino и библиотеку Tiny4kOLED, чтобы прошивки заработали в Proteus. 

Для начала, определимся, что же такое DigiSpark? Это серия миниатюрных плат на микроконтроллерах ATTiny, часть которых поддерживает хитрый бутлоадер USB, и со средой разработки работает аналогично платам Arduino (компиляция, прошивка и запуск программы, а также поддержка вывода в терминал). Для законченных устройств вовсе необязательно поддерживать прошивку на лету (также необязательно это и для симуляции в Proteus).

Типичная DigiSpark на ATTiny85 c ALI.

Начнём же отвечать на вопросы! Открываем среду Arduino 1.8.x, выбираем плату:

Такой выбор позволит нам в Протеусе использовать "чистую тиньку" (с внутренним RC генератором и, разумеется, без USB, там нужны более точные частоты).

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

получим предупреждение:

и, естественно, в папке скетча файла с расширением HEX мы не обнаружим. Что же делать? Опытным путём я обнаружил, что среда Arduino на моём компьютере сохраняет после компиляции файлы в папке: C:\Users\%USERNAME%\AppData\Local\Temp\arduino_build_xxxxxx. Таким образом, для обнаружения файла в поиске введите NAME.HEX, где NAME - имя вашего скетча.

Кликаем правой клавишей по файлу и выбираем "расположение файла":

И попадаем в папку с искомым файлом:

Итак, прошивку мы откопали, переходим к следующему вопросу. К сожалению, рабочая модель дисплея с чипом SSD1306 (который и используется в дисплеях OLED) появилась только в Proteus 8.8 (теоретически, дисплеи с SSD1306 появились уже с 8 версии, но они были неработоспособны в режиме I2C). Для симуляции нам нужен дисплей UG-2864HSWEG01.

Создаём новый проект и рисуем вот такую схему.

Очень внимательно здесь надо отнестись к шинам (они синего цвета): если сделать не так как на этой картинке - работать не будет:

  • продолжить шинные выводы дисплея;
  • проименовать их с помощью wire label (имена должны совпадать с названиями на дисплее: D[0..7], BS[0..2]);
  • далее от шин отвести цепи и также проименовать (согласно рисунку выше).

Рекомендации взяты отсюда, и всё действительно так, я для эксперимента удалял промежуточные шины (разрывал их), удалял имена, и оно переставало работать! Далее в настройках ATTiny85 выбираем следующие опции:

добавляем нашу добытую с большими трудами прошивку и всё.

Итак мы запустили симуляцию, но на экране ничего нет? Теперь придётся прочитать ответ и на третий вопрос. На схеме в  Proteus не зря стоит сканнер I2C. Так вот, при первом запуске он показал, что на все запросы по шине приходит NACK (Not Ack), а это означает одно - посылка ушла в пустоту: либо устройств нет на шине, либо указан неверный адрес. Дело в том что дисплеи OLED при работе с I2C могут иметь разные адреса: 0x3C (как правило) и 0x3D. Наш дисплей в Proteus имеет адрес 0x3D, а библиотека обращается по адресу 0x3C. Как это исправить? - Следите за руками.

Начну с того, что библиотека Tiny4kOLED сама по себе не работает с I2C, а использует вызовы к функциям других библиотек (можно выбрать), я использовал в данном проекте:

А теперь поищем адрес I2C. Вбиваем в поиск имя файла: Tiny4kOLED.h.

Нас интересует файл Tiny4kOLED_common.h. Переходим (как и ранее) по правой кнопке меню "расположение файла":

Открываем в любом текстовом редакторе и исправляем в выделеной строке адрес 0x3C на 0x3D:

Компилируем скетч заново. Копируем полученный свежий HEX в Proteus (не забываем также в свойствах ATTiny85 поменять прошивку на свежую). Запускаем и наслаждаемся.

Удачных симуляций!