Подключение дисплея от Nokia 1100. Часть 2.

Итак, контроллер PCF8814 позволяет выводить на экран 96 пикселей по горизонтали и 65 пикселей по вертикали. Отсчет начинается от верхнего левого угла.

Данные об изображении записываются побайтно во внутреннюю память (DDRAM) контроллера PCF8814. Адресация по горизонтали (X) идет попиксельно и изменяется от 0 до 95, а по вертикали (Y) задается номер банка, который изменяется от 0 до 8. Адреса вне этих диапазонов не допускаются. Всего есть 9 банков по 96 байт. В девятом банке используется только 1 пиксель. В зависимости от включенного режима значащим является либо старший бит передаваемого байта, либо младший.

Адресация памяти

Адресация памяти

Адресация памяти может работать в двух режимах — горизонтальном и вертикальном. В горизонтальном режиме при записи каждого байты в память счетчик X увеличивается на единицу. При достижении предела по горизонтали (95) он сбрасывается в 0, а счетчик Y увеличивается на единицу.

При вертикальном режиме адресации при каждой записи байта в память на единицу увеличивается счетчик Y, при достижении предела (8) он сбрасывается в 0, а горизонтальный счетчик увеличивается на единицу. Картинка, приведенная ниже, подробно описывают способы адресации.

Режимы адресации

Режимы адресации

Контроллер PCF8814 может подключаться к микроконтроллеру с помощью:

  1. SPI по трем линиям
  2. SPI по четырем линиям
  3. шины I2C
  4. последовательного 3-х проводного интерфейса

В дисплее от Nokia 1100 реализовано подключение по 4-проводному SPI. В принципе, это неплохо, так как хоть и не экономит выводы микроконтроллера, но немножко разгружает программу работы с дисплеем. При подключении используются сигналы:

  1. SCLK — линия тактирования
  2. SDA — линия передачи данных и команд
  3. CS — линия, определяющая передачу команды или данных
  4. RST — линия аппаратного сброса

Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.

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

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

Работа экрана Nokia 1100

Работа экрана Nokia 1100

На фотке выше показана работа демонстрационной программы работы с дисплеем. Сама программа никаких сложностей не представляет. Вся работа реализована в библиотеке.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>

#include "nokia1100_lcd_lib.h"    // Подключаем драйвер LCD-контроллера NOKIA1100

char Text[] PROGMEM = "FLASH MEMORY TEST";

int main(void)
{
    nlcd_Init();
    _delay_ms(100);

    nlcd_GotoXY(0,0);
    nlcd_PrintF(Text); // Выводим строку из программной памяти

    _delay_ms(4000);

    nlcd_GotoXY(0,0);

    nlcd_PrintF(PSTR("  Hello, world! ")); // Другой способ задания строк в программной памяти
    nlcd_PrintF(PSTR("----------------"));
    nlcd_PrintF(PSTR(" DigitalChip.ru "));
    nlcd_PrintF(PSTR("    present     "));
    nlcd_PrintF(PSTR(" NOKIA 1100 LCD "));
    nlcd_PrintF(PSTR("  demonstration "));
    nlcd_PrintF(PSTR("----------------"));

    while(1)
    {

        nlcd_GotoXY(4,7);
        nlcd_Print("It work!"); // Строка из ОЗУ (RAM)
        _delay_ms(1000);

        nlcd_GotoXY(4,7);
        nlcd_PrintF(PSTR("        ")); // Строка из программной памяти (Flash)
        _delay_ms(1000);
    }

}

Библиотека позволяет выводить на экран только символы размером 5×8 пикселей. Зазор в 1 пиксель между символами добавляется автоматически. Поэтому, на экран можно вывести 8 строк по 16 символов. Работа с графикой в библиотеке не реализована (пока не возникало необходимости). В будущем, возможно напишу следующую версию библиотеки, в которой будут функции для работы с графикой. Но это в перспективе.

Особенность моей библиотеки в том, что линии управления дисплеем должны быть подключены к одному и тому же порту микроконтроллера, хоть и к любым пинам порта. В исходниках демонстрационного проекта — это PortC. Настройка библиотеки осуществляется в заголовочном файле nokia1100_lcd_lib.h. Укажите порт подключения управляющий линий и куда они подключены. Все прокомментировано, поэтому сложностей составить не должно.

Пример настройки библиотеки из демонстрационного проекта:

//******************************************************************************
// Настройка библиотеки

// Порт, к которому подключен LCD-контроллер NOKIA 1100
#define PORT_LCD PORTC
#define PIN_LCD  PINC
#define DDR_LCD  DDRC

