Nokia 1202 экран подключение к микроконтроллеру. Подключение дисплея к микроконтроллеру

Уже несколько лет занимаюсь радиоэлектроникой, но стыдно признаться, у меня все еще нет нормального блока питания. Запитываю собранные устройства тем, что попадется под руку. От всяких полудохлых батареек и трансформаторов с диодным мостом без какой либо стабилизации напряжения и ограничения выходного тока. Такие извращения довольно опасны для собранной конструкции. Наконец-то решился собрать нормальный блок питания. А начал сборку с ампервольтметра. Надо конечно было начинать с другого, но как уже есть. Поскольку понемногу занимаюсь программированием то решил сам разработать показометр. В качестве экрана стоит дисплей от Nokia-1202. Наверно я уже всех замучал с этим дисплеем, но он в 3 раза дешевле, чем 2x16 HD44780 (по крайней мере у нас). Вполне паябельный разъем и вообще неплохие характеристики. Короче - хороший вариант для измерителя напряжения и тока.

Электрическая схема цифрового ампервольтметра для БП

Рисунок платы цифрового ампервольтметра

В первой и второй строчке отображается усредненное значение напряжения и тока из 300 замеров АЦП. Это сделано для большей точности измерения. В третьей строчке выводится сопротивление нагрузки, рассчитанное по закону Ома. Хотел сперва сделать, чтоб выводилась потребляемая мощность, но сделал сопротивление. Может позже переделаю на мощность. В четвертой строчке выводится температура измеряемая датчиком DS18B20. Он запрограммирован измерять температуру от 0 до 99 градусов Цельсия. Его надо установить на радиатор выходного транзистора, или на какой нибудь другой элемент схемы, где есть сильный нагрев.

К микроконтроллеру можно так же подключить кулер для охлаждения радиатора транзистора. Он будет изменять свои обороты при изменении температуры измеряемой датчиком DS18B20. На ножке PB3 присутствует ШИМ сигнал. Кулер подключается к этому выводу через силовой ключ. В качестве силового ключа лучше всего использовать MOSFET транзистор. При температуре в 90 градусов у вентилятора будут максимальные обороты. Датчик температуры можно и не устанавливать. В этом случае в четвертой строчке просто высветится надпись OFF. Кулер подключаем на прямую. На выходе PB3 будет 0.

В архиве есть два варианта прошивки. Одна на максимально измеряемый ток в 5 ампер, а вторая до 10 ампер. Максимально измеряемое напряжение - 30 вольт. Коэффициент усиления ОУ LM358 по расчетам выбран 10. Для разных прошивок нужно подобрать шунт. Не у всех есть возможность измерять сотые доли ома и прецизионные резисторы. Поэтому в схеме есть два подстроечных резистора. Ними можно подкорректировать показания измерений.

Там-же в архиве есть и печатная плата. Есть небольшие различия на фото - там она немножко подправленная. Удалена одна перемычка и размер меньше по высоте на 5 мм. Стабильность показаний ампервольтметра высокая. Иногда плавает только на сотые доли. Хотя сравнивал всего лишь с моим китайским тестером. Для меня этого вполне хватит.

Всем спасибо за внимание.

АРХИВ:

Модернизированый вариант

Добавил только отображение еще и десятой части мощности.

Вот переделал для измерения до 50А. Шунт 0,01 ом. Коэффициент усиления ОУ примерно от 6 до 7. Нужно будет пересчитать резисторы. Фьюзы те же, что и раньше.

Хочу представить вашему вниманию модернизированную версию показометра для лабораторного блока питания. Добавилась возможность отключать нагрузку при превышении определенного установленного заранее тока. Прошивку улучшенного вольтамперметра можно скачать ниже. Схема цифрового измерителя тока и напряжения.

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

Переменная тока отключения сохраняется в EEPROM. По этому после выключения не нужно будет все настраивать заново. Для того, чтоб зайти в меню установки тока нужно нажать на кнопку. Поворачивая ручкой переменного резистора надо установить ток, при котором произойдет отключение реле. Оно подключено через ключ на транзисторе к выводу PB5 микроконтроллера Atmega8.

В момент отключения на дисплее высветиться надпись о том, что максимальный установленный ток был превышен. После нажатия на кнопку мы перейдем снова в меню установки максимального тока. Нужно еще раз нажать на кнопку, чтоб перейти в режим измерения. На выход PB5 микроконтроллера подастся лог 1 и при этом включится реле. Такое слежение за током имеет и свои минусы. Защита не сможет сработать мгновенно. Срабатывание может занять несколько десятков миллисекунд. Для большинства подопытных устройств данный недостаток не критичен. Для человека эта задержка не видна. Все происходит сразу. Новая печатная плата не разрабатывалась. Кто захочет повторить устройство может немного подредактировать печатную плату от предыдущего варианта. Изменения будут не значительны.

По всем возникшим вопросам обращаемся на форум. Спасибо за внимание. Ампервольтметр допилил Бухарь.

АРХИВ:
Форум

ВСЕ ЗАКАЗЫ, НАХОДЯЩИЕСЯ В СТАТУСЕ "ОЖИДАЕТ ОПЛАТЫ" ПО ИСТЕЧЕНИЮ СУТОК БУДУТ АВТОМАТИЧЕСКИ ОТМЕНЕНЫ БЕЗ ПРЕДВАРИТЕЛЬНОГО ОПОВЕЩЕНИЯ.

В нашем интернет-магазине цена на товары указанная на страницах сайта является окончательной.

Порядок оплаты электронными деньгами, банковской картой, со счета мобильного:

  • После оформления заказа Ваш заказ будет помещен в Ваш личный кабинет со статусом "Ожидает проверки "
  • Наши менеджеры проверят наличие на складе, и ставят выбранный Вами товар в резерв. При этом изменяют статус вашего заказа на "Оплачивается ". Рядом со статусом "Оплачивается " отобразится ссылка "Оплатить ", кликнув на которую Вы перейдете на страницу выбора способов оплаты сайта Robokassa.
  • После выбора способа и проведения оплаты заказа статус автоматически изменится на "Оплачен ". Далее в кратчайшие сроки товар будет вам отправлен выбранным в процессе формирования заказа способом доставки.

1. Оплата наличными средствами

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

ВНИМАНИЕ!!! Наложенным платежом НЕ РАБОТАЕМ , поэтому оплата при получении почтовой посылки невозможна!

2. Оплата по безналичному расчету

Для юридических лиц мы предусмотрели возможность оплатить покупки с помощью безналичного расчета. В процессе формирования заказа выберите способ оплаты безналичный расчет и введите данные для выставления счета.

3. Оплата через платежный терминал

ROBOKASSA — позволяет принимать платежи от клиентов с помощью банковских карт , в любой электронной валюте , с помощью сервисов мобильная коммерция (МТС, Мегафон, Билайн), платежи через интернет-банк ведущих Банков РФ, платежи через банкоматы, через терминалы мгновенной оплаты , а также с помощью приложения для iPhone .

На сей раз хочу вам рассказать как подключить дисплей от мобильного телефона Nokia 1202 к микроконтроллеру Atmega8. Программируем в среде CodeVision. Кое где могу и ошибаться. Сам только не давно разобрался что к чему. Опыта в программировании не имею и библиотеки для работы с дисплеем писал не я. Они скопированы с одного проекта в интернете. Там прописаны все нужные функции и есть шрифт 5*8 латинские буквы и кириллица. Есть так же пару символов 12*16 и 24*32, которые использовал автор библиотек в своем устройстве. Если их удалить, то шрифт 5*8 будет занимать около 700 байт флеша микроконтроллера. Поэтому микроконтроллер для проекта надо брать "пожирней”. В моем случае использована Atmega8 . Вполне достаточно. Все файлы - исходники, библиотеку и так далее, .

Схема подключения индикатора

Принципиальная схема подключения ЖК дисплея к МК

Нарисовал схему подключения. Для питания дисплея нужно напряжение 3,3V. Если запитывать микроконтроллер от 5V, то ставим резисторные делители и микросхему 78L33 . В случае питания всей схемы от 3,3V резисторные делители не нужны. Вроде Atmega8A может работать от 3,3V при условие, что частота не выше 8 МГц. Лично я не пробовал. У меня все собрано на отладочной плате с питанием от 5V. Перед самим дисплеем ставить по питанию электролит большой емкости ни в коем случае не надо. В самом начале работы контроллер подает на дисплей команды инициализации. Для заряда конденсатора нужно время. Пока он зарядится и дисплей начнет работать пройдет некоторое время, и команды инициализации он не получит. Конечно это миллисекунды, но в даном случае эффект ощутим.


Схема распиновки дисплея

У дисплея Nokia 1202 9-ти битный SPI интерфейс. У выбранного нами микроконтроллера такой роскоши нет. По этому для связи с дисплеем мы используем не аппаратный, а программный SPI, так сказать "ногодрыг”. Как создавать новые проекты в CodeVision рассказывать не буду - думайте сами. Скажу только, что все выводы PORTB надо настроить на выход. В настройках проекта нужно поставить галочку на "Store Global Constants in FLASH Memory ”. Данное действие нужно для того, чтоб массивы шрифтов и наших картинок хранились во флеше.


Итак, проект мы создали. Выбрали микроконтроллер, задали тактовую частоту, настроили проект. Что дальше? А дальше нужно добавить библиотеки для работы с дисплеем и библиотеки задержек. Распаковываем архив. Там есть два файла. Их нужно скопировать в определенные папки. Надеюсь CodeVision вы установили прямо на диск C:\. Если да, то файлы копируем по соответствующим путям:

C:\cvavreval\inc для файла 1100.inc, и
C:\cvavreval\lib для файла 1100.h .


Еще хочу сказать, что назначение пинов микроконтроллера можно изменять в файле 1100.h . Тогда и схема подключения изменится. Начинаем кодить. Просто выведем какую-то надпись на дисплей основным шрифтом 5*8. В самом начале добавим библиотеки.

#include < 1100.h> // библиотека дисплея
#include // библиотека задержек

В самом низу до основного цикла while(1){} делаем инициализацию дисплея и его очистку.

lcd_init(); // инициализация дисплея
lcd_clear(); // очистка дисплея

Нашу надпись поставим так же до основного цикла. Пусть сперва контролер выведет послание на дисплей, а после крутится в основном цикле. Пишем вот это:

print_string("Выводим надпись",5,0);
print_string("Какую сами хотим",0,1);
print_string("БУХАРЬ",10,2);

Думаю здесь все понятно. Первая цифра – координата по оси x на дисплее. Она может принимать значение от 0 до 96. Вторая – строка. Она от 0 до 7. В принципе там помещается 8 с половиной строк, но на пол строки мы читать не будем. Компилируем и прошиваем. Смотрим результат. Можно так же установить Proteus, и протестировать в нем. Контроллер можно настроить для работы от внутреннего генератора на частоту заданную в проекте с задержкой при старте 64 мсек. Добавляю архив с скомпилированным проектом. Частота 8 Мгц.


Но как уже писал в начале, в библиотеке есть еще и другие символы. Правда там нет букв, а только цифры. Теперь немного усложним задачу. Пусть надпись не будет инертной, а изменяется. Допустим считает от 0 до 9 с интервалом в 1 секунду. Когда дойдет до 9, после обнулится и снова наново. Возьмем цифры большие размером 24*32. Ну чтож приступим. Можно взять предыдущий проект и удалить три строки "print_string”. Сразу после добавления библиотек объявим некую глобальную переменную m .

char m = 0;

Можно и просто написать:

В даном случае ей автоматически присвоится значение 0. В основном цикле пишем вот это:

char_24_32(m,35,2); //функция вывода символа 24*32
delay_ms(1000); // ждем 1 секунду
m++; // добавляем 1 к переменной m
if(m>9)m=0; // Условие. Если переменная m больше 9, то m равняется 0.

Снял небольшое видео работы программы

Попробую рассказать как рисовать картинки и выводить их на экран дисплея. Как создавать массивы и функции к их выводу и как инвертировать изображение. Библиотеки позаимствовал с сайта cxem.net. Материал подготовил Бухарь .

Обсудить статью ПОДКЛЮЧЕНИЕ ДИСПЛЕЯ К МИКРОКОНТРОЛЛЕРУ

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

Думаю, нет смысла доказывать, что самым популярным дисплеем от сотовых для использования в своих проектах, построенных на AVR и PIC архитектуре является LCD от Nokia 3310. Монохромный графический, 84*48px, с простым интерфейсом управления и по приемлемой цене. В Сириусе сие чудо с подложкой стоит 65 рублей. И все, казалось бы, хорошо, но есть у этого дисплея пара противных недостатков…

    На рынке существует два вида этих экранов. Фирменный от Nokia и китайский аналог, управляемый неведомым контроллером с расширенной адресацией. По этой причине, прошивки для двух этих братьев не взаимозаменяемы. Беда в том, что фирменный дисплей можно достать разве что только разобрав телефон либо у ремонтников сотовых. В магазинах же чаще продаются только их китайские собратья.

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

Но, ура товарищи! Счастье в этом мире есть. Называется оно LCD Nokia 1202. Это небольшой графический монохромный дисплей разрешением 96 * 68px. Встроенная белая подсветка, гибкий шлейф для распайки на плату с шагом 0,6 мм, никаких убогих подложек. Но самое главное еще впереди!) Продается это чудо повсеместно и стоит, внимание, 35 рублей .

Дисплей имеет следующую распиновку:

Номер пина Название Описание
0 nc Не подключено
1 !RESET Сброс контроллера
2 !CS Выбор кристалла
3 GND Земля
4 SDA SPI data/cmd
5 SCLK SPI clock
6 VDDI Напряжение питания для I/O 1.6~3.6V
7 VDD Напряжение питания ядра 2.4~3.3V
8 GND Земля
9 -LED
10 +LED
11 nc

Протокол общения с микроконтроллером – SPI 9-bit (первый бит признак команды либо данных).

Немного не удобно, т.к. становится невозможно использовать аппаратный SPI 8-bit, например, на AVR или ARM (STM). Остается только вариант программной реализации (ногодрыг). Но и в этом можно усмотреть небольшой плюс – работу с дисплеем можно повесить на любые “непопулярные” ноги порта, а аппаратный SPI использовать по назначению, например для общения с радио-трансивером.

Как и все подобные, этот экран питается от 3.3V. Это не всегда бывает удобно, поэтому я собрал небольшой адаптер-плату толерантную к более высоким напряжениям.

Преобразователь уровней собран не на резистивных делителях, а на диодах, включенных катодами к выходам МК и анодами, соответственно, к ногам дисплея. Питающее напряжение обеспечивается линейным стабилизатором LM-1117-3.3 в необходимой обвязке. Включение питания схемы и подсветки осуществляется через биполярные транзисторы BC847 или им подобные.

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

Плата односторонняя, изготовленная ЛУТом с последующим лужением в Розе. Все компоненты в SMD исполнении кроме диодов (не было у меня нужного формфактора).

Дисплей паяется легко. Шлейф хорошо держит температуру. Единственное, даже после лужения в сплаве Розе, перед посадкой шлейфа на место нужно добавить немного припоя на контакты платы, для того, чтобы после посадки его хватило для проникновения через перфорацию контактов шлейфа. Главное не переборщить, как с количеством припоя, так и с температурой и временем нагрева. У меня все село очень даже неплохо.

Теперь экран болтается на шлейфе, что не очень хорошо. Дальше все упирается в вашу фантазию и уровень лени. Можно приклеить двухсторонним скотчем либо намазать соплей. Я сопли не люблю, поэтому мы будем делать настоящий заводской дисплей.

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

Как-то на Али прикупил я себе три дисплея Nokia 5110. Раз прикупил, то надо научится ими пользоваться. Погуглив тему о подключении этих устройств к МК я понял, что подавляющее большинство примеров, это подключение их к ATmega8 с применением большого количества библиотек, которые упрощают задачу программирования, но в тоже время загружают контроллер так, что он уже не в состоянии ничего делать кроме как рисовать на экране кружочки, и конечно же выводить монументальное «Здравствуй мир» на английском. Более того, в статьях обычно ничего не написано о том, как осуществляется передача данных. Наверное, авторы, не без основания, считают, что подходить к изучению работы дисплея необходимо уже зная такие мелочи как передача данных по последовательному интерфейсу. Но как быть тем, у кого подключение этого дисплея сопряжено с первым знакомством со SPI? …

