Может есть у кого по ним какая информация?



Та глава с дисплеями от мобильных телефонов никак не связана. Там описана генерация композитного сигнала для вывода на обычные телевизоры (как в ZX-Spectrum).Part 3/Day13 - UTube
На счёт маленького дисплея, помоему это аналог от 6100 вот здесь посмотри, http://vrtp.ru/index.php?showtopic=1120 ... ntry181732Bonio писал(а):Отдали старую nokia 6101. У неё два цветных экрана, внутренний большой и внешний маленький, у маленького 10 выводов, у большого 22 вывода.
Может есть у кого по ним какая информация?
Спасибо!neonix писал(а):Судя по шлейфу похоже на дисплей от nokia5800, надо поискать по форумам ремонтников по маркировке.
Схему можно найти, а вот заюзать очень трудно будет, вернее практически невозможно Там последовательный интерфейс, вернее два - LoSSI и HiSSI (скоростной дифференциальный). Где-то на vrtp.ru я об этом читал.ELcat писал(а):Спасибо!neonix писал(а):Судя по шлейфу похоже на дисплей от nokia5800, надо поискать по форумам ремонтников по маркировке.
А как подпаять, заюзать?
Попробовал ваш код (ради интереса) и сравнил с апаратным SPI, небо и земля, апаратный SPI гораздо быстрей.Avarges писал(а):Удалось поднять FPS при выводе видео на дисплей, на неожиданную для себя величину: с 12.8 кадров в секунду до 17.9. Поэтому продолжу писать про оптимизацию алгоритма, может кому-то потом пригодится.
Вот тут
Вот сама процедура Send_to_lcdКод: Выделить всё
// Отправляем в дисплей пикселы в любом количестве // рисуются они попиксельно слева направо и сверху вниз // когда кадр отрисуется то начинает рисоваться следующий поверх Send_to_lcd( DAT, color ); // Вывод первого пиксела Send_to_lcd( DAT, color ); // второго Send_to_lcd( DAT, color ); // третьегоПикселы идут всегда с первым параметров для процедуры Send_to_lcd( DAT, ...Код: Выделить всё
void Send_to_lcd (char RS, char data) { unsigned char mm; byte_to_send = data; LCD_CLK=0; LCD_DATA=0; if ((RS_old != RS) || (!RS_old && !RS)) { // проверяю старое значение RS и тут (мол если прутся одни команды то дергаем CS) LCD_CS=1; LCD_RS=RS; LCD_CS=0; } for (mm = 0; mm < 8; mm++) { //собсно цикл передачи данных LCD_DATA = (byte_to_send >> 7); LCD_CLK=1; // защелкиваю в дисплей byte_to_send = (byte_to_send << 1); LCD_CLK=0; // готовлю к следующей защелке } RS_old=RS; // запоминаю значение RS LCD_DATA = 0; }
сразу можно убрать проверку эту " if ((RS_old != RS) || (!RS_old && !RS))", вместо этого один раз перед выводом пикселов:
Дальше лучше процедуру Send_to_lcd вообще не использовать, потому что каждый вызов процедуры это RCALL и RET команды, по даташиту 3 и 4 машинных такта теряем на каждый пиксел. Поэтому лучше сразу вытащить вывод пиксела прямо в код:Код: Выделить всё
// Обнуление LCD_CLK=0; LCD_DATA=0; // Сообщаем что данные пойдут LCD_CS=1; LCD_RS=1; LCD_CS=0;
Но после этого всего я получил только 12.8 FPS, а 17.9 после того как последний кусок превратил в прямой код (без цикла):Код: Выделить всё
unsigned char mm, cc, color; ... cc = color; for (mm = 0; mm < 8; mm++) { //собсно цикл передачи данных LCD_DATA = 0; if (cc > 127) { LCD_DATA = 1; } LCD_CLK=1; // защелкиваю в дисплей cc = (cc << 1); LCD_CLK=0; // готовлю к следующей защелке }
Подглядывал как WinAVR это компилирует в ассемблер, в файле .lss получается красивый код на базе SBRC, SBI, CBI команд.Код: Выделить всё
LCD_DATA = 0; if ((cc & 128) == 128) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 64) == 64) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 32) == 32) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 16) ==16) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 8) == 8) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 4) == 4) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 2) == 2) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0; LCD_DATA = 0; if ((cc & 1) == 1) { LCD_DATA = 1; } LCD_CLK=1; LCD_CLK=0;
И вот такой код уже даёт 17.9 FPS на том же самом видео из Терминатора-2.
А можете исходники показать, и насколько быстро выводит.sdsrem писал(а):Avarges писал(а):Удалось поднять FPS при выводе видео на дисплей, на неожиданную для себя величину: с 12.8 кадров в секунду до 17.9. Поэтому продолжу писать про оптимизацию алгоритма, может кому-то потом пригодится.
....
Попробовал ваш код (ради интереса) и сравнил с апаратным SPI, небо и земля, апаратный SPI гораздо быстрей.
Почему вы не используете апаратный SPI ?
Код: Выделить всё
// запись одного байта в дисплей
void lcd_write8(char dat)
{
spi(dat); //1 байт в регистр данных SPI
}
// запись двух байт
void lcd_write_(unsigned int dat)
{
lcd_write8(dat>>8);
lcd_write8 (dat);
}
void lcd_c(void)
{
CS= 1;
#asm("nop")
CS= 0;
}
// выбор регистра в контроллере дисплея
void lcd_reg(char register_name)
{
lcd_write8(0x74); // стартовый байт на передачу команды
lcd_write_(register_name);
lcd_c();
}
// отправка двух байт в графическую память дисплея
void lcd_dat8(char register_dat1, char register_dat2)
{
lcd_write8(0x76); // стартовый байт на запись данных
lcd_write8(register_dat1);
lcd_write8(register_dat2);
lcd_c();
}
// то же самое, но из 16-и битной переменной
void lcd_dat(unsigned int data)
{
lcd_write8(0x76); // стартовый байт на запись данных
lcd_write_(data);
lcd_c();
}И насколько быстрее варианта "Avarges", хотя бы 50 fps получается?sdsrem писал(а):А чего рапортовать-то, сдесь вроде тоже самое есть,