// Номера выводов порта, к которым подключены выводы LCD-контроллера
#define SCLK_LCD_PIN    3
#define SDA_LCD_PIN     2
#define CS_LCD_PIN      1
#define RST_LCD_PIN     0

// Применять полный набор символов.
//#define FULL_CHARSET

В библиотеку входит файл nokia1100_lcd_font.h, в котором, как следует из названия, содержится шрифт. В нем реализована таблица ASCII с кодами символов от 30 до 127, т.е. специальные символы, цифры и латинский алфавит.

Если вы в своем проекте применяете кириллицу, то нужно раскомментировать дефайн FULL_CHARSET . Это включит в прошивку дополнительные символы шрифта с кириллицей, но и потребление памяти программ увеличится. Частично включенные символы от символа «А» до символа «п» соответствуют кодировке CP866, далее — несоответствие ниодной кодировке. Поэтому при работе с кириллицей следует уделить внимание кодировке символов кириллицы.

ASCII-таблица с кодировкой CP866

ASCII-таблица с кодировкой CP866

Вот прототипы реализованных в библиотеке функций:

void nlcd_Init(void);
void nlcd_Clear(void);
void nlcd_SendByte(char mode,unsigned char c);
void nlcd_Putc(char c);
void nlcd_Print(char * message);
void nlcd_PrintF(char * message);
void nlcd_GotoXY(char x,char y);
void nlcd_Inverse(unsigned char mode);

Из названий функций, я думаю, понятно что они делают.

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

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