Эти дисплеи я собираюсь использовать в своих поделках и поэтому решение не применять готовые громоздкие библиотеки, а самостоятельно во всем разобраться продиктовано самой необходимостью. А чтобы не было желания увеличивать код до безобразия, я усложнил себе задачу и подключил дисплей не к Меге8 у которой 8 Кбайт флэш и 1 Кбайт оперативки, а к Тини 25 которая имеет более чем скромные объемы памяти. Да еще в довесок и обрезанный SPI.

Забегая вперед скажу, что на мой взгляд с поставленной задачей по подключению я справился. В итоге у меня получилась небольшая библиотека основных подпрограмм, которая позволяет делать простейшие манипуляции с дисплеем, а также организовать вывод данных на экран. Конечно с помощью неё, написать «Hello World» в коде программы и вывести сточку на экран не получится, но с другой стороны, когда пишется программа под какое-то конкретное устройство на МК, работа со строковыми переменными в явном виде это скорей редкое исключение, которое должно иметь очень серьезное обоснование. Но, все по порядку.

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


Подключение дисплея к МК я проводил по классической схеме к ногам встроенного USI интерфейса. Чтобы не делать плату сопряжения я запитал всё устройство от стабилизатора 3,3V. Это сильно облегчает подключение дисплея и практически не ограничивает работу МК. Также я оставил одну линию контроллера для возможности подключить к нему какое-либо устройство, например, датчик температуры, для того чтобы из собранного модуля можно было бы сделать нечто большее чем просто «часы».

Для тех, кто только делает первые шаги в освоении электроники необходимо знать, что LСD дисплей - это не просто ЖК матрица, это ещё и контроллер, который управляет выводимым на экран изображением. То есть мы подключаем наш МК к другому контроллеру, который понимает команды, обеспечивает хранение данных и выводит их на ЖК экран.

Для полного подключения дисплея необходимо задействовать шесть линий связи, не включая VCC – питание и GND - землю:
1. CE (SCE) – Включение дисплея. Эта линия, как я понял, нужна для указания контроллеру дисплея на то, что данные передаваемые по линии DIN предназначаются именно ему. Активный уровень низкий.
2. RST (RESET) – Сброс. Линия необходима при инициализации дисплея в начале его работы.
3. DC (D/C) – Флаг данные/команда. Линия указывает контроллеру дисплея как надо интерпретировать входящие данные. Низкий уровень (0) – команда, высокий (1) – данные.
4. DIN (SDIN) – Вход интерфейса. Линия приема данных.
5. CLC (SCLC) – Тактовый сигнал. Линия тактирования принимаемых данных.
6. BL (LED) – подсветка. Линия включения подсветки дисплея.

Я изначально не планировал какие-либо дополнительные подключения к МК кроме LСD дисплея. Поэтому немного упростил как само подключение, так и программное обеспечение.

Если подключать по упрошенной схеме, то можно линию BL либо вообще не подключать, либо подключить через кнопку или выключатель, а линию CE замкнуть на землю (GND) указывая тем самым, что дисплей должен находится всегда в рабочем режиме. Если совсем заморочится, то и на линии Reset можно сделать небольшую схему задержки, которая будет ненадолго сажать ее на землю при запуске устройства. Но стоит ли усложнять схему ради одной дополнительной линии? Не знаю. Поэтому считаю, что о специальной схеме для линии сброса надо задумываться только в крайнем случае. К тому же после подключения дисплея к Тини25 у МК осталась одна свободная линия на которую, как я уже говорил, у меня большие планы.

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

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

Обязательно надо упомянуть о том, что наименование выводов MOSI и MISO не имеют к модулю USI никакого отношения. Для подключения надо ориентироваться на название выводов DO и DI. Надо быть внимательным потому как там, где у Тини25 вход данных (MISO – мастер вход / подчиненный выход) у модуля USI выход (DO – данные выход). Я, начитавшись описания работы SPI, подключил линию MOSI к DIN и потом долго не мог понять почему ни чего не работает. Только после того как были подключены светодиоды к выходам контроллера и пошагово пройдена подпрограмма пересылки данных с фиксацией состояния выводов МК ко мне пришло понимания того, что я плохо разобрался в описании работы модуля. Потом пришлось немного скорректировать дорожки и все встало на свои места.

Теперь о подпрограмме пересылки данных из МК в контроллер дисплея.

//Подпрограмма пересылки данных через USI attiny 25 1. void usi_send (unsigned char data, unsigned char dc){ 2. LSD_PORT.LSD_DC = dc; 3. USIDR = data; 4. USISR |= (1<

Описание подпрограммы:
1. В подпрограмму usi_send передаются два байта (data) – передаваемый байт и (dc) – флаг данные – 0 /команда – 1.
2. В pin порта, линии (DC) записывается переданная информация dc (0/1). Сразу скажу, что я не проверял, что будет если в dc передать число больше единицы. Но обработчик ошибок вставлять сюда будет явно лишним. Так что будьте внимательны.
3. Записываем в регистр USIDR передаваемую переменную data.
4. Снимаем флаг переполнение счетчика модуля USI. Как не странно, но, чтобы его «снять» необходимо установить единицу в бит USIOIF регистра USISR.
5. На всякий случай обнуляем счетчик переданных бит.
6. Устанавливаем цикл по передачи данных пока не будет «установлен» (по факту сброшен) флаг переполнения счетчика (USIOIF). При этом осуществляется настройка тактовых сигналов и собственно тактирование. Единица в бит USIWM0 означает, что выбран трехпроводной режим, единицы в битах USICS1 и USICLK определяют источники тактового сигнала для сдвигового регистра и счетчика импульсов. Само тактирование происходит записью единицы в бит USITC регистра USICR.

После того как передача завершена МК организует выход из подпрограммы пересылки данных.

Временная диаграмма для данной подпрограммы выглядит так.

По первому такту на выходе данных (DO) появляется значения первого передаваемого бита. В этот момент также происходит его чтение. На диаграмме DI это pin 5 (PB0) который я использовал для передачи флага DC. Еще примечателен тот факт, что при передачи данных в приемо-передающий регистр записывается состояние линии DI из-за чего после передачи данных на линии DO устанавливается низкий уровень, а если передавалась команда, то высокий уровень. Также из диаграммы видно, что флаг DC после передачи данных не меняется. Он будет изменен только при следующей передачи информации в зависимости от вида передаваемых данных.

Вот как-то так. Я не претендую на оригинальность, но эта подпрограмма вполне работоспособна и по моему мнению оптимальна. Если же тактовый сигнал взять от блока сравнения счетчика Т0, (такая возможность существует) то, на мой взгляд, это не сильно уменьшит код, займет счетчик и не даст ощутимого эффекта в скорости выполнения как основной программы, так и пересылке данных. Подробней о том, как осуществляются пересылка данных по USI можно прочитать в расширенном руководстве на МК.

С пересылкой данных вроде разобрались. Теперь нам надо разобрать как провести инициализацию дисплея. Об этом более или менее доходчиво написано в русскоязычном руководстве по подключению дисплея к модулю Arduino.

Вот моя версия с пояснениями.

//Подпрограмма инициализации дисплея void lsd_init(void) { unsigned char c_pausa = 0xFF; //переменная для паузы //Устанавливаем высокий уровень на линию RESET/ LSD_PORT |= (1<0; c_pausa--); // Устанавливаем высокий уровень на линию RESET. LSD_PORT |= (1<

Также в предлагаемой библиотеке есть подпрограммы:

Режим отображения - void lsd_regim (unsigned char lsd_reg)
Позволяет установить режим отображения данных как позитивный, так и негативный (инвертированный).

Установка позиции курсора - void lsd_position (unsigned char lsd_x, unsigned char lsd_y)
Подпрограмма принимает две переменные координаты Х (0…83) и Y (0…5) и переставляет курсор на новое место.

Очистка экрана - void lsd_clean(void)
Непосредственно очищается память дисплея путем записи в каждую ячейку 0х00.

Подпрограмма вывода на дисплей - void led_out (unsigned char *index, unsigned char width)
Думаю, ее надо рассмотреть подробнее.

//Подпрограмма вывода на дисплей (работает только с переменными из оперативной памяти) void led_out (unsigned char *index, unsigned char width){ //передается индекс на массив и его длинна unsigned char caunt; //счетчик для цикла for (caunt=0; caunt != (width); caunt++)usi_send((*(index + caunt)), LCD_DATA);//вывод знака usi_send(CLEAN, LCD_DATA); //пустая линяя после знака } //END Подпрограмма вывода на дисплей (работает толко с переменными из оперативной памяти)

