Главная » Статьи » Как подключить

Работа с дисплеями от 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 – контроллерами).
 

Категория: Как подключить | Добавлено: 20.06.2012
Просмотров: 28505 | Комментарии: 55 | Теги: дисплей, NOKIA3310 | Рейтинг: 5.0/9
Всего комментариев: 551 2 »
55 vladd   (29.11.2018 21:06) [Материал]
Дисплей №4-выводится правильная инфа,но в зеркальном изображении.

+1  
54 exersizze   (26.01.2017 20:31) [Материал]
Это ругается на то, что не назначена ножка сброса экрана:
Config Porta.7 = Output                                     'Reset
D3310re Alias Porta.7

в коде из примера все это есть.

53 Dog1234567890   (23.01.2017 22:11) [Материал]
Error : 46 Line : 11 Assignment error, unknown variable (DIM) [D3310RE: 0 0: 112]
Вот такая ошибка на переменные , переменные которые обозначают буквы он не ругается.В чем может быть проблема .

0  
52 exersizze   (15.01.2017 13:26) [Материал]
Если кратко, то меняем все на что ругается компилятор.
Вот к примеру я менял для одного своего проекта http://avrproject.ru/kcv/3310end.bas

51 Dog1234567890   (14.01.2017 22:33) [Материал]
Если можно вкратце , пример какие переменные и как менять в библиотеке NOKIA3310 . Для баскома 2.05

0  
50 exersizze   (27.12.2016 09:12) [Материал]
Библиотека работает только в версии баскома 1.11.9.8
для остальных версий нужно править имена переменных в библиотеке

49 Dog1234567890   (24.12.2016 12:30) [Материал]
Уважаемые пользователи , не компилируется библиотека , конкретно ошибка в файле 3310end. Подскажите в чем дело.

48 GSV   (03.02.2015 17:11) [Материал]
После того,как появилась вот эта http://bascom.at.ua/publ....-1-0-69 и эта http://cxem.net/mc/mc245.php статьи для себя я закрыл тему с 3310 совсем.Моделей дисплеев больше,работать с ними стало проще.
Брал в "Профи",правда сейчас они подорожали прилично,но для попробовать сумма вполне подъемная.Питается от 3.3в,к мк цепляется через резистивный делитель,у мк задействует 3 ноги.Можно написать свой фонт,можно подправить существующий.

47 Valera18   (02.02.2015 19:55) [Материал]
Для Ev3658

Частично, ответ на Ваш вопрос в (комментарии №37) тут:
http://avrproject.ru/publ....1-0-133

По той схеме (комментарии №37) LCD подключался к аккумулятору от 2.9V до 4.3V.

46 Ev3658   (02.02.2015 14:37) [Материал]
Очень много статей в Интернет, но мало где напишут, как подключить к микроконтроллеру и вообще почти отсутствует информация согласования с ТТЛ 5в. логикой.
Может знает кто какие варианты, расчёт резисторного делителя или использование микросхем.

45 top   (02.09.2013 22:25) [Материал]
marss70 создал тему, разработка запущена) http://avrproject.ru/forum/13-284-1

44 marss70   (02.09.2013 21:04) [Материал]
Привет всем! Предлагаю перенести тему на форум в "разработки"

43 top   (01.09.2013 23:56) [Материал]
marss70, интересно посмотреть фотки отображаемого изображения с описанием того что подавали на АЦП. Задумка клевая)

42 marss70   (01.09.2013 23:43) [Материал]
Обязательно попробую, а я пока по рабоче-крестьянски сделал. Вроде что-то показывает
For Xx = 0 To 83
Adc0 = Getadc(0)
Yy1 = Adc0 / 4
Yy11 = Round(yy1)
Dat(xx) = Yy11
Next Xx

For Xx = 0 To 83
Call D3310addpoint(xx , Dat(xx))
Waitms 1
Next Xx

Waitms 500
Call D3310clear

41 top   (01.09.2013 23:31) [Материал]
Вот моя переделка с буфером http://rghost.ru/48521830
На оригинальном пойдет но будет криво, я так полагаю.
Я добавил 3 процедуры:
D3310point(byval D3310px As Byte , Byval D3310py As Byte , Byval Action As Byte)
D3310clearbufer()
D3310showbufer()

По порядку:
1я добавляет в буфер состояние пикселя. работает с точкой D3310px;D3310py. Точка 0;0 это верхний левый угол и далее построчно до 83;47 - это правый нижний угол. Здесь Action может быть равен 0-погасить пиксель, 1-зажечь пиксель или 2-инвертировать пиксель.
2я очищает буфер
3я отображает буфер

Схема работы проста: набиваем буфер тем чем надо а затем вызываем D3310showbufer().

40 marss70   (01.09.2013 22:37) [Материал]
У меня таким куском кода получилась намёточка на осциллограф.
For Xx = 0 To 83
Yy = Getadc(0)
Yy1 = Yy / 20
Yy11 = Round(yy1)
Call D3310addpoint(xx , Yy11)

'Waitus 100
Next Xx

На всякий, случай- у меня индикатор №1(красненький)

39 marss70   (01.09.2013 22:35) [Материал]
top, всё получилось. Я не корректно создал библиотеку. А вот как сместить точку чтоб в координатах 0,0 она была именно в верху слева? И скинь, пожалуйста, как как засунуть данные в массив и аккуратненько их потом вынуть.