79 комментариев на “Подключение дисплея от Nokia 1100. Часть 2.”

  1. как можно сделать из этого экрана тестер?

  2. Спасибо за исходники. Как появится дисплей опробую

  3. -Валера-

    Приветствую.
    Пробую скомпилировать проект — Winavr-20100110 — «вываливает» под 20 ошибок.Вопрос: в чем грабли?

    • У меня более новый toolchain стоит. Может быть по этому?
      У меня компилится вообще без единой ошибки или варнинга.

      Приведи лог ошибок, попробуем разобраться…

  4. -Валера-

    Связь есть — это уже хорошо 🙂 Поскольку программист я хоть куда — возникает вопрос КАК снять лог ошибок ?

    • Перейди в студии в ту часть, где выводятся ошибки, нажми Ctrl+A, клацини правой кнопкой мыши и выбери пункт Copy. После этого вставь в коммент. Помоему все просто… 🙂

  5. -Валера-

    Есть :

    NOKIA1100_demo.c:21: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:22: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:23: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:24: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:25: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:26: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:27: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:37: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness

  6. -Валера-

    Это не все-продолжение следует..

  7. -Валера-

    Linking: main.elf
    avr-gcc -mmcu=atmega8 -I. -gstabs -DF_CPU=8000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=NOKIA1100_demo.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d NOKIA1100_demo.o —output main.elf -Wl,-Map=main.map,—cref -lm
    NOKIA1100_demo.o: In function `main’:
    NOKIA1100_demo.c:11: undefined reference to `nlcd_Init’
    NOKIA1100_demo.c:14: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:19: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:21: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.c:22: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.c:23: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.c:24: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.c:25: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.o:NOKIA1100_demo.c:26: more undefined references to `nlcd_PrintF’ follow
    NOKIA1100_demo.o: In function `main’:
    NOKIA1100_demo.c:32: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:33: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:36: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:37: undefined reference to `nlcd_PrintF’
    make.exe: *** [main.elf] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00

    • Попробуй вот этот блок:
      nlcd_PrintF(PSTR(" Hello, world! "));
      nlcd_PrintF(PSTR("----------------"));
      nlcd_PrintF(PSTR(" DigitalChip.ru "));
      nlcd_PrintF(PSTR(" present "));
      nlcd_PrintF(PSTR(" NOKIA 1100 LCD "));
      nlcd_PrintF(PSTR(" demonstration "));
      nlcd_PrintF(PSTR("----------------"));

      заменить на
      nlcd_Print(" Hello, world! ");
      nlcd_Print("----------------");
      nlcd_Print(" DigitalChip.ru ");
      nlcd_Print(" present ");
      nlcd_Print(" NOKIA 1100 LCD ");
      nlcd_Print(" demonstration ");
      nlcd_Print("----------------");

    • У тебя просто не подключена библиотека. Подключи ее к проекту.

  8. -Валера-

    Ошибок стало меньше, но все же. По поводу подключения библиотеки- создал проект, затем Makefile, дальше к проекту добавляем драйвера LCD — 2 файла, библиотека шрифтов и саму демо-программу. Ессно все находится в одной папке. Я так понимаю фото прикрепить нельзя ?

    Compiling C: NOKIA1100_demo.c
    avr-gcc -c -mmcu=atmega8 -I. -gstabs -DF_CPU=8000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./NOKIA1100_demo.lst -std=gnu99 -MMD -MP -MF .dep/NOKIA1100_demo.o.d NOKIA1100_demo.c -o NOKIA1100_demo.o
    NOKIA1100_demo.c: In function ‘main’:
    NOKIA1100_demo.c:15: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness
    NOKIA1100_demo.c:37: warning: pointer targets in passing argument 1 of ‘nlcd_PrintF’ differ in signedness

    Linking: main.elf
    avr-gcc -mmcu=atmega8 -I. -gstabs -DF_CPU=8000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=NOKIA1100_demo.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d NOKIA1100_demo.o —output main.elf -Wl,-Map=main.map,—cref -lm
    NOKIA1100_demo.o: In function `main’:
    NOKIA1100_demo.c:11: undefined reference to `nlcd_Init’
    NOKIA1100_demo.c:14: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:15: undefined reference to `nlcd_PrintF’
    NOKIA1100_demo.c:19: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:21: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:22: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:23: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:24: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:25: undefined reference to `nlcd_Print’
    NOKIA1100_demo.o:NOKIA1100_demo.c:26: more undefined references to `nlcd_Print’ follow
    NOKIA1100_demo.o: In function `main’:
    NOKIA1100_demo.c:32: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:33: undefined reference to `nlcd_Print’
    NOKIA1100_demo.c:36: undefined reference to `nlcd_GotoXY’
    NOKIA1100_demo.c:37: undefined reference to `nlcd_PrintF’
    make.exe: *** [main.elf] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00

  9. Строка: NOKIA1100_demo.c:11: undefined reference to `nlcd_Init’
    означает, что не подключена библиотека, и соответственно, вызываемая функция неопределена.

    Надо подключить библиотеку. Я это делаю так:

    В дереве проекта (справа со списком файлов проекта) в строке Source Files щелкаю правой кнопкой, выбираю пункт меню Add Existing Source Files и выбираю файл nokia1100_lcd_lib.c.

    Теперь щелкаю в строке Header Files, выбираю пункт меню Add Existing Header Files и выбираю файл nokia1100_lcd_lib.h. Повторяю процесс и добавляю файл nokia1100_lcd_font.h.

    Все, все работает.

  10. -Валера-

    Сейчас попробую…

  11. -Валера-

    У меня в дереве проекта после щелчка правой кнопкой кнопкой мыши — нет строк Add Existing Source Files, Header Files, Add Existing Header Files но в дереве проекта ВСЕ файлы прикрепленны. Но… ПРИЧИНА НАЙДЕНА !!!
    Достаточно было в файле программы заменить расширение библиотеки с .h на .с ( строка 5) как — все заработало. Большое спасибо за помощь, на сегодня все — буду отбиваться ( на работу однако:)).

    • У меня в дереве проекта после щелчка правой кнопкой кнопкой мыши — нет строк Add Existing Source Files, Header Files, Add Existing Header Files но в дереве проекта ВСЕ файлы прикрепленны.

      Странно… А вы точно в AVR Studio програмите?

  12. -Валера-

    Приветствую.
    У меня компилятор — Winavr , не студия. Пробовал ее установить-по умолчанию файлы проекта Assembler, а мне нужно Си. Знаю что как-то можно приаттачить и Си, но … Установил Winavr и успокоился:)
    Дисплея у меня нет-попробовал запустить его в Протеусе- чегой-то тормоза ужасные — от момента запуска симуляции до момента инициализации дисплея проходит 22 сек. и до момента инициализации на экране мусор, затем начинается отрисовка текста — НО зеркально и с нижнего левого угла. Может модель в Протеусе глючная (других-нет).

    Отсюда вопросы: пробовали в симуляторе «прогнать» LCD ? Какие есть соображения по данной проблеме ?

    В любом случае завтра поеду за дисплеем-попробую в железе.

    • У меня компилятор — Winavr , не студия. Пробовал ее установить-по умолчанию файлы проекта Assembler, а мне нужно Си. Знаю что как-то можно приаттачить и Си, но … Установил Winavr и успокоился:)

      Я сначала установил AVR Studio, а потом WinAvr. Все зацепилось автоматом. Теперь, когда создаешь новый проект, на выбор предлагается создать проект на ASM или на AVR C.

      Отсюда вопросы: пробовали в симуляторе «прогнать» LCD ?

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

      Какие есть соображения по данной проблеме ?

      Так как Протеусом пользуюсь очень редко, то даже и не знаю, что предложить.

  13. -Валера-

    Приветствую.
    Небольшой отчет о проделанной работе-приобрел пару дисплеев Nokia 1100 ( а заодно и парочку 1110i — оригинал и китай — есть мысль использовать ИХ, цена смешная + есть разъем + подсветка).
    На 1100 распаялся прям на шлейфе-ничего не отвалилось, все надежно держится, в общем все сразу заработало. Есть вопросы — а как без них 🙂

    — при включении происходит очистка экрана ( прибл. 14 сек) затем отображается текст ( все корректно), можно ли это время уменьшить ? От чего оно зависит ? Понимаю, что можно выкл. LCD чтобы мусор на наблюдать, но 14 сек прийдется выждать. Пробовал поиграть с частотой тактирования от 1 до 16 мГц-от частоты зависит время очистки и вывода текста. Какова причина ? Ведь _delay_ms(); указывает на количество милисек., а не кол-во тактов ?

    — на демонстрационном видео обновление экрана происходит сверху вниз-ПОСТРОЧНО, а у меня «построчно —> банками». Вопрос: где в программе это реализованно ? ( Реализованно ли? Если не сложно-дайте пример реализации).

    — на какой частоте у Вас работает МК ?

    P.S.
    Даташит на PCF8814 «курить» начал, но пока не в затяжку, да — 1110i работает, хотя где-то слышал, что контроллер там только схож по командам с PCF8814, а какой именно 🙁

    • Приветствую.

      привет, привет

      при включении происходит очистка экрана ( прибл. 14 сек) затем отображается текст ( все корректно), можно ли это время уменьшить ?

      Даже и не знаю. У меня не получилось, хотя я долго пытался.

      Понимаю, что можно выкл. LCD чтобы мусор на наблюдать, но 14 сек прийдется выждать.

      У меня очистка занимает порядка 6 сек.

      Пробовал поиграть с частотой тактирования от 1 до 16 мГц-от частоты зависит время очистки и вывода текста. Какова причина? Ведь _delay_ms(); указывает на количество милисек., а не кол-во тактов?

      Дисплей очищается по «8-пиксельно» в «банках». Т.е, очищается 8-пиксельный столбец 0-го банка, затем первый столбец, затем 3, и т.д. И так до 96-го. Потом повторяем туже процедуру для 1-го банка, затем для 2 и т.д.

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

      Курил даташит, но встроенной команды очистки экрана не нашел.

      на какой частоте у Вас работает МК ?

      8Мгц от встроенного генератора.

      на демонстрационном видео обновление экрана происходит сверху вниз-ПОСТРОЧНО, а у меня «построчно —> банками». Вопрос: где в программе это реализованно ? ( Реализованно ли? Если не сложно-дайте пример реализации).

      В смысле где реализовано? в библиотеке — файл nokia1100_lcd_lib.c в нем функции
      void nlcd_Putc(unsigned char c) -вывод символа в текущее место
      void nlcd_Print(char * message) — вывод строки на основе nlcd_Putc

    • да — 1110i работает, хотя где-то слышал, что контроллер там только схож по командам с PCF8814, а какой именно

      хз. за неимением 1110i как он работает и из чего состоит не могу сказать…

  14. Проверил в протеусе все работает А чтоб работало быстрее задержки в программе надо уменьшить

    • Протеус не отображает реальной обстановки. То что работает в Протеусе, далеко не всегда работает в реале. И наоборот.

  15. -Валера-

    Проблема решена-действительно нужно уменьшить программно задержку тактирования LCD и все работает, инициализация дисплея проходит за 2 секунды 🙂

    • Это в отклонение от даташита…

      • -Валера-

        Полностью согласен, но ждать 22 сек. инициализации LCD — это слишком, а так работает .

    • У меня не пошло. Если уменьшить задержку, то вообще ничего не выводится… 🙁

      • -Валера-

        Уменьшил задержку для

        SCLK_LCD_SET;
        c <<= 1;
        _delay_ms(3);
        с 3 мили до 200 микро секунд — работает, срыв происходит при
        130 микросек.

        • Я понял. Я тоже пытался уменьшать эту задержку. У меня, если ее установить менее 2 мс, то на экран уже ничего не выводится… Поэтому, если у тебя можно установить меньшую задержку, то это гуд…

          P.S.: Вот одна из ситуаций, где Протеус показывает нормальную работу даже при нулевой задержке, а на реальном железе все работает несколько иначе…

  16. -Валера-

    Приказал долго жить 1100, а 1110i-трудится без отдыха.
    Попробую прикрутить библиотеку для возможности вывода графики.

  17. -Валера-

    Привет. 
    Что-то с выводом графики у меня «засада» — прошу помочь (если есть желание 🙂 — дать,так сказать, небольшой ликбез). С Выводом великого русского языка на дисплей -полный порядок — от А до Я.

    • Помогу чем могу. В чем проблема возникает?

      • -Валера-

        Привет. Извиняюсь за задержку в ответах-не всегда хватает свободного времени на хобби 🙂 . С выводом графики в данный момент ситуация такова: задача №1-вывести на экран графический значок произвольной формы 20х30 .
        Код:
        static const char antena[] =
        { 0x03,0x0F,0x3C,0xF0,0xC0,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xC0,0xF0,
        0x3C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0x3C,0x70,0xFF,0xFF,0xFF,0x70,
        0x3C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

        nlcd_GotoXY(0,0);
        for ( i = 0; i < 20; i++ )
        {
        nlcd_SendByte(DATA_LCD_MODE,antena[i]);
        }
        nlcd_GotoXY(0,1);
        for ( i = 20; i < 40; i++ )
        {
        nlcd_SendByte(DATA_LCD_MODE,antena[i]);
        }
        nlcd_GotoXY(0,2);
        for ( i = 40; i < 60; i++ )
        {
        nlcd_SendByte(DATA_LCD_MODE,antena[i]);
        }
        Итоги:
                  все работает, но данные выводятся «банками», а хотелось бы организовать вывод графики попиксельно.Как — 🙁  ?  В конечном результате хочу вывести на весь экран — свободный рисунок, фото и т.д. 
            Принимаю любые рекомендации…

        • Дас-с-с… Надо подумать…

        • Что бы выводить графику, надо в памяти создавать буфер, так как этот экран не позволяет читать из своей памяти, а без знания значения в ячейке памяти ни о каком выводе графики речь идти не может.

          Буду думать…

        • Блин, не могу отладить вторую версию библиотеки с графическими функциями… экран глючит безбожно. Не сгорел ли?!..

          Но процесс написания идет полным ходом.

          Кстати, ты в Протеусе этот экран отлаживал? В моем Протеусе (7.7 Sp2) этого экрана нет. Есть от Nokia 7110, но там немного все по другому…

  18. -Валера-

    Вывел графику 16х240 — этим разрешением все и ограничилось, я так понимаю, что нужно изменить тип переменной  с  unsigned char на unsigned int  ?! И массив с изображением нужно переносить как минимум в программую память ( если разрешение больше 16х250 — ОЗУ переполняется) , а вообще есть мысль использовать внешнюю память  на 24С64 и ей подобных, но это пока в перспективе  🙂  Рад, что создание библиотеки сдвинулось с мертвой точки, со своей стороны могу оказать посильную помощь например в тестах на железе. Или могу выслать, так сказать — для расширения кругозора,  LCD Nokia 1110i с коннектором ( есессно-безвозмездно, только не знаю куда и как )
    По поводу экранов — остался еще один 1100 — пока лежит (первый сгорел по причине запитывания его от 3,3 в — на 1100 питание выше 2,9 v -подавать нельзя!) , а юзаю 1110i — мне в нем все нравится 🙂  и программу тестирую на нем. У меня тоже стоит Proteus 7.7 -модель на Nokia 1100 для него качал отдельно,  по-моему с kazus.ru, сейчас проверил-все работает, есть небольшое подтормаживание временами, но это терпимо.

    • я так понимаю, что нужно изменить тип переменной  с  unsigned char на unsigned int  ?!

      Зачем? Ничего не надо.

      И массив с изображением нужно переносить как минимум в программую память ( если разрешение больше 16х250 — ОЗУ переполняется) , а вообще есть мысль использовать внешнюю память  на 24С64 и ей подобных, но это пока в перспективе  🙂

      Обязательно. Хранение графики в ОЗУ — это кощунство. Если применять библиотеку на микроконтроллерах типа Atmega32 и выше, где программной памяти довольно много, то графику можно хранить в программной памяти. Если графики много, то, конечно же, лучше применять внешнюю память.

       Рад, что создание библиотеки сдвинулось с мертвой точки

      Сегодня вечером доработаю вторую версию библиотеки. Уже реализована работа с пикселями.

      Или могу выслать, так сказать — для расширения кругозора,  LCD Nokia 1110i с коннектором ( есессно-безвозмездно, только не знаю куда и как )

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

      первый сгорел по причине запитывания его от 3,3 в — на 1100 питание выше 2,9 v -подавать нельзя!

      Ну не знаю, мой пока работает (тьфу-тьфу) от 3.3V, по схеме, что я выше приводил. Контакт плохой был. Сейчас переделал конструкцию немного.

      модель на Nokia 1100 для него качал отдельно,  по-моему с kazus.ru, сейчас проверил-все работает, есть небольшое подтормаживание временами, но это терпимо

      Понял, щас поищу…

  19. Максим

    Добрый день!

    У меня возникла некоторая проблема с использованием библиотеки.
    Цель устройства — отображать текст, пришедший в пакете из 128 байт по сети на экран и порождать цветомузыку с пищанием и проч. (мониторинг состояния серверов). Решил сделать на V-USB как устройство HID и передавать данные через FEATURE REPORTS. Оптимально для пересылки 128 байт в репорте + на экране nokia 1100 с Вашей библиотекой отображается как раз 128 символов.
    Подключил LCD к atmega16, текст выводится, но медленно. Согласно комментариям выше, уменьшил задержки в init до минимума + в nlcd_SendByte до 130us (дальше действительно срывается). Пишу и тестирую только в железе. Стало работать на порядок быстрее.
    Далее настроил V-USB HID (по аналогии с примером hid-data), устройство определяется в системе без проблем. Написал на delphi хост программу, используя freeware hid component, которая без проблем пишет и читает eeprom моего устройства. По крайней мере, со скоростью 1 раз в секунду (быстрее мне точно не нужно, хотя по спецификации, должно работать раз в миллисекунду 🙂 ).
    Далее начинаются проблемы. Поскольку, USB весьма требователен к задержкам (не смог найти реальные цифры таймаутов, но факт), при попытке вывести текст на экран сразу по принятию фрейма, устройство выпадает на как минимум период 16.64 ms (130us * 128 bytes). Визуально это еще дольше (до двух-трех секунд). Выпадает — в смысле, в это время я не могу послать еще пакет данных, мне возвращается ошибка (79) SET FEATURE ERROR. Согласно USB шине, устройство еще не успело отсоединиться или отсоединилось, но не прошла переэнумерация (не срабатывает событие на отсутствие устройства). После того, как текст отображен, устройство снова доступно для использования, хендл не теряется. Если в программе происходит задержка еще на 10ms (например, моргнуть светодиодом), устройство тупо отваливается от хоста и после переэнумерации его не видно. На хост системе Windows XP 32-bit SP3. 
    Попробовал запустить таймер по переполнению чтобы выводить текст асинхронно от передачи данных, раз в 10 секунд из eeprom. Работает абсолютно также, до тех пор, пока не отобразятся все 128 символов, устройство недоступно для следующей передачи данных (из-за _delay_us(130).

    Собственно, вопрос заключается в том, как мне поступить. Я вижу следующие варианты решения:

    1. Не использовать HID, подвесить FT232 и гнать данные через виртуальный COM порт. Там вроде нет таких проблем с задержками.
    2. Использовать более «быстрый» дисплейчик (посоветуйте?). Возможно, дисплеи с аппаратным SPI будут быстрее работать.
    3. Использовать отдельный МК для вывода текста на дисплей, подключив оба по USART или через RF-Link. В этом случае, аналогично 1, исчезнут проблемы с задержками, просто асинхронно пару раз в секунду сливать полученный фрейм отдельному контроллеру (например, tiny2313).
    4. Другие варианты. 

    Буду очень признателен за ответ.
    Спасибо! 

    • Интересная проблема. Но вот ее решение зависит от многих параметров. 

      Наиболее бюджетный способ решения — это приведенный вами пункт 1. Если у вас есть уже дисплей от Nokia 1100 и вы очень ограничены в бюджете, то применение FT232 будет выходом из положения.

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

      Или, к примеру, в вашем устройстве по эстетическим требованиям применение другого дисплея не подходит (ну там по размеру, цвету и т.д.), то в размерах платы и применяемым компонентам вы не ограничены, то либо отдельный контроллер на экран + контроллер на прием данных по HID, либо более мощный контроллер.

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

      Поэтому выбор способа решения вашей проблемы — это учет кучи факторов.

      Про дисплеи… Что посоветовать применить я не знаю. У меня в наличии только два типа дисплея: от Nokia 1100 и на базе HD44780. Вполне возможно вам подойдет бюджетный дисплей от Nokia 3310, он побыстрее будет.

      В свое время присматривался к вот такому дисплею: http://lcut.us/11n и вот такому http://lcut.us/11o. Правда, пока не приобрел ни один из них и что либо конкретное по их работе сказать не могу.

      Так что как поступить — решать вам. Я бы скорее всего поступил так: по уменьшению приоритетности):
      — применил отдельный контроллер для работы с V-USB и другой для всего остального
      — применил FT232
      — применил другой экран
      — применил более мощный контроллер (ARM например)

  20. Максим

    Спасибо за ответ.
    В принципе, в средствах не ограничен, хотя, отмечу, что FT232 стоит около 230 руб в Питере (чувствую, надо пачку из Китая заказать), а дисплей от nokia 3310 — 80-90 руб 🙂 ARM, мне кажется, для этих целей будет излишен, да и jtag у меня отсутствует. Скорее всего, остановлюсь сейчас на втором контроллере, благо tiny2313 штук 5 еще есть. Если не поможет, подцеплю дисплейчик 3310. Раз уже написан код для HID, буду дожимать проект до конца в этом виде 🙂

  21. Максим

    Нашел выход из положения 🙂 Необходимые задержки вынес на внешний 555 таймер. Когда таймер заканчивает свою работу, контроллер ловит и обрабатывает прерывания. Также живет внутренний таймер, который раз в секунду проверяет наличие в буфере нового текста, если он есть, то отображает его, пинает внешний таймер. Обработчик прерывания после отрабатывания внешнего таймера чистит буфер и экран. Таким образом я укладываюсь в диапазон 50 миллисекунд, когда девайс должен сообщить хосту о том, что он еще жив и на шине.
    Есть нюанс: в процессе вывода на экран устройство занято и не удается записать что либо в буфер. Вышел из положения просто — на хосте отправляю данные 5 раз — в крайнем случае, со второго-третьего доходит.
    Ммм… Был сегодня в магазине, прикупил at90usb16. Буду теперь осваивать ЛУФУ, да и надо попробовать добавить радиоканал в устройство…

    • Уж как то геморно. Может все-таки отдельный контроллер на экран, отдельный на USB?.. Контроллеры сейчас недорого стоят.

      • Максим

        Chiper, я доделал свое устройство, вкратце описал его на http://mgrigorov.ru/?p=23
        В архиве http://mgrigorov.ru/wp-content/uploads/2012/04/XPager_Device.zip можно найти измененные файлы библиотеки (использованы комментарии выше и информация с сайтов http://alex-exe.ru/radio/microcontrollers/lcd-nokia1100/#more-1106 и http://www.sunbizhosting.com/~spiral/1100/). В сумме имеем достаточно быструю работу с дисплеем, корректное отображение русских символов (тот вариант, что брал на этом сайте, русские символы дефайнил, но не выводил). Буду рад, если это поможет Вам создать следующую версию библиотеки.

        • В сумме имеем достаточно быструю работу с дисплеем, корректное отображение русских символов (тот вариант, что брал на этом сайте, русские символы дефайнил, но не выводил). Буду рад, если это поможет Вам создать следующую версию библиотеки.

          Шас работаю над библиотекой. Скоро опубликую новую версию. Ускорил вывод на экран, корректное отображение кириллицы, другие доработки.

      • Максим

        btw: большое спасибо за библиотеку! 😉

  22. Максим

    Это слишком просто :)))

  23. Андрей

    Здравствуйте, такой вопрос, почему экран от 1100 такой бледный? Я вывожу на него информацию но ничего не видно, в чем может быть причина?

    • Андрей

      Вот если убираю питание с ножки VDDl тогда экран темнеет но зато надписи становяться контрастными и легко различимыми

    • А какое напряжение вы подаете? Может быть его не хватает? Или питание по мощности не тянет  (ну там, например, блок питания слабенький)?

  24. Установил atmel studio 6. Код
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>

    #include «nokia1100_lcd_lib.h» // Подключаем драйвер LCD-контроллера NOKIA1100

    char Text[] PROGMEM = «FLASH MEMORY TEST»;

    int main(void)
    {
    nlcd_Init();
    _delay_ms(100);

    nlcd_GotoXY(0,0);
    nlcd_PrintF(Text); // Выводим строку из программной памяти

    _delay_ms(4000);

    nlcd_GotoXY(0,0);

    nlcd_PrintF(PSTR(» Hello, world! «)); // Другой способ задания строк в программной памяти
    nlcd_PrintF(PSTR(«—————-«));
    nlcd_PrintF(PSTR(» DigitalChip.ru «));
    nlcd_PrintF(PSTR(» present «));
    nlcd_PrintF(PSTR(» NOKIA 1100 LCD «));
    nlcd_PrintF(PSTR(» demonstration «));
    nlcd_PrintF(PSTR(«—————-«));

    while(1)
    {

    nlcd_GotoXY(4,7);
    nlcd_Print(«It work!»); // Строка из ОЗУ (RAM)
    _delay_ms(1000);

    nlcd_GotoXY(4,7);
    nlcd_PrintF(PSTR(» «)); // Строка из программной памяти (Flash)
    _delay_ms(1000);
      }
    }
    Дает одну ошибку и 19 варнингов 
    Error 2 variable ‘Text’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’ C:\myproj\GccApplication1\GccApplication1\GccApplication1.c 7 6 GccApplication1. Что это?

  25. bootloader

    файл nokia1100_lcd_lib.c строка 82, почему мы при выборе режима устанавливаем SDA_LCD_SET хотя по идее должны CS_LCD_SET

  26. Надо писать не «it work» а «it works»!

    • 🙂

      Да, конечно, но когда посидишь с проектом несколько суток «не вынимая», на это уже не обращаешь внимания, глаз замыливается и ты просто этого не видишь. Фоткаешь, выкладываешь, разбираешь. А потом, чтоб исправить приходится собирать устройство заново. Зачастую просто лень.

  27. Знакомая программа! 🙂

  28. Приветствую!
    возник вопрс, как выводить переменную, например нужно вывести от 0 до 9 в цикле, как функции nlcd_Print указать переменную?

  29. Константин

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

  30. Владимир

    Здравствуйте!
    Как переназначить выводы Ардуино? Дело в том, что при подключении в моём скетче библиотеки EasyTransferVirtualWire.h перестаёт работать PCF8814_light.h (PCF8814.h). Физически это происходит из-за пропадания сигнала на ноге 11 Ардуинки (SDA). Я не силён в программировании, но, похоже EasyTransferVirtualWire.h перехватывает у PCF8814_light.h аппаратный SPI. В библиотеке вроде заложен вариант программной реализации SPI, но я задействовать его не смог. Переназначение ног в скетче, например, в Hello_World.ino привело к неработоспособности скетча. Нормально работает только библиотека индуса — driver_nokia_1100_lcd.h, но там очень мелкий шрифт.

    Скетч тут: https://yadi.sk/d/Pm4LATAGkx5Ko

  31. Владимир

    Всё! Проблема решена. Решение нашёл тут: http://aonijospot11.appspot.com/majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=654&sid=54718f8cbbd8364efe505a2416bee957
    Цитата:
    Разобрался я с той проблемой. Пришлось залезть в исходники VirtualWire и посмотреть что к чему.
    Короче, библиотека устанавливает типы выводов для RX(приёма) и PTT(push-to-talk), даже если мне нужно только отправлять данные и PTT у меня не используется. А заданные по-умолчанию они совпадают с используемыми для ethernet-шилда, вот они и конфликтовали.

    В итоге вместо:
    Код:
    vw_set_tx_pin(PIN_RF);
    vw_setup(2000);

    Поставил для инициализации:
    Код:
    vw_set_tx_pin(PIN_RF);
    vw_set_rx_pin(A1); // не используемый выход
    vw_set_ptt_pin(A2); // не используемый выход
    vw_setup(2000);

  32. Рамиль

    в функции «nlcd_SendByte()» в цикле for стоит делай на 3 миллисекунды. Это по мне очень много! На видео видно как долго обновляется текст на дисплее. Это получается при отправке каждого бита мы теряем 3 миллисекунды. Подключал дисплей от нокиа 1100 к STM32F215 там растота ядра 120МГц, вот при такой частоте приходилось использовать делай на 1 микросекунд на каждый бит. Когда использовал контроллер с частотой 4МГц, попробовал убрать всякие задержки — отлично работает! Очень быстро всё работает.

  33. Таки я не очень понял — дисплей 1110 будет работать с библиотекой 1100?

  34. привет. сделал все по вашей инструкции, но у меня вылетает вот такая ошибка при компиляции

    In file included from sketch_mar05m.ino:5:0:
    sketch_mar05m:39: error: invalid conversion from ‘const char*’ to ‘unsigned char*’ [-fpermissive]
    In file included from sketch_mar05m.ino:7:0:
    C:\Users\WORK\Documents\Arduino\libraries\lib1100/nokia1100_lcd_lib.h:65:6: error: initializing argument 1 of ‘void nlcd_PrintF(unsigned char*)’ [-fpermissive]
    void nlcd_PrintF(unsigned char * message);
    ^
    variable ‘Text’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    и подсвечивает вот эту строчку
    char Text[] PROGMEM = «FLASH MEMORY TEST»;

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

  35. Владимир

    Привет. Прицепил дисплей 1100 к ардуине, Atmel Studio ругается вот так:

    Compiling ‘Sketch6’ for ‘Arduino Nano w/ ATmega328’
    nokia1100_lcd_lib.c:In function ‘nlcd_Clear’
    nokia1100_lcd_lib.c:65:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
    nokia1100_lcd_lib.c:use option -std=c99 or -std=gnu99 to compile your code
    nokia1100_lcd_lib.c:In function ‘nlcd_SendByte’
    nokia1100_lcd_lib.c:87:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
    nokia1100_lcd_lib.c:In function ‘nlcd_Putc’
    nokia1100_lcd_lib.c:107:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
    Error compiling

    Программист из меня никакой, подскажите что делать.

Добавить комментарий

Поля, помеченные знаком звездочка (*) обязательны для заполнения.