К сожалению толи из-за моего недопонимания, толи из-за проблем в самом МК, но передача в подпрограмму указателя на массив, расположенный во flash памяти невозможен. Напрямую обратиться можно, а вот передать указатель на массив нет. Как говориться, печалька. Поэтому данная подпрограмма хорошо работает только с массивами данных распложенных в оперативной памяти. Итак. В подпрограмму передаётся указатель на массив и его длинна. Затем организуется цикл, который по порядку вытаскивает из массива по одному байту и передает на дисплей. После передачи всего массива на дисплей передается дополнительно пустой байт. Это сделано для того, чтобы автоматически ставить разделитель между передаваемыми символами. При этом массив должен быть одномерным и не превышать длину в 256 элементов. Это чуть больше чем половина экрана.

Пример записи массива помещенного в оперативку.

Unsigned char ft_0 = {0x3E, 0x51, 0x49, 0x45, 0x3E}; //0

Также можно выводить массивы, записанные во flash память.

Пример массива, записанного во flash.

Flash const unsigned char ft_RED_RESISTER_RU = { 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,\ //R 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,\ //E 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00,\ //D 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,\ //- 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,\ //R 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,\ //E 0x46, 0x49, 0x49, 0x49, 0x31, 0x00,\ //S 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,\ //I 0x46, 0x49, 0x49, 0x49, 0x31, 0x00,\ //S 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00,\ //T 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,\ //O 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00 \ //R };

Указатели flash const читаются как масло масленное, но так спокойней. А выводить такие массивы я смог только прямой работой с ним.

Lsd_position(7,2); width = FT_SIZE(ft_RED_RESISTER_RU); for (caunt = 0; caunt != width; caunt++)usi_send(ft_RED_RESISTER_RU , LCD_DATA); Где: FT_SIZE(ft_RED_RESISTER_RU); это ни что иное как #define FT_SIZE(a) sizeof(a)/sizeof*(a)

Так, что если необходимо вывести какой-то массив из flash памяти, то такую конструкцию придется делать как отдельную подпрограмму, либо вставлять её по необходимости. Для чего я делаю акцент на flash памяти? Да для того, чтобы не занимать оперативку, которой и так не много, все массивы так или иначе уже имеется во flash памяти и поэтому переписывать их еще и в оперативку это слегка нерационально. Но и тут есть нюансы о которых сейчас говорить преждевременно.

Да чуть не забыл. Эти программы должны правильно работать в моделях ATtiny2313, 24/44/84, 25/45/85 и 26. А в других моделях tiny модуля USI, да и SPI просто нет. Вся моя тестовая программа заняла около 1 Кбайта flash и около 90 байт оперативки с учетом всех массивов. Так, что можно еще много чего сделать и на этом МК.

Ну, вот вроде бы и всё.

В приложенных файлах, полностью заархивированных проект по подключению LCD Nokia 5110 сделанный в CVavr и отдельно библиотека, вынутая оттуда, а также схема подключения. Разводку платы не предлагаю т.к. если у кого появится желание поэкспериментировать, то это лучше сделать на макетке.



Небольшая доработка библиотеки.

Когда делал плату управления пришло понимание, что необходимо переделать библиотеку и сделать общие названия подпрограмм как для библиотеки подключения Nokia 5110 к так и для библиотеки подключения к ATtiny.

В прилагаемом файле новая библиотека для подключения Nokia 5110 к микроконтроллерам семейства ATtiny.



Небольшое дополнение к сказанному!

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

//Подпрограмма пересылки данных через USI attiny 25 LSD_PORT.LSD_DC = dc;

Если ваша среда разработки не понимает прямое обращение к биту порта в формате:

Имя_порта.Номер_бита = 0/1; PORTC.4 = 1;

То эту строку необходимо заменить следующим кодом:

If (ds) LSD_PORT |= (1<

Спасибо за замечание Николаю Костину.



Вот как-то так. Если вдруг найдете в статье неточности или заблуждения. Я подправлю.