Главная » Статьи » Как подключить |
Работа с дисплеями от Nokia3310 в Bascom-AVR (продолжение)
автор: Forter Пытаясь повторить конструкцию очередного (весьма, кстати, интересного) термометра, использующего дисплей от Nokia3310, обнаружил, что установленный в термометр дисплей, на котором слева вверху над экраном имелась надпись «Nokia», работает совсем не так, как хотелось бы. Аккуратные домики выводимой на дисплей картинки рассыпались мусором по экрану. Поскольку опыт использования дисплеев от Nokia3310 был, я пришел к выводу, примененный мною дисплей имеет совсем не оригинальный контроллер, как того следовало ожидать, судя по имеющейся на нем гордой надписи «Nokia». В моем распоряжении находилось три вида дисплеев: 1. куплен на ebay, как указывается, совместим с дисплеем от Nokia5110, в котором, в свою очередь, используется контроллер дисплея тот же, что и в Nokia3310. Таким образом, можно было предположить, что этот дисплей должен быть полностью совместим с родным дисплеем от Nokia3310 (как, собственно, и оказалось в жизни). 2. куплен лет 5 назад на радиорынке дисплей с надписью «Nokia», который я пытался пристроить в конструкцию термометра. 3. куплен 1 год назад - дисплей с двумя дугами сверху, слева и справа экрана, по его поводу ничего не было известно, кроме того, что в телефоне он с успехом заменяет дисплей №2. Чтение материалов, касающихся использования данных дисплеев в различных конструкциях, еще более запутало ситуацию, тем более, что всюду утверждается, что дисплей №2 использует оригинальный контроллер. Однако, неудачная попытка его использования в упомянутой выше конструкции, навела на мысль, что надпись «Nokia» не может гарантировать совместимость этого дисплея с оригинальным дисплеем (в применении к любительским конструкциям). Отправным моментом можно принять тот факт, что в оригинальном дисплее используется филиппсовский контроллер PCD8544, ну, и соответственно, тот дисплей, который «заведется» с использованием библиотек дисплея (размещенных на сайте) для Bascom’а, без какой – либо их доработки, можно будет считать соответствующим оригиналу. Собственно, задача состояла не только в этом, а просто хотелось выяснить, какие изменения надо (если надо!) внести в библиотеки, чтобы каждый из имеющихся дисплеев работал КАК оригинальный. Здесь следует остановиться на прояснении принципа вывода информации на экран дисплея. Итак, контроллер PCD8544 обеспечивает вывод на экран с разрешением 84х48 = 4032 точек. Вывод осуществляется побайтно (в нашем случае с горизонтальной адресацией) по 84 байта в одной строке, при общем количестве строк – 6 (48/8), таким образом, всего память контроллера дисплея рассчитана на 6х84=504 байт. При построчном выводе, после заполнения первой строки шириной 84 байта, контроллер (только этот!) автоматически начинает заполнять вторую строку и т.д. По заполнению всех 6 строк, вывод продолжится с начала первой строки. Все просто и понятно, но это только в случае контроллера PCD8544, в моем случае это был дисплей №1. Исходники и библиотека Фото вывода тестовой картинки с этой библиотекой на дисплей №1 ниже При выводе картинки (с использованием предложенной для оригинального дисплея библиотеки) на дисплеи №2 и №3, изображение «рассыпалось», да и при выводе «Hello, World» на первой строке дисплея №3, можно было видеть только нижнюю половину этой надписи. В Интернете много материалов с объяснениями этого факта, есть даже успешные попытки преодолеть эту проблему http://www.radiokot.ru/articles/29 , но это сделано на С, а вот решения этой задачи на Bascom я нигде не смог найти. На упомянутом Интернет-ресурсе автор предположил, что контроллер неоригинального дисплея способен отобразить 102х64 точки (104 байта по горизонтали и 8 байт по вертикали). Дальнейшие поиски привели к тому, что был найден контроллер SD7558, который имеет те же команды и обеспечивает вывод с разрешением 6630 точек (102 точки по горизонтали и 65 – по вертикали). Поэтому, можно предположить, что при выводе картинки на экран, когда данные идут сплошным потоком, в памяти контроллера дисплея они размещаются по строке не в 84 ячейках памяти, а в 102! Но сам контроллер – то не знает, что при заполнении 84 ячеек памяти, нам надо продолжить вывод на дисплей с новой строки и продолжает заполнять ячейки до конца строки, т.е. до 102, а только потом, начинает прорисовывать новую строку – вот изображение и «рвется»! Отсюда вывод – доработать библиотеку так, чтобы построчный вывод производился только по 84 байта, а каждая новая строка для выводимых символов должна принудительно начинаться командой D3310position(x, y), где х=0, а y=0…5. Все это должно выглядеть, примерно следующим образом:
D3310commandout &H40 'начинаем выводить первую строку с адреса y=0
D3310dc = 1 For D3310pixelloop = 0 To 83 'цикл вывода 84 байтов первой строки Read D3310column Call D3310dataout(d3310column) Next D3310pixelloop 'байты первой строки идут с 0 по 83 D3310dc = 0 D3310commandout &H20 D3310commandout &H80 D3310commandout &H41 'начинаем выводить вторую строку с адреса y=1 D3310dc = 1 'т.е. принудительно переводим начало строки For D3310pixelloop = 84 To 167 'цикл вывода 84 байтов второй строки Read D3310column Call D3310dataout(d3310column) Next D3310pixelloop 'байты второй строки картинки идут с 84 по 167 И так далее для всех оставшихся строк (байты, соответственно, со 168 по 503). Исходники и доработанная библиотека: скачать Результат ниже: Эта библиотека с успехом была опробована с дисплеем №2, на других дисплеях – эта библиотека не работает! Задача усложняется при работе с дисплеем №3. Было замечено, что в выводимой картинке исчезают 3 верхних пиксела, вывод – следует сдвинуть изображение на 5 пикселов вверх (команда контроллера &H45) и начинать вывод строк не с нулевой, а с первой строки, конечно, последняя строка в данном случае будет – шестая. Далее, естественно, необходимо начинать каждую новую строку по завершению вывода 84 байтов, как и в случае дисплея №2. Только начало символьной строки задается командой D3310position(x, y), где х=0, а y=1…6, ну и библиотека доработана для вывода картинки, а основные изменения указаны ниже:
Sub D3310init
D3310ce = 0 'Display data input enable D3310dc = 0 'Command mode D3310commandout &H21 'Extended command mode, horizontal addressing D3310commandout &HD5 ' Я установил такой контраст D3310commandout &H45 'смещение картинки на 5 пикселов вверх, плюс 'первоначально имеющееся смещение на 3 пиксела, 'всего, таким образом, 8 пикселов или одна целая строка, будем 'выводить НЕ с Нулевой строки, а с первой 'эта команда работает только в расширенном режиме 'поэтому первая команда инициализации стоит &H21 - переход в расширенный режим, 'далее следует команда &HD5, у меня при 'таком контрасте хорошо видно, ну и, наконец, 'команда &H45, где 5 -смещение картинки 'на упомянутые 5 пикселов D3310commandout &H06 'Temperature setting D3310commandout &H13 'Bias 1:48 D3310commandout &H20 'Normal command mode, horizontal addressing D3310commandout &H0C 'Uninverted Screen D3310ce = 1 'Display data input disable End Sub '……………………………………………………………………… 'Подпрограмма установки курсора Sub D3310position(byval D3310x As Byte , Byval D3310y As Byte) '…………………………………………………………………………… 'Подпрограмма вывода картинки на дисплей Sub D3310bmpout 'You must Restore D3310bmp* before you call D3310bmpout Local D3310pixelloop As Word 'Loop variable for the pixels Local D3310column As Byte 'Display column output D3310ce = 0 'Display data input enable D3310dc = 0 'Command mode D3310commandout &H20 'Normal command mode, horizontal addressing D3310commandout &H80 'Set RAM X address to 0 D3310commandout &H41 'Здесь для вывода картинки установим RAM Y address ' не 0, а 1, как и отмечалось, выводим картинку 'не с нулевой, а с первой строки 'никаких оптимизаций кода не проводилось. D3310dc = 1 'Go to data mode For D3310pixelloop = 0 To 83 'цикл вывода 84 байтов первой строки Read D3310column Call D3310dataout(d3310column) Next D3310pixelloop D3310dc = 0 'Command mode D3310commandout &H20 'Normal command mode, horizontal addressing D3310commandout &H80 'Set RAM X address to 0 D3310commandout &H42 'вторая строка D3310dc = 1 'Go to data mode For D3310pixelloop = 84 To 167 'цикл вывода 84 байтов второй строки 'байты второй строки картинки идут с 84по 166 Read D3310column Call D3310dataout(d3310column) Next D3310pixelloop '…………… 'Продолжаем вывод строк D3310dc = 0 'Command mode D3310commandout &H20 'Normal command mode, horizontal addressing D3310commandout &H80 'Set RAM X address to 0 D3310commandout &H46 'вывод шестой строки D3310dc = 1 'Go to data mode For D3310pixelloop = 420 To 503 'цикл вывода 84 байтов шестой строки Read D3310column Call D3310dataout(d3310column) Next D3310pixelloop D3310ce = 1 'Display data input disable End Sub Исходники и доработанная библиотека: скачать. А вот - как она работает. В результате доработки библиотеки дисплей №3 работает так же, как и оригинал, только контраст нужно подстроить. А на других дисплеях, в свою очередь, эта библиотека не работает! Имеются сведения еще об одной модификации дисплея, у которого нет никакого тиснения сверху слева экрана, но такого дисплея у меня не было, поэтому на сей счет ничего не могу сказать. Но, думаю, что пользуясь представленной информацией, можно «завести» любую модификацию дисплея от Nokia3310. Комментарии смотрите в библиотеках, там все понятно… В экспериментах использовался клон Arduino, описанный в журнале Радио, №10 за 2010 год и имеющий название «Interduino», автором которого является С. Рюмик, его статьи в журналах, вообще, являются лучшим образцом подхода к изложению самого сложного материала. В целом, использование Arduino – подобных устройств очень упрощает и экономит время, особенно при программировании управляющего микроконтроллера (в моем случае ATMega168) прямо из среды разработки Bascom версией не ниже 2.0.5.0. Правда, здесь имеются свои тонкости, и мне немало пришлось повозиться с этими устройствами. Но сейчас все вопросы функционирования Arduino – устройств в среде разработки Bascom мною решены, естественно, те, с которыми я сам сталкивался (наиболее сложной проблемой оказалась «заливка» прошивки в Arduino на ATMega2560) В заключение хочу сказать, что не пытался оптимизировать по размеру ни программы, ни библиотеки (задача была другая), возможно, кто – то проделает эту работу, думаю, что все интересующееся этим вопросом сообщество было бы ему за это благодарно. Более того, допускаю, что допущены и просто ошибки, за указание на которые, был бы признателен. Ну, и напоследок - я поставил себе задачу попытаться вывести на дисплей картинку, предварительно записанную в EEPROM I2C типа 24LC32, на экран от Nokia3310. Похожий проект я видел по ссылке http://monitor.net.ru/forum/viewtopic.php?t=274597&postdays=0&postorder=asc&start=32, автором которого является Ruslan55, который мне любезно прислал информацию (правда, все на PIC – ассемблере). Мне очень понравилась сама его идея анимации изображения, ну, а уж придумать алгоритма вывода картинок в Bascom на дисплей было делом не слишком сложным. В результате, на всех трех дисплеях появился танцующий человечек! Но об этом, если будет интересно – потом. P.S. В связи с тем, что вопросы остаются (было бы странным, если это было бы не так), я провел еще ряд экспериментов по проверке работы дисплея с надписью «Nokia» (дисплей №2 в статье) в проекте, упомянутом в начале статьи. Поскольку я использовал уже упомянутый клон Arduino, чтобы не менять схему подключения, в исходном файле изменена конфигурация портов и исключены коды относящиеся к обслуживанию датчика температуры, оставлена только та часть программы контроллера, которая отвечает за вывод картинки на экран дисплея. Картинки «Bmp11» и «Bmp12» оставлены оригинальными. Ну, и переименовал название основного файла thermo3310-8-timer.bas в org_lib_duino_ thermo3310-8-timer.bas и в new_lib_duino_ thermo3310-8-timer.bas Дисплей подключен к порту D микроконтроллера ATMega168, а частота увеличена до 16 МГц (стандарт Arduino). В ходе эксперимента выяснилось, что требования к стеку должны быть также изменены по сравнению с оригиналом. Установлено: $hwstack = 64, $swstack = 16, $framesize = 100 (в исходном файле проекта - $hwstack = 32, $swstack = 8, $framesize = 100). Рис.1 Рис.2 Результаты приведены на рисунках №№1-4. В первом случае (рис. №1 и №2) использовалась оригинальная авторская библиотека 3310end-new.bas (ссылка на архив) Рис.3 Рис.4 Во втором случае (рис. №3 и №4) использовалась моя неоптимизированная библиотека 3310end_Nokia.bas Различия, как видим, существенные, хотя выводимые картинки одинаковые! Скорее всего, автору замечательного термометра повезло, у него все – таки был оригинальный дисплей и этим все объясняется, ну, а надписям не всегда можно верить – лучше проверить. В заключение хочу еще раз поблагодарить автора проекта с термометром, ведь если бы все получилось, я бы не стал проверять ничего, и каждый раз мучился бы с этими дисплеями… Благодарю также администрацию сайта avrproject.ru за размещение прекрасно оформленных материалов (я не о своих!), ведь только наткнувшись в сети на Ваш сайт, я понял, что можно попытаться освоить и AVR контроллеры (до этого я занимался PIC и 8051 – контроллерами). | |
Просмотров: 28825 | Комментарии: 55
| Теги: |
Всего комментариев: 55 | 1 2 » | ||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||
1-30 31-55 | |||||||||||||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки