Итак, контроллер PCF8814 позволяет выводить на экран 96 пикселей по горизонтали и 65 пикселей по вертикали. Отсчет начинается от верхнего левого угла.
Данные об изображении записываются побайтно во внутреннюю память (DDRAM) контроллера PCF8814. Адресация по горизонтали (X) идет попиксельно и изменяется от 0 до 95, а по вертикали (Y) задается номер банка, который изменяется от 0 до 8. Адреса вне этих диапазонов не допускаются. Всего есть 9 банков по 96 байт. В девятом банке используется только 1 пиксель. В зависимости от включенного режима значащим является либо старший бит передаваемого байта, либо младший.
Адресация памяти может работать в двух режимах — горизонтальном и вертикальном. В горизонтальном режиме при записи каждого байты в память счетчик X увеличивается на единицу. При достижении предела по горизонтали (95) он сбрасывается в 0, а счетчик Y увеличивается на единицу.
При вертикальном режиме адресации при каждой записи байта в память на единицу увеличивается счетчик Y, при достижении предела (8) он сбрасывается в 0, а горизонтальный счетчик увеличивается на единицу. Картинка, приведенная ниже, подробно описывают способы адресации.
Контроллер PCF8814 может подключаться к микроконтроллеру с помощью:
- SPI по трем линиям
- SPI по четырем линиям
- шины I2C
- последовательного 3-х проводного интерфейса
В дисплее от Nokia 1100 реализовано подключение по 4-проводному SPI. В принципе, это неплохо, так как хоть и не экономит выводы микроконтроллера, но немножко разгружает программу работы с дисплеем. При подключении используются сигналы:
- SCLK — линия тактирования
- SDA — линия передачи данных и команд
- CS — линия, определяющая передачу команды или данных
- RST — линия аппаратного сброса
Дисплей от Nokia 1100 позволяет только записывать данные в память (DDRAM) контроллера дисплея. Чтение из памяти не реализовано, хотя сам контроллер PCF8814 это позволяет. Поэтому, что бы определить, что у вас записано в памяти дисплея, необходимо в микроконтроллере организовывать буфер с данными для дисплея и отслеживать то, что записано, по нему.
В общем, настоятельно рекомендую ознакомиться с даташитом на контроллер PCF8814 (в материалах к статье). Там описано много нюансов и режимов работы с контроллером, приведена система команд и т.д.
Я долго искал библиотеку для работы с этим контроллером, но ничего путного и работающего сразу не нашел. Поэтому пришлось слепить свою библиотеку из найденных кусков, адаптировав под AVR-GCC. В итоге дисплей заработал практически сразу же:
На фотке выше показана работа демонстрационной программы работы с дисплеем. Сама программа никаких сложностей не представляет. Вся работа реализована в библиотеке.
#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, далее — несоответствие ниодной кодировке. Поэтому при работе с кириллицей следует уделить внимание кодировке символов кириллицы.
Вот прототипы реализованных в библиотеке функций:
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);
Из названий функций, я думаю, понятно что они делают.
На этом, пожалуй все. Если есть вопросы, буду рад ответить в комментариях к посту.
Ну, и напоследок небольшое видео с демонстрацией работы.
Подключение дисплея Nokia 1100. Часть 1.
Вливайтесь в обсуждение
  85 комментариев
Раф
13 лет назадкак можно сделать из этого экрана тестер?
Chiper
13 лет назадВсмысле?
Igorexa92
10 лет назад«В вертикальном режиме при записи»
обратите внимание, опечатка.
Igorexa92
10 лет назад«В горизонтальном режиме при записи»
Chiper
10 лет назадДа, спасибо, действительно опечатка. Сейчас поправлю.
Alex
13 лет назадСпасибо за исходники. Как появится дисплей опробую
Chiper
13 лет назадВсегда пожалуйста… 🙂
-Валера-
13 лет назадПриветствую.
Пробую скомпилировать проект — Winavr-20100110 — «вываливает» под 20 ошибок.Вопрос: в чем грабли?
Chiper
13 лет назадУ меня более новый toolchain стоит. Может быть по этому?
У меня компилится вообще без единой ошибки или варнинга.
Приведи лог ошибок, попробуем разобраться…
-Валера-
13 лет назадСвязь есть — это уже хорошо 🙂 Поскольку программист я хоть куда — возникает вопрос КАК снять лог ошибок ?
Chiper
13 лет назадПерейди в студии в ту часть, где выводятся ошибки, нажми Ctrl+A, клацини правой кнопкой мыши и выбери пункт Copy. После этого вставь в коммент. Помоему все просто… 🙂
-Валера-
13 лет назадЕсть :
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
-Валера-
13 лет назадЭто не все-продолжение следует..
-Валера-
13 лет назад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
Chiper
13 лет назадПопробуй вот этот блок:
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("----------------");
Chiper
13 лет назадУ тебя просто не подключена библиотека. Подключи ее к проекту.
-Валера-
13 лет назадОшибок стало меньше, но все же. По поводу подключения библиотеки- создал проект, затем 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
Chiper
13 лет назадСтрока: 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.
Все, все работает.
-Валера-
13 лет назадСейчас попробую…
-Валера-
13 лет назадУ меня в дереве проекта после щелчка правой кнопкой кнопкой мыши — нет строк Add Existing Source Files, Header Files, Add Existing Header Files но в дереве проекта ВСЕ файлы прикрепленны. Но… ПРИЧИНА НАЙДЕНА !!!
Достаточно было в файле программы заменить расширение библиотеки с .h на .с ( строка 5) как — все заработало. Большое спасибо за помощь, на сегодня все — буду отбиваться ( на работу однако:)).
Chiper
13 лет назадСтранно… А вы точно в AVR Studio програмите?
-Валера-
13 лет назадПриветствую.
У меня компилятор — Winavr , не студия. Пробовал ее установить-по умолчанию файлы проекта Assembler, а мне нужно Си. Знаю что как-то можно приаттачить и Си, но … Установил Winavr и успокоился:)
Дисплея у меня нет-попробовал запустить его в Протеусе- чегой-то тормоза ужасные — от момента запуска симуляции до момента инициализации дисплея проходит 22 сек. и до момента инициализации на экране мусор, затем начинается отрисовка текста — НО зеркально и с нижнего левого угла. Может модель в Протеусе глючная (других-нет).
Отсюда вопросы: пробовали в симуляторе «прогнать» LCD ? Какие есть соображения по данной проблеме ?
В любом случае завтра поеду за дисплеем-попробую в железе.
Chiper
13 лет назадЯ сначала установил AVR Studio, а потом WinAvr. Все зацепилось автоматом. Теперь, когда создаешь новый проект, на выбор предлагается создать проект на ASM или на AVR C.
Пользовался Протеусом очень давно и, честно говоря, даже не представляю, как будет работать эта программа там, и есть ли в нем вообще такой экран.
Так как Протеусом пользуюсь очень редко, то даже и не знаю, что предложить.
-Валера-
13 лет назадПриветствую.
Небольшой отчет о проделанной работе-приобрел пару дисплеев Nokia 1100 ( а заодно и парочку 1110i — оригинал и китай — есть мысль использовать ИХ, цена смешная + есть разъем + подсветка).
На 1100 распаялся прям на шлейфе-ничего не отвалилось, все надежно держится, в общем все сразу заработало. Есть вопросы — а как без них 🙂
— при включении происходит очистка экрана ( прибл. 14 сек) затем отображается текст ( все корректно), можно ли это время уменьшить ? От чего оно зависит ? Понимаю, что можно выкл. LCD чтобы мусор на наблюдать, но 14 сек прийдется выждать. Пробовал поиграть с частотой тактирования от 1 до 16 мГц-от частоты зависит время очистки и вывода текста. Какова причина ? Ведь _delay_ms(); указывает на количество милисек., а не кол-во тактов ?
— на демонстрационном видео обновление экрана происходит сверху вниз-ПОСТРОЧНО, а у меня «построчно —> банками». Вопрос: где в программе это реализованно ? ( Реализованно ли? Если не сложно-дайте пример реализации).
— на какой частоте у Вас работает МК ?
P.S.
Даташит на PCF8814 «курить» начал, но пока не в затяжку, да — 1110i работает, хотя где-то слышал, что контроллер там только схож по командам с PCF8814, а какой именно 🙁
Chiper
13 лет назадпривет, привет
Даже и не знаю. У меня не получилось, хотя я долго пытался.
У меня очистка занимает порядка 6 сек.
Дисплей очищается по «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
Chiper
13 лет назадхз. за неимением 1110i как он работает и из чего состоит не могу сказать…
Alex
13 лет назадПроверил в протеусе все работает А чтоб работало быстрее задержки в программе надо уменьшить
Chiper
13 лет назадПротеус не отображает реальной обстановки. То что работает в Протеусе, далеко не всегда работает в реале. И наоборот.
-Валера-
13 лет назадПроблема решена-действительно нужно уменьшить программно задержку тактирования LCD и все работает, инициализация дисплея проходит за 2 секунды 🙂
Chiper
13 лет назадЭто в отклонение от даташита…
-Валера-
13 лет назадПолностью согласен, но ждать 22 сек. инициализации LCD — это слишком, а так работает .
Chiper
13 лет назадУ меня не пошло. Если уменьшить задержку, то вообще ничего не выводится… 🙁
-Валера-
13 лет назадУменьшил задержку для
SCLK_LCD_SET;
c <<= 1;
_delay_ms(3);
с 3 мили до 200 микро секунд — работает, срыв происходит при
130 микросек.
Chiper
13 лет назадЯ понял. Я тоже пытался уменьшать эту задержку. У меня, если ее установить менее 2 мс, то на экран уже ничего не выводится… Поэтому, если у тебя можно установить меньшую задержку, то это гуд…
P.S.: Вот одна из ситуаций, где Протеус показывает нормальную работу даже при нулевой задержке, а на реальном железе все работает несколько иначе…
-Валера-
13 лет назадПриказал долго жить 1100, а 1110i-трудится без отдыха.
Попробую прикрутить библиотеку для возможности вывода графики.
Chiper
13 лет назадЖаль конечно… 🙁
-Валера-
13 лет назадПривет.
Что-то с выводом графики у меня «засада» — прошу помочь (если есть желание 🙂 — дать,так сказать, небольшой ликбез). С Выводом великого русского языка на дисплей -полный порядок — от А до Я.
Chiper
13 лет назадПомогу чем могу. В чем проблема возникает?
-Валера-
13 лет назадПривет. Извиняюсь за задержку в ответах-не всегда хватает свободного времени на хобби 🙂 . С выводом графики в данный момент ситуация такова: задача №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]);
}
Итоги:
все работает, но данные выводятся «банками», а хотелось бы организовать вывод графики попиксельно.Как — 🙁 ? В конечном результате хочу вывести на весь экран — свободный рисунок, фото и т.д.
Принимаю любые рекомендации…
Chiper
13 лет назадДас-с-с… Надо подумать…
Chiper
13 лет назадЧто бы выводить графику, надо в памяти создавать буфер, так как этот экран не позволяет читать из своей памяти, а без знания значения в ячейке памяти ни о каком выводе графики речь идти не может.
Буду думать…
Chiper
13 лет назадБлин, не могу отладить вторую версию библиотеки с графическими функциями… экран глючит безбожно. Не сгорел ли?!..
Но процесс написания идет полным ходом.
Кстати, ты в Протеусе этот экран отлаживал? В моем Протеусе (7.7 Sp2) этого экрана нет. Есть от Nokia 7110, но там немного все по другому…
-Валера-
13 лет назадВывел графику 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, сейчас проверил-все работает, есть небольшое подтормаживание временами, но это терпимо.
Chiper
13 лет назадЗачем? Ничего не надо.
Обязательно. Хранение графики в ОЗУ — это кощунство. Если применять библиотеку на микроконтроллерах типа Atmega32 и выше, где программной памяти довольно много, то графику можно хранить в программной памяти. Если графики много, то, конечно же, лучше применять внешнюю память.
Сегодня вечером доработаю вторую версию библиотеки. Уже реализована работа с пикселями.
Я бы, конечно, не отказался. Можно списаться по емылу, а там озвучить адреса и т.д. Можно в форме обратной связи
Ну не знаю, мой пока работает (тьфу-тьфу) от 3.3V, по схеме, что я выше приводил. Контакт плохой был. Сейчас переделал конструкцию немного.
Понял, щас поищу…
Максим
13 лет назадДобрый день!
У меня возникла некоторая проблема с использованием библиотеки.
Цель устройства — отображать текст, пришедший в пакете из 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. Другие варианты.
Буду очень признателен за ответ.
Спасибо!
Chiper
13 лет назадИнтересная проблема. Но вот ее решение зависит от многих параметров.
Наиболее бюджетный способ решения — это приведенный вами пункт 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 например)
Максим
13 лет назадСпасибо за ответ.
В принципе, в средствах не ограничен, хотя, отмечу, что FT232 стоит около 230 руб в Питере (чувствую, надо пачку из Китая заказать), а дисплей от nokia 3310 — 80-90 руб 🙂 ARM, мне кажется, для этих целей будет излишен, да и jtag у меня отсутствует. Скорее всего, остановлюсь сейчас на втором контроллере, благо tiny2313 штук 5 еще есть. Если не поможет, подцеплю дисплейчик 3310. Раз уже написан код для HID, буду дожимать проект до конца в этом виде 🙂
Chiper
13 лет назадНу тогда бы я бы поцепил tiny2313 на V-USB, а atmega16 на обработку и вывод на экран.
Но от экрана 1100 скорости ожидать не приходится. Тормозной он. Что есть, то есть.
Qwer
12 лет назадА как же он, бедный, в телефоне-то работает?
Chiper
12 лет назадТак и в телефоне он тормозной.
Максим
13 лет назадНашел выход из положения 🙂 Необходимые задержки вынес на внешний 555 таймер. Когда таймер заканчивает свою работу, контроллер ловит и обрабатывает прерывания. Также живет внутренний таймер, который раз в секунду проверяет наличие в буфере нового текста, если он есть, то отображает его, пинает внешний таймер. Обработчик прерывания после отрабатывания внешнего таймера чистит буфер и экран. Таким образом я укладываюсь в диапазон 50 миллисекунд, когда девайс должен сообщить хосту о том, что он еще жив и на шине.
Есть нюанс: в процессе вывода на экран устройство занято и не удается записать что либо в буфер. Вышел из положения просто — на хосте отправляю данные 5 раз — в крайнем случае, со второго-третьего доходит.
Ммм… Был сегодня в магазине, прикупил at90usb16. Буду теперь осваивать ЛУФУ, да и надо попробовать добавить радиоканал в устройство…
Chiper
13 лет назадУж как то геморно. Может все-таки отдельный контроллер на экран, отдельный на USB?.. Контроллеры сейчас недорого стоят.
Максим
13 лет назад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/). В сумме имеем достаточно быструю работу с дисплеем, корректное отображение русских символов (тот вариант, что брал на этом сайте, русские символы дефайнил, но не выводил). Буду рад, если это поможет Вам создать следующую версию библиотеки.
Chiper
13 лет назадШас работаю над библиотекой. Скоро опубликую новую версию. Ускорил вывод на экран, корректное отображение кириллицы, другие доработки.
Максим
13 лет назадbtw: большое спасибо за библиотеку! 😉
Chiper
13 лет назадПожалуйста… 🙂
Максим
13 лет назадЭто слишком просто :)))
Chiper
13 лет назадМы не ищем легких путей!… 🙂
Андрей
12 лет назадЗдравствуйте, такой вопрос, почему экран от 1100 такой бледный? Я вывожу на него информацию но ничего не видно, в чем может быть причина?
Андрей
12 лет назадВот если убираю питание с ножки VDDl тогда экран темнеет но зато надписи становяться контрастными и легко различимыми
Chiper
12 лет назадА какое напряжение вы подаете? Может быть его не хватает? Или питание по мощности не тянет (ну там, например, блок питания слабенький)?
demON
12 лет назадУстановил 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. Что это?
bootloader
11 лет назадфайл nokia1100_lcd_lib.c строка 82, почему мы при выборе режима устанавливаем SDA_LCD_SET хотя по идее должны CS_LCD_SET
Shion
11 лет назадНадо писать не «it work» а «it works»!
Chiper
11 лет назад🙂
Да, конечно, но когда посидишь с проектом несколько суток «не вынимая», на это уже не обращаешь внимания, глаз замыливается и ты просто этого не видишь. Фоткаешь, выкладываешь, разбираешь. А потом, чтоб исправить приходится собирать устройство заново. Зачастую просто лень.
Shion
11 лет назада еще не present а presents) ну да ладно понимаю…бывает
Chiper
11 лет назад🙂
Alex_EXE
11 лет назадЗнакомая программа! 🙂
Chiper
11 лет назад🙂
Иван
10 лет назадПриветствую!
возник вопрс, как выводить переменную, например нужно вывести от 0 до 9 в цикле, как функции nlcd_Print указать переменную?
Chiper
10 лет назадНапрямую — никак. Прежде чем вывести переменную, ее нужно преобразовать в строку, а потом уже nlcd_Print.
Здесь отвечал уже: http://digitalchip.ru/biblioteka-avr-gcc-dlya-lcd-ekrana-nokia-6610-obnovlenie#comment-4667
Константин
9 лет назадБольшое спасибо за бибилиотеку!
Нашёл у себя в закромах 1200 дисплей. Лежал лет 5. Благодаря вам, сохранил кучу времени.
Не понял правда, как вы русские буквы планировали использовать в этой либе. Ну да ладно.
Владимир
9 лет назадЗдравствуйте!
Как переназначить выводы Ардуино? Дело в том, что при подключении в моём скетче библиотеки 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
Владимир
9 лет назадВсё! Проблема решена. Решение нашёл тут: 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);
Рамиль
9 лет назадв функции «nlcd_SendByte()» в цикле for стоит делай на 3 миллисекунды. Это по мне очень много! На видео видно как долго обновляется текст на дисплее. Это получается при отправке каждого бита мы теряем 3 миллисекунды. Подключал дисплей от нокиа 1100 к STM32F215 там растота ядра 120МГц, вот при такой частоте приходилось использовать делай на 1 микросекунд на каждый бит. Когда использовал контроллер с частотой 4МГц, попробовал убрать всякие задержки — отлично работает! Очень быстро всё работает.
Edward
9 лет назадТаки я не очень понял — дисплей 1110 будет работать с библиотекой 1100?
Владимир Мешков
9 лет назадпривет. сделал все по вашей инструкции, но у меня вылетает вот такая ошибка при компиляции
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»;
программист из меня никакой, подскажите пожалуйста что исправить. заранее спасибо.
Владимир
9 лет назадПривет. Прицепил дисплей 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
Программист из меня никакой, подскажите что делать.
Bkmz
7 лет назадЗдравствуйте. Поменял с PORTC на PORTD, дисплей ничего не отображает. Ноги контроллера PD0-PD3. Не пойму что не так.
#define PORT_LCD PORTD
#define PIN_LCD PIND
#define DDR_LCD DDRD
//
#define SCLK_LCD_PIN 3
#define SDA_LCD_PIN 2
#define CS_LCD_PIN 1
#define RST_LCD_PIN 0
Sergos
7 лет назадВключил Nok6510 отображает сдвинуто и без контраста совсем(еле видно в свете фонаря). Контроллер pcf8814. Подключил по вашей схеме:управление через 4к7, vdd и vddi -3v3, вывод vout через конденсатор 1mkf в землю,увеличение емкости не влияет, отсутствие емкости делает отдельные пиксели символов более контрастнее, а остальные совсем становятся невидимыми.
Как выкрутить контраст? Ещё не могу понять верно ли выбрано питание, т.к. там одно, в другом месте другое.
Sergos
7 лет назадАвтор, мне на другом сайте ответили. Контрастность регулируется регистром Vop(смотреть таблицу в доке на pcf8814). Я взял ваш пример+CVAR библиотеку. В библиотеке, думается, косяки с задержками, и в функции вывода, задержки большие, заменил delay_ms(3) на delay_US,работает. Vop было 0x20 , стало 0x22, без подсветки на lcd nok6510 все видно.
Евгений
6 лет назадЯ один такой тупой или где взять данную библиотеку то (avr / io.h)???
Везде говорится о ней, но негде её скачать. Пииииз ПАМАГИТЕ!!
Chiper
6 лет назадЭто стандартный заголовочный файл из тулчейна AVR.
Анатолий
2 года назадИнит для дисплея Нокиа2112 на таком же контроллере. Не нашел нигде, пришлось с живого тела считывать. Сомневаюсь, что нужен, но всё же. Поисковики сюда приводят за подобным))
nlcd_SendByte(CMD_LCD_MODE,0x24);
nlcd_SendByte(CMD_LCD_MODE,0x8F);
nlcd_SendByte(CMD_LCD_MODE,0xA6);
nlcd_SendByte(CMD_LCD_MODE,0xA4);
nlcd_SendByte(CMD_LCD_MODE,0x2F);
nlcd_SendByte(CMD_LCD_MODE,0xA1);
nlcd_SendByte(CMD_LCD_MODE,0xC0);
nlcd_SendByte(CMD_LCD_MODE,0x40);
nlcd_SendByte(CMD_LCD_MODE,0xAF);
nlcd_SendByte(CMD_LCD_MODE,0x10);
nlcd_SendByte(CMD_LCD_MODE,0x00);
Chiper
1 год назадСпасибо!