Я давненько приметил в этой библиотеке достаточно любопытное сходство одной вещицы.
Функция
Display.Update();
Если может сталкивались с библиотекой U8glib, там выводится на экран изображение вот такой командой:
u8g.firstPage();
do {
draw(); // тут выводимое на экран
} while( u8g.nextPage() );
смысл в том что данные не сразу печатаются а формируются и выводятся целиком т.е. к примеру печатаем линию, ждём секунду, печатаем ещё одну (в др.месте) ждём ещё и т.д. обычно так и выполняется но в U8glib выведится только когда собируться все линии и паузы и напечатается одновременно. Теперь к этой бибе и почему сходсво.
Следуя важей рекомендации по загрузке РАМа напечатал слово, напечатал рамку (на весь экран) и внутри линию толькео не сразу а попиксельно и с небольшой задержкой между пикселями и вот чё:
Так выводит линию толдько сразу целиком спустя delay (10) * 91 (пауза на кол-во циклов for)
x = 2;
for(int i=0; i<91; i++){
Display.drawPixel(x,20,1);
x++;
delay(10);
}
Display.Update(); // за пределами for
а так попиксельно и печатает:
x = 2;
for(int i=0; i<91; i++){
Display.drawPixel(x,20,1);
x++;
delay(10);
Display.Update(); // внутри оператора for
}
Так что команда "печатать на экран" это не "___.print" , не" ___.rawRoundRect" и т.д. , а как раз"___.Update();"
Ну и вот подобное формирование изображения может происходить в оперативке, что и может её перегружать. Как вариант решения просто чаще печатать на экран при написании.
А насчет большого массива верно. в библиотеке формируется массив 96х9 байт а это 864 байта. при оперативке 1к тут даже делать нечего на меге8 или 168
надо принцип работы библиотеки менять. выводить каждый раз. у контроллера в дисплее есть свой видеобуфер насколько помню. и проблем каждый раз выдавать нет. но моих знаний как это сделать не хватает. я уже часов 6 пытаюсь переделать. пока безрезультатно
если получится отпишусь
чтобы немного отвлечься сделал анализатор спектра на библиотеке FFT
инвертировано по вертикали, не стал заморачиваться. просто проверил библиотеку. Сигнал никакой не подавал (под рукой ничего нет, сижу на работе) просто пальцем несколько раз дотронулся до аналогового входа
Если не жалко, сверни сюда полный скетч с последнего фото. Мне под проэкт надо трёхзначное значение с аналоговго порта выводить, твои художества подойдут. я просто немного подкоректирую.
Да, подтверждаю. На 328 -ой меге аж бегом работает. Но как бы не вариант, ну как аварийный, скажем. Я даташит изучал и вот чё наизучал. Основной гемор в том что из визиопамяти нельзя прочитать, т.е. сначало формируем выводимое там, где можем прочитать, а потом весь этот "хлам" загружаем в кэш дисплейчика, поэтому много РАМ-ы и занимает, но нада же ещё обработать другие данные по мимо экрана... Ну как то геморно всё получается..
Ну вот, собственно, и все. Какую версию библиотеки использовать — решать вам. Если вы работаете только с текстом (меню там всякие, сообщения и т.д.), то целесообразно применять версию 1. Она занимает меньше места, компактная и не использует ОЗУ для хранения буферов. Самое то для ограниченных в ресурсах микроконтроллеров.
Ну а если в вашем проекте используется графика, то тут только вторая версия. Но она более требовательна к ресурсам. И программной памяти больше занимает, и в оперативной памяти нехилый такой видеобуфер хранит.
так что с большими цифрами нужно уже использовать шрифт
тестировал вывод графикой на меге 8 для хронометра, кроме 3 больших цифр ничего не влезает. чуть больше и все глюки начинаются. пока наверно так и оставлю
По первой ссылке там всё на Ассамблере, мне дебрей и без него хватает. По третей там в конце форум и некий Андрей пишет что в IDE среде не работает и ему обьясняют что биба написана не для IDE. Хоть там и советовали мне обьявить переменные за пределами оператора, как только я всё это сделал, IDE вобще потеряла файлы библиотеки, и что интересно как только её (бибу) подпортить сразу видит и говорит что там ошибка...
Я весь гугл обшарил, вижу что крупный шрифт выводят, даже 16*24, но мозга не приклею как это получается.
Есть :))...10х16 печатаю. Наколхозил конечно но печатаю. Растяну по ширене вдвое и достаточно. Займусь граффикой.
Уважаемые форумчане пытаюсь переделать существующую бибу(кстати на PIC она работает,проверял в железе),но поскольку с Arduino только начал знакомиться не могу понять почему не определяет класс LCD. //******************************************************************************** // File........: nokia1100_lcd_lib.h
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.
Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS. Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.
Вывод: надо думать о внешнем буфере на SRAM.
PS: Баблиотека на github. Там же есть облегчённая версия без графики.
Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS. Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.
Вывод: надо думать о внешнем буфере на SRAM.
PS: Баблиотека на github. Там же есть облегчённая версия без графики.
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.
тут способ только один. и зависит все от количества графика. вывод короче как символы через массив. заранее рисуешь символы и выводишь на дисплей в нужном месте. если графики много и находит одна на другую вот тут проблемы
вашу бибу с SPI пример Demo mode посмотрел,жалуется при компиляции на PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.
извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
А где такую бибу найти? постоянно заливать не охота,часть программы можно было бы и на работе в симуляторе отследить,что бы не таскаться с железом туда сюда а потом перепроверять соединения,а вдруг где покоцал.
С пиками занимался,после протеуса в 99% в железе работало. С АVR еще только разбираться начал,туго идет еще пока. Тем более большинство писателей не уделяют внимания коментариям и сложновато разбираться в коде.
в интернете полно. библиотека по сути почти у всех одна, а вот внешний вид разный. выбрал из нескольких вариантов которые более приятны по внешнему виду
вашу бибу с SPI пример Demo mode посмотрел,жалуется при компиляции на PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.
извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
Попробуйте в файле PCF8814.h заменить PB2 на 2 и соответственно для PB3 и PB5.
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In constructor 'PCF8814::PCF8814(uint8_t, uint8_t, uint8_t, uint8_t)':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:45: error: 'PB2' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In member function 'void PCF8814::SendByte(char, unsigned char)':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:63: error: 'PB2' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:74: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:76: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:77: error: 'PB5' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:98: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In member function 'void PCF8814::Init()':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:105: error: 'PB5' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:106: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:107: error: 'PB2' was not declared in this scope
Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.
Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.
посторяюсь. оперативно. спасибо. не подумайте плохо. но я проверяю то что мне говорят если планирую в дальнейшем использовать. подтверждаю: обе библиотеки рабочие
скажите а не могли бы вы сделать версию библиотеки еще более облегченную чем licht. без лишних объявлений переменных для удобства понимания работы. большинство все равно не заморочится с переделкой. например передача комманды или данных можно сразу писать. насколько помню (возможно ошибаюсь) если не объявлять а сразу отправлять данные то занимаемый объем будет меньше, не только во флеш памяти, но и в рам (если нужно будет постараюсь найти стратью о влиянии на используюмею оперативную память лишний раз объявленные переменные вместо прямого использования, даже название переменной влияет, хотя казалось бы этого не должно быть. компилятор должен был присвоить например значению 123 1 байт памяти и его адрес (адрес заранее резервирует компилято) и название не должно влиять, но почему влияет не пойму. если на асме писать присваиваешь регистру значение и работаешь с ним независимо от названия (может путаю давно с асмом не работал, да и работал мало) ну да ладно)
и тут когда например вместо ардуины используешь в устройстве уже просто микроконтролер (я лично использую мегу8 обычно, теперь при необходимости и для личного удовлетворения не использования пушки против воробьев тинька 13). и тут уже возникала проблема забитости оперативной памяти от видобуфера.
честно сказать если влезть думаю смогу и сам переделать, но думаю у вас гораздо быстрее получится.
длинно получилось, но надеюсь понятно
p.s. лешак видно уже перестал ходить на форум, у меня бы было к нему пару вопросов как гуру местному
Сомневаюсь что получится вместить библиотеку на тиньку13. Программной памяти в ней 1к, а код одной только урезанной инициализации, без стирания дисплея занимает 1 096 байт. А библиотека PCF8814_light.h с кодом инициализации и стирания экрана занимает 1 478 байт. Так что в среде ардуино уменьшить вряд ли получиться, нужно писать на чистом GCC или ещё лучше ASM.
#define LCD_SCK 13
#define LCD_SDA 11
#define LCD_CS 10
#define RESET 6
#define SCK_LCD_SET digitalWrite(LCD_SCK,HIGH)
#define SDA_LCD_SET digitalWrite(LCD_SDA,HIGH)
#define CS_LCD_SET digitalWrite(LCD_CS,HIGH)
#define SCK_LCD_RESET digitalWrite(LCD_SCK,LOW)
#define SDA_LCD_RESET digitalWrite(LCD_SDA,LOW)
#define CS_LCD_RESET digitalWrite(LCD_CS,LOW)
void SendByte(unsigned char mode, unsigned char c)
{
CS_LCD_RESET;
(mode)? SDA_LCD_SET : SDA_LCD_RESET;
SCK_LCD_SET;
SCK_LCD_RESET;
byte i;
for(i=0;i<8;i++)
{
SCK_LCD_RESET;
if (c & 0x80) SDA_LCD_SET;
else SDA_LCD_RESET;
SCK_LCD_SET;
c <<= 1;
}
SCK_LCD_RESET;
CS_LCD_SET;
SDA_LCD_RESET;
}
void setup() {
pinMode(LCD_SCK,OUTPUT);
pinMode(LCD_SDA,OUTPUT);
pinMode(LCD_CS,OUTPUT);
pinMode(RESET,OUTPUT);
//Init
SCK_LCD_RESET;
SDA_LCD_RESET;
CS_LCD_RESET;
digitalWrite(RESET,LOW);
delay(10); // выжидем не менее 5мс для установки генератора(менее 5 мс может неработать)
digitalWrite(RESET,HIGH);
CS_LCD_SET;
// SendByte(0,0x20); // Запись в регистр Vop
// SendByte(0,0x85); // Определяет контрастность
SendByte(0,0x2F); // Power control set(charge pump on/off)
SendByte(0,0xA4);
//SendByte(CMD_LCD_MODE,0xC8); // mirror Y axis (about X axis)
SendByte(0,0xA1); // Инвертировать экран по горизонтали
SendByte(0,0xAF); // экран вкл/выкл
SendByte(1,0xFF);
}
void loop() {
}
вот уже прогресс. с этим можно работать и даже графику выводить при правильном/сложном подходе, не использую оперативку сильно. проверю завтра если не будет сильной запарки с ремонтом на меге и на тиньке. с текстом и графикой
а насчет голого си ну что ж поделаешь. приходится. даже компилирую код для шим в кодевижн и ардуино для тиньки 13 разница 100 байт приблизительно. порой приходится и к си приходить чтобы сократить
Не годится. Команда сдвига добавляет 20 байт, а задача стояла выжать всё что можно.
jeka_tm пишет:
каким образом это работает
операция побитового сдвига влево (<<) сдвигает биты влево на n разрядов дополняя 0 справа. Сдвиг право (>>) работает аналогично.
как сдвиг работает я знаю. мы сдвигаем байт чтобы получить достпум к нужному биту. а как мы изменяем нужный бит вот это не понял. наверно изначально вопрос некорректно задал
а насчет 20бит думаю это мы переживем, но действительно понятнее настройка если будем использовать другие пины.
проверил вашу основу на тиньке 13. жк дисплей запустился, но что выдал я не понял. не сплошной шум на дисплее как при неправильной инициализации, а что то более осмысленное, но все равно белеберда. не подскажите как пользоваться поподробнее:
например :
SendByte(1,0xFF);
мы отправили FF то есть должна получится вертикальная линия высотой 8 пикселей. но где она должна появится? и еще вопрос как в таком случае задавать координаты вывода?
давно бы уже 1280 выпаяли да баловались уже
Уже не знаю в какую ветку лезть, ну вроде вопрос точно по теме:
Есть ещё одна биба, рабочая, но есть проблемка...только выводит слова.
не знаю какой вечер подряд пытаюсь добавить функцию "печатать точку в координатах ХУ" :))
функция lcd_gotoyx есть, но lcd_gotoyx(1, 1); печатает в (9, 6) т.е. задаёт строку и столбец как в символьном.
от столбцов избавится было просто, закоментировал множитель ширины символа:
а на строку фантазии закончились. Если не сложно, помогите...
вот данные:
Думаю дело в вышеприведённом.
сверну тут и саму бибу. Вся в одном файлике
Похоже нашел в чем проблема вывода графики на меге8 (таже проблема на меге 168)
количество оперативки тупо не хватает обработать такой объем данных
http://robocraft.ru/blog/arduino/531.html
тут подробно описано hugoboss317 почитай
надо оптимизировать код а точнее библиотеку
Полезная информация. Но даже не знаю... Перегрузить RAM библиотекой для 96х65. Другие работают но они более ужатые конечно... Не знаю..
Разве что на днях должен прийти 328 в дипе. Попробую с него.
попробуйте вот что. на меге8 заработало.
как я тестировал:
1. текст - ОК
2. 1 вертикальная "быстрая" линия - ОК
3. 50 вертикальных "быстрых" линий увеличивающихся в размере - ОК
4. 5 скругленных прямоугольников - нарисовал но с глюками, все память закончилась
так же попробуйте и сами увидите
Я давненько приметил в этой библиотеке достаточно любопытное сходство одной вещицы.
Функция
Если может сталкивались с библиотекой U8glib, там выводится на экран изображение вот такой командой:
смысл в том что данные не сразу печатаются а формируются и выводятся целиком т.е. к примеру печатаем линию, ждём секунду, печатаем ещё одну (в др.месте) ждём ещё и т.д. обычно так и выполняется но в U8glib выведится только когда собируться все линии и паузы и напечатается одновременно. Теперь к этой бибе и почему сходсво.
Следуя важей рекомендации по загрузке РАМа напечатал слово, напечатал рамку (на весь экран) и внутри линию толькео не сразу а попиксельно и с небольшой задержкой между пикселями и вот чё:
Так выводит линию толдько сразу целиком спустя delay (10) * 91 (пауза на кол-во циклов for)
а так попиксельно и печатает:
Так что команда "печатать на экран" это не "___.print" , не" ___.rawRoundRect" и т.д. , а как раз"___.Update();"
Ну и вот подобное формирование изображения может происходить в оперативке, что и может её перегружать. Как вариант решения просто чаще печатать на экран при написании.
Насчет Update(); я в курсе.
А насчет большого массива верно. в библиотеке формируется массив 96х9 байт а это 864 байта. при оперативке 1к тут даже делать нечего на меге8 или 168
надо принцип работы библиотеки менять. выводить каждый раз. у контроллера в дисплее есть свой видеобуфер насколько помню. и проблем каждый раз выдавать нет. но моих знаний как это сделать не хватает. я уже часов 6 пытаюсь переделать. пока безрезультатно
если получится отпишусь
чтобы немного отвлечься сделал анализатор спектра на библиотеке FFT
инвертировано по вертикали, не стал заморачиваться. просто проверил библиотеку. Сигнал никакой не подавал (под рукой ничего нет, сижу на работе) просто пальцем несколько раз дотронулся до аналогового входа
Кстати в той статье что давал ссылку был скетч для тестирования загруженности оперативной памяти
Если загрузить скетч с выводом как на картинке, только больших цифр 3, а сверху милисекунд нет, получилось следующее на нано:
свободный объем ОЗУ 937 байт из 2к байт
размер занимаемый размер флеш 7294байт
так как скетч оптравляет данные загрузки по UART, на самом деле занимается немного меньше.
122 байта (если не ошибаюсь) резервирует под буфер функция вывода по UART
получаем:
всего 2048 байт-937=1111 байт занимает вывод картинки плюс вывод по UART
отнимаем 122 получается сама картинка занимает где-то 989 байт плюс минус
из которых 864 байта занимает кэш по дисплей
в меге8 или 168 всего 1024 байт оперативки. получаем:
1024-989=35байт. на 35 байтах далеко не уедешь. надо переделывать библиотеку))
Если не жалко, сверни сюда полный скетч с последнего фото. Мне под проэкт надо трёхзначное значение с аналоговго порта выводить, твои художества подойдут. я просто немного подкоректирую.
в 47 посте уже выкладывал. пользуйся
Ладно, на головоломку много времени уйдёт.
растяни в два раза верхние показания, интересней будет.
нехочется. все становится похожим на minecraft.
Даже не могу вывести просто значение переменной. Не буду на ней останавливаться. Как бы привлеч Асов к 56-му посту.
просто значение без графики выводится или минимальнйо графикой
а если те большие цифры то только 1 цифру и ту с глюками
Да, подтверждаю. На 328 -ой меге аж бегом работает. Но как бы не вариант, ну как аварийный, скажем. Я даташит изучал и вот чё наизучал. Основной гемор в том что из визиопамяти нельзя прочитать, т.е. сначало формируем выводимое там, где можем прочитать, а потом весь этот "хлам" загружаем в кэш дисплейчика, поэтому много РАМ-ы и занимает, но нада же ещё обработать другие данные по мимо экрана... Ну как то геморно всё получается..
большие цифры выводили даже на тиньке 13
http://vrtp.ru/index.php?showtopic=20096&st=210#
http://vrtp.ru/index.php?act=Attach&type=post&id=497756
но не графикой скорее всего а делали шрифт в виде массива. у тиньки 13 RAM всего 64 байта
а те библиотеки которые графику именно выводят требуют большой видеобуфер
http://digitalchip.ru/rabotaem-s-displeem-ot-nokia-1100-v-graficheskom-rezhime
так что с большими цифрами нужно уже использовать шрифт
тестировал вывод графикой на меге 8 для хронометра, кроме 3 больших цифр ничего не влезает. чуть больше и все глюки начинаются. пока наверно так и оставлю
По первой ссылке там всё на Ассамблере, мне дебрей и без него хватает. По третей там в конце форум и некий Андрей пишет что в IDE среде не работает и ему обьясняют что биба написана не для IDE. Хоть там и советовали мне обьявить переменные за пределами оператора, как только я всё это сделал, IDE вобще потеряла файлы библиотеки, и что интересно как только её (бибу) подпортить сразу видит и говорит что там ошибка...
Я весь гугл обшарил, вижу что крупный шрифт выводят, даже 16*24, но мозга не приклею как это получается.
Есть :))...10х16 печатаю. Наколхозил конечно но печатаю. Растяну по ширене вдвое и достаточно. Займусь граффикой.
Уважаемые форумчане пытаюсь переделать существующую бибу(кстати на PIC она работает,проверял в железе),но поскольку с Arduino только начал знакомиться не могу понять почему не определяет класс LCD. //******************************************************************************** // File........: nokia1100_lcd_lib.h
// Author(s)...: Chiper
// URL(s)......: http://digitalchip.ru/
// Description.: Драйвер LCD-контроллера от Nokia1100
// Data........: 21.02.12 // Version.....: 1.0 //***************************************************************************
#ifndef nokia1110_lcd_lib.h
#define nokia1110_lcd_lib.h
//******************************************************************************
// Настройка библиотеки
// Номера выводов порта, к которым подключены выводы LCD-контроллера
#define CS_LCD_PIN 3
#define SDA_LCD_PIN 4
#define RST_LCD_PIN 5
#define SCLK_LCD_PIN 6
#define 0 LOW
#define 1 HIGH //******************************************************************************
// Макросы и определения
#define SCLK_LCD_SET digitalWrite(SCLK_LCD_PIN, HIGH);
#define SDA_LCD_SET digitalWrite(SDA_LCD_PIN , HIGH);
#define CS_LCD_SET digitalWrite(CS_LCD_PIN , HIGH);
#define RST_LCD_SET digitalWrite(RST_LCD_PIN, HIGH);
#define SCLK_LCD_RESET digitalWrite(SCLK_LCD_PIN, LOW);
#define SDA_LCD_RESET digitalWrite(SDA_LCD_PIN , LOW);
#define CS_LCD_RESET digitalWrite(CS_LCD_PIN , LOW);
#define RST_LCD_RESET digitalWrite(RST_LCD_PIN , LOW);
#define CMD_LCD_MODE LOW
#define DATA_LCD_MODE HIGH
#define INV_MODE_ON LOW
#define INV_MODE_OFF HIGH //******************************************************************************
class LCD :
{ public:
void nlcd_Init(void);
void nlcd_Clear(void);
void nlcd_SendByte(char mode,unsigned char c);
void nlcd_Putc(unsigned char c);
void nlcd_Print(char * message);
void nlcd_PrintF(unsigned char * message);
void nlcd_GotoXY(char x,char y);
void nlcd_Inverse(unsigned char mode);
void nlcd_Putz(signed int c);
};
#endif
//*******************************************************************
прошу прощения,но код так и не смог прилепить код по другому,на кнопку ОК никакой реакции вообще.
#include
#include
#define CS_LCD_PIN 3
#define SDA_LCD_PIN 4
#define RST_LCD_PIN 5
#define SCLK_LCD_PIN 6
LCD displ;
void setup(void){
pinMode(CS_LCD_PIN , OUTPUT);
pinMode(RST_LCD_PIN, OUTPUT);
pinMode(SDA_LCD_PIN, OUTPUT);
pinMode(SCLK_LCD_PIN , OUTPUT);
displ.nlcd_Init();
displ.nlcd_Clear();
}
void loop(void)
{
displ.nlcd_GotoXY(0,0);
displ.nlcd_Putc(g);
}
'LCD' does not name a type
Где тут загвоздка? Все файлы в бибы и скетча в одной папке.
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
Либу с сайта http://digitalchip.ru/ переделал под ардуинку. Можно забрать здесь.
Спасибо большое,сейчас буду посмотреть.
все отлично работает
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.
Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS. Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.
Вывод: надо думать о внешнем буфере на SRAM.
PS: Баблиотека на github. Там же есть облегчённая версия без графики.
Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS. Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.
Вывод: надо думать о внешнем буфере на SRAM.
PS: Баблиотека на github. Там же есть облегчённая версия без графики.
картинки с тем что может приложите пожалуйста
хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей
Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.
тут способ только один. и зависит все от количества графика. вывод короче как символы через массив. заранее рисуешь символы и выводишь на дисплей в нужном месте. если графики много и находит одна на другую вот тут проблемы
igorok107
вашу бибу с SPI пример Demo mode посмотрел,жалуется при компиляции на PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.
извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
Т.е. увас всё работало только компилятор ошибки выдавал? Если так, то можно не обращять внимания.
>>извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?
Ничего не делали, просто пытались компилировать и с пятого раза получилось?
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
тут думаю надо искать.
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
А где такую бибу найти? постоянно заливать не охота,часть программы можно было бы и на работе в симуляторе отследить,что бы не таскаться с железом туда сюда а потом перепроверять соединения,а вдруг где покоцал.
С пиками занимался,после протеуса в 99% в железе работало. С АVR еще только разбираться начал,туго идет еще пока. Тем более большинство писателей не уделяют внимания коментариям и сложновато разбираться в коде.
в интернете полно. библиотека по сути почти у всех одна, а вот внешний вид разный. выбрал из нескольких вариантов которые более приятны по внешнему виду
мне вот эта понравилась
http://blogembarcado.blogspot.ru/2012/02/simulino-simulando-arduino.html
качать можно отсюда
http://yadi.sk/d/ee7hLWsaCMeTV
Большое спасибо,сейчас буду посмотреть,у нас просто вечные понты с инетом,и скорость как у черепахи торчилы,много чего не поищешь. Тьмутараканьс..
вашу бибу с SPI пример Demo mode посмотрел,жалуется при компиляции на PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.
извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?
переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures и опять компиляция не идет уже в них ,та же жалоба на незадекларированные PB.
Попробуйте в файле PCF8814.h заменить PB2 на 2 и соответственно для PB3 и PB5.
у меня так и не заработало, правда тестировал в протеусе
кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод
А какая версия дуинки у вас?
1.0.4
1.0.4
В смсле плата Arduino какая. На каком камне?
в железе говорил же еще не проверял. проверю отпишусь. а в симуляторе плата уно, то есть Atmega328
проверил на нано
выдает ошибку
Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.
Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.
оперативно. хорошая работа. теперь работает
а облегченную версию будете править или самим?
Уже. Параллельно обновил.
Уже. Параллельно обновил.
посторяюсь. оперативно. спасибо. не подумайте плохо. но я проверяю то что мне говорят если планирую в дальнейшем использовать. подтверждаю: обе библиотеки рабочие
скажите а не могли бы вы сделать версию библиотеки еще более облегченную чем licht. без лишних объявлений переменных для удобства понимания работы. большинство все равно не заморочится с переделкой. например передача комманды или данных можно сразу писать. насколько помню (возможно ошибаюсь) если не объявлять а сразу отправлять данные то занимаемый объем будет меньше, не только во флеш памяти, но и в рам (если нужно будет постараюсь найти стратью о влиянии на используюмею оперативную память лишний раз объявленные переменные вместо прямого использования, даже название переменной влияет, хотя казалось бы этого не должно быть. компилятор должен был присвоить например значению 123 1 байт памяти и его адрес (адрес заранее резервирует компилято) и название не должно влиять, но почему влияет не пойму. если на асме писать присваиваешь регистру значение и работаешь с ним независимо от названия (может путаю давно с асмом не работал, да и работал мало) ну да ладно)
и тут когда например вместо ардуины используешь в устройстве уже просто микроконтролер (я лично использую мегу8 обычно, теперь при необходимости и для личного удовлетворения не использования пушки против воробьев тинька 13). и тут уже возникала проблема забитости оперативной памяти от видобуфера.
честно сказать если влезть думаю смогу и сам переделать, но думаю у вас гораздо быстрее получится.
длинно получилось, но надеюсь понятно
p.s. лешак видно уже перестал ходить на форум, у меня бы было к нему пару вопросов как гуру местному
Сомневаюсь что получится вместить библиотеку на тиньку13. Программной памяти в ней 1к, а код одной только урезанной инициализации, без стирания дисплея занимает 1 096 байт. А библиотека PCF8814_light.h с кодом инициализации и стирания экрана занимает 1 478 байт. Так что в среде ардуино уменьшить вряд ли получиться, нужно писать на чистом GCC или ещё лучше ASM.
pin mode можно написать на сишном языке. много памяти жрет. управлять также.
вы на каком микроконтроллере тестировали сколько занимает программа во флеше?
pin mode можно написать на сишном языке. много памяти жрет. управлять также.
Ну да,намного меньше стало: "Размер скетча в двоичном коде: 434 байт".
Но это уже не дуина - это практически голый С.
вы на каком микроконтроллере тестировали сколько занимает программа во флеше?
ATmega8
вот уже прогресс. с этим можно работать и даже графику выводить при правильном/сложном подходе, не использую оперативку сильно. проверю завтра если не будет сильной запарки с ремонтом на меге и на тиньке. с текстом и графикой
а насчет голого си ну что ж поделаешь. приходится. даже компилирую код для шим в кодевижн и ардуино для тиньки 13 разница 100 байт приблизительно. порой приходится и к си приходить чтобы сократить
за код спасибо буду работать
А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:
А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:
объясните попродробнее про сдвиги
каким образом это работает
со сдвигами все никак не научусь пользоваться поэтому что не совсем понимаю как это работает
А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:
Не годится. Команда сдвига добавляет 20 байт, а задача стояла выжать всё что можно.
каким образом это работает
операция побитового сдвига влево (<<) сдвигает биты влево на n разрядов дополняя 0 справа. Сдвиг право (>>) работает аналогично.
А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:
Не годится. Команда сдвига добавляет 20 байт, а задача стояла выжать всё что можно.
каким образом это работает
операция побитового сдвига влево (<<) сдвигает биты влево на n разрядов дополняя 0 справа. Сдвиг право (>>) работает аналогично.
как сдвиг работает я знаю. мы сдвигаем байт чтобы получить достпум к нужному биту. а как мы изменяем нужный бит вот это не понял. наверно изначально вопрос некорректно задал
а насчет 20бит думаю это мы переживем, но действительно понятнее настройка если будем использовать другие пины.
проверил вашу основу на тиньке 13. жк дисплей запустился, но что выдал я не понял. не сплошной шум на дисплее как при неправильной инициализации, а что то более осмысленное, но все равно белеберда. не подскажите как пользоваться поподробнее:
например :
мы отправили FF то есть должна получится вертикальная линия высотой 8 пикселей. но где она должна появится? и еще вопрос как в таком случае задавать координаты вывода?