38 top   (01.09.2013 22:23) [Материал]
marss70, скорее всего и будет ставить только одну точку. Как уже известно у этого дисплея адресация ведется ПОБАЙТНО) То есть без использования буфера поставить одну точку в любом, каком захочется месте, не получится, потому что если точка (бит) попадает в тот же байт где уже есть точка, то она (предыдущая) затирается новой точкой. Я могу скинуть пример, где я использовал буфер на все поле изображения. Но писал я это дело для своего дисплея (не оригинального), в статье выше он указан как №3 (с двумя дугами сверху).
По поводу твоего отрывка кода, я бы создал массив Y(10), забил бы его значениями, а потом в цикле for с перечислением X отрисовывал бы точки. Без использования Select Case.
Если строчки по у смещены то надо определить тип дисплея и искать под него рабочий код. В статье выше много версий кода, спасибо Forter'у

37 marss70   (01.09.2013 18:23) [Материал]
top, а можно пример как нарисовать, например, линию или график функции. И ещё момент, у меня точки смещены вниз по оси Y на несколько строчек, как это можно исправить?

36 top   (27.07.2013 14:20) [Материал]
Вот тебе и "на". Как же рисовать по точкам в любом месте, если запись ведется побайтно? Если в одном и том же байте надо нарисовать еще одну точку (рядом например), то предыдущая естественно затирается. Какие будут идеи, Господа?

UDP: Реализовал с помощью буфера размером (48 * 84) / 8 = 504 байта (отъело половину оперативки в mega8). Но зато работает)

35 top   (27.07.2013 13:00) [Материал]
Пользуюсь дисплеем №3 (с двумя дугами сверху). Потребовалось рисовать на дисплее по точкам. Написал для этих целей подпрограмму D3310addpoint. (Минус только в том, что в пределах одной строки на одной координате x умехается только одна точка, т.е. не в любом месте точка поставится; веду работы по разработке полнофункциональной версии)

Использование:
Так как поле у нас 84 на 48 пикселей, подпрограмме достаточно скормить декартовы координаты точки (x;y).

Пример (вызывается из основной программы):
Call D3310addpoint(0 , 0) 'ставит точку в левом верхнем углу
Call D3310addpoint(83 , 47) 'ставит точку в правом нижнем углу

Как добавить:
В файл "3310end_cn.bas" (не забываем, что работаем с китайским дисплеем) добавить следующий код:

Sub D3310addpoint(byval D3310px As Byte , Byval D3310py As Byte)
Local D3310pointbyte As Byte
Local D3310rownumber As Byte
Local D3310symbolnumber As Byte

D3310commandout &H20
Waitus 250

D3310ce = 0
D3310dc = 0

D3310pointbyte = D3310px + &H80
Spiout D3310pointbyte , 1

D3310rownumber = D3310py \ 8
Incr D3310rownumber

D3310pointbyte = D3310rownumber + &H40
Spiout D3310pointbyte , 1

Decr D3310rownumber

D3310symbolnumber = D3310rownumber * 8
D3310symbolnumber = D3310py - D3310symbolnumber

D3310dc = 1

Select Case D3310symbolnumber
Case 0 : D3310dataout &H01
Case 1 : D3310dataout &H02
Case 2 : D3310dataout &H04
Case 3 : D3310dataout &H08
Case 4 : D3310dataout &H10
Case 5 : D3310dataout &H20
Case 6 : D3310dataout &H40
Case 7 : D3310dataout &H80
End Select

D3310ce = 1
End Sub

34 top   (27.07.2013 00:21) [Материал]
Огромнейшее спасибо автору, а именно Forter'у, за проделанную работу. Очень помогло! Плюсую.

+1   Спам
33 AEI   (24.03.2013 22:53) [Материал]
Плохо читал статью. изменение на
$hwstack = 64
$swstack = 16
$framesize = 100
решило проблему

32 AEI   (24.03.2013 18:09) [Материал]
Помогите новичку. Спаял. Залил прошивку и ....... Полная лажа выводится. фотографировать нет смысла тут только видео нужно снимать. картинка постоянно меняется и периодично проскальзывает нужные надписи и опять лажа. Убрал все оставил только
Call D3310position(0 , 1)
Call D3310print( "He")
Выводиться. 1 и 2 символа выводятся. 3 и т.д. лажа полная.
Закономерность 4 символа - Ничего не выводит.
Можно писать по 2 символа, но это как то не то.
дисплей №3

31 exersizze   (01.03.2013 16:43) [Материал]
Покупали на ebay, в описании говорится что он от 5510 но полностью совместим с 3310
http://www.ebay.com/sch....sacat=0

30 bec123   (01.03.2013 10:04) [Материал]
красненький экранчик сами делали или покупали

а то я вот здесь заказывал
http:///////

29 exersizze   (05.07.2012 01:37) [Материал]
Мои поздравления! Будем ждать!

28 forter   (04.07.2012 22:25) [Материал]
Все!
Победил!
Попозже постараюсь подробнее описать весь процесс.
Спасибо за помощь, коллеги!

27 exersizze   (02.07.2012 23:51) [Материал]
Вот пример c офсайта баскома по использованию памяти 24LC64
http://www.mcselec.com/index.p....emid=57

26 exersizze   (29.06.2012 19:45) [Материал]
2forter, второй байт адреса отправляете? Немного позже напишу пример чтения данных с больших адресов eeprom.

1-30 31-55
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: