|
LPC2478 + TFT 320x240 совсем рябит (, вместе с курсором.. |
|
|
|
Apr 5 2010, 03:29
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422

|
Частота клока 6,5 МГц (По ДШ рекоммендуют 6,75). С чем может быть связано рябение (я так понимаю постоянно прорисовываются то четные- то нечетные строки)?. Рябит вместе с курсором. Картинка изначально была сдвинута влево вверх, чтоб стала посредине, значительно увеличил Vertical front porch и horizontal front porch(от значений, рекоммендуемых ДШ на ТФТ). При некоторых стечениях обстоятельств)) (положение курсора, данные тестовой картинки) ТФТ вообще отказывается что-либо показывать... (Белый фон, как до инициализации). Смотрел сигналы осциллографом - форма верт. и гор синхронизаций нормальная, синхр. данных (DCLK) - почти синус. Это нормально? Еще интересная особенность - значения LCD_POL(IPC Invert panel clock., IHS Invert horizontal synchronization., IVS Invert vertical synchronization.) в в нескольких комбинациях на картинку не влияют. Подскажите плз в какую вообще сторону думать? ) На всякий случай код с парой тестов и картинку с ДШ ТФТ прилагаю. Код #define LCD_RES_H 320 #define LCD_RES_V 240 #define LCD_BUF_SIZE (LCD_RES_H*LCD_RES_V*2)
unsigned char VideoBuf[LCD_BUF_SIZE] __attribute__((at(NOR_FLASH_BASE))); //SDRAM
void InitLCD() { int i, testnum = 0; int k=0; unsigned short *Pall = (unsigned short *)&LCD_PAL; unsigned short *Vbuf = (unsigned short *)&VideoBuf; unsigned short *Curs = (unsigned short *)&CRSR_IMG; PCONP|= (1<<20); //LCD
PINSEL11 = (6<<1)|(1<<0);// bit0=1 - LCD port is enabled. bit1...3 = 110 TFT 16-bit. (1:5:5:5 mode) LCD_CFG = 10;//72 MHz div 11 //1 // LCD_TIMH = (((42-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2)); // LCD_TIMV = ((6<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1)); //2 //LCD_TIMH = (((31-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2)); //LCD_TIMV = ((3<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1)); //kartinka posredine LCD_TIMH = (((61-1)<<24) | ((67-1)<<16) | ((11-1)<<8) | (((LCD_RES_H/16)-1)<<2)); LCD_TIMV = ((33<<24) | (16<<16) | ((3-1)<<10) | (LCD_RES_V-1));
LCD_POL = ((0<<27) | (1<<26) | (((LCD_RES_H/1)-1)<<16) | (0<<14) | (1<<13)| (1<<12) | (1<<11)| (0<<6) | (0<<5) | (2<<0));
LCD_CTRL = ((0<<10) | (0<<9) | (0<<8) | (1<<5) | (4<<1)); // 100 = 16 bpp, 1:5:5:5 mode.
for(i=0; i<256; i++) Curs[i] = 0xFFFF;
CRSR_CFG = 0; CRSR_XY = (110<<16)|(160<<0); CRSR_CTRL = 1;//Cursor on
LCD_UPBASE = (unsigned long)VideoBuf; LCD_LPBASE = (unsigned long)VideoBuf; for(i=0; i<256; i++)//test { Pall[i] = 0xFF00+i; } LCD_CTRL |= 1;//Enable LCD_CTRL |= 1<<11;//PWR ON
testnum = 3; while(1) { switch(testnum) { case 0://bleklie tsveta for(i=0; i<(LCD_BUF_SIZE/2); i++) if(i < (LCD_BUF_SIZE/4)) Vbuf[i]= (32<<10)|(0<<5)|(0<<0); else Vbuf[i]= (0<<10)|(0<<5)|(32<<0); testnum = -1; break; case 1://ne vivodit - vse beloe for(i=0; i<(LCD_BUF_SIZE/2); i++) if(i < (LCD_BUF_SIZE/4)) Vbuf[i]= 0; else Vbuf[i]= 0xFFFF; testnum = -1; break; case 2://sverhu beloe, vnizu-4ernoe for(i=0; i<(LCD_BUF_SIZE/2); i++) if(i < (LCD_BUF_SIZE/4)) Vbuf[i]= 0xFFFF; else Vbuf[i]= 0; testnum = -1; break; case 3://poloski for(i=0; i<(LCD_BUF_SIZE/2); i++) { if((i % (320*20)) == 0) k = rand(); Vbuf[i]= k; } testnum = -1; break; case 4://random for(i=0; i<(LCD_BUF_SIZE/2); i++) Vbuf[i]= rand() & 0xFFFF; testnum = -1; break;
default: break; } }
}
|
|
|
|
|
Apr 5 2010, 06:56
|
■ ■ ■ ■
    
Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443

|
Вы бы сделали что-то вроде: Код // init Horizontal Timing LCD_TIMH_bit.HBP = C_GLCD_H_BACK_PORCH - 1; LCD_TIMH_bit.HFP = C_GLCD_H_FRONT_PORCH - 1; LCD_TIMH_bit.HSW = C_GLCD_H_PULSE - 1; LCD_TIMH_bit.PPL = (C_GLCD_H_SIZE/16) - 1; // init Vertical Timing LCD_TIMV_bit.VBP = C_GLCD_V_BACK_PORCH; LCD_TIMV_bit.VFP = C_GLCD_V_FRONT_PORCH; LCD_TIMV_bit.VSW = C_GLCD_V_PULSE; LCD_TIMV_bit.LPP = C_GLCD_V_SIZE - 1; , а то народ ленится битики считать.
--------------------
Делай что должен и будь что будет.
|
|
|
|
|
Apr 5 2010, 10:18
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422

|
Сделал более удобочитаемым. Что еще заметил - вдоль левой грани квадрата курсора (по вертикали) проскакивают пиксели, полу-случайно. Т.е. (*-проскакивающий пиксель  ): Код *|------------| | курсор | | | *| | |----------- | Кстати, от негативной ауры глючащего ТФТ)) и на телефоне экран заглючил :-)))) Боюсь как-бы монитор не сдох теперь Код #define LCD_RES_H 320 #define LCD_RES_V 240 #define LCD_BUF_SIZE (LCD_RES_H*LCD_RES_V*2)
#define LCD_TIMH_HBP (61-1) //42-1(ili 31-1 ??) po datasheet na TFT #define LCD_TIMH_HFP (67-1) #define LCD_TIMH_HSW (11-1) #define LCD_TIMH_PPL ((LCD_RES_H/16)-1)
#define LCD_TIMV_VBP 33 //6(ili 3 ??) po datasheet na TFT #define LCD_TIMV_VFP 16 #define LCD_TIMV_VSW (3-1) #define LCD_TIMV_LPP (LCD_RES_V-1)
#define LCD_POL_BCD 1 #define LCD_POL_CPL ((LCD_RES_H/1)-1) #define LCD_POL_IOE 0 #define LCD_POL_IPC 1 #define LCD_POL_IHS 1 #define LCD_POL_IVS 1 #define LCD_POL_CLKSEL 0 #define LCD_POL_PCD_LO 1
#define LCD_CTRL_BEPO 0 #define LCD_CTRL_BEBO 0 #define LCD_CTRL_BGR 0 #define LCD_CTRL_LCDTFT 1 #define LCD_CTRL_LCDBPP 4
unsigned char VideoBuf[LCD_BUF_SIZE] __attribute__((at(NOR_FLASH_BASE))); //SDRAM
void InitLCD() { int i, testnum = 0; int k=0; unsigned short *Pall = (unsigned short *)&LCD_PAL; unsigned short *Vbuf = (unsigned short *)&VideoBuf; unsigned short *Curs = (unsigned short *)&CRSR_IMG; PCONP|= (1<<20); //LCD PINSEL11 = (6<<1)|(1<<0);// bit0=1 - LCD port is enabled. bit1...3 = 110 TFT 16-bit. (1:5:5:5 mode)
//AHBCFG1 = ((0<<0)|(3<<1)|(1<<4)|(3<<4)|(1<<8)|(4<<12)|(3<<16)|(2<<20)|(1<<24)|(5<<28)); LCD_CFG = 10;//72 MHz div 11
LCD_TIMH = (LCD_TIMH_HBP<<24) | (LCD_TIMH_HFP<<16) | (LCD_TIMH_HSW<<8) | (LCD_TIMH_PPL<<2); LCD_TIMV = (LCD_TIMV_VBP<<24) | (LCD_TIMV_VFP<<16) | (LCD_TIMV_VSW<<10) | LCD_TIMV_LPP;
LCD_POL = (0<<27) | (LCD_POL_BCD<<26) | (LCD_POL_CPL<<16) | (LCD_POL_IOE<<14) | (LCD_POL_IPC<<13)| (LCD_POL_IHS<<12) | (LCD_POL_IVS<<11)| (0<<6) | (LCD_POL_CLKSEL<<5) | (LCD_POL_PCD_LO<<0);
LCD_CTRL = (LCD_CTRL_BEPO<<10) | (LCD_CTRL_BEBO<<9) | (LCD_CTRL_BGR<<8) | (LCD_CTRL_LCDTFT<<5) | (LCD_CTRL_LCDBPP<<1); // 100 = 16 bpp, 1:5:5:5 mode. 011=8bit(palette?);
for(i=0; i<256; i++) Curs[i] = 0xFFFF;
CRSR_CFG = 0; CRSR_XY = (110<<16)|(160<<0); CRSR_CTRL = 1;//Cursor on
LCD_UPBASE = (unsigned long)VideoBuf; LCD_LPBASE = (unsigned long)VideoBuf; for(i=0; i<256; i++)//test { Pall[i] = 0xFF00+i; } LCD_CTRL |= 1;//Enable LCD_CTRL |= 1<<11;//PWR ON
... }
|
|
|
|
|
Apr 5 2010, 11:12
|
Частый гость
 
Группа: Участник
Сообщений: 161
Регистрация: 22-06-09
Из: Москва
Пользователь №: 50 531

|
У Меня эффект мерцания был на экране 640х480 при низкой тактовой частоте контроллера или при медленной работе внешней памяти. До конца устранить не удалось. Но если не применять яркости пикселов в диапазоне 1/2 ... 1/4 от максимальной, мерцания практически не заметно. Еще сильное мерцание было при незаземлении металлической рамки вокруг дисплея(от полной яркости до нуля при прикосновении рукой).
--------------------
Ты можешь знать все что угодно, но пока ты не доказал это на практике, ты не знаешь ничего!© Ричард Бах
|
|
|
|
|
Apr 6 2010, 11:01
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422

|
Судя по изображению, явно что-то не то с сигналами т.к. совсем плохое, на незаземленную рамку не похоже.. Рябит так, что кажется , что изобрадение дергается вверх-вниз, + черного нет, он сероватый.. Полярность и форма синхросигналов правильная, а вот форма DCLK смущает..(см. осц-грамму: ~0,5 В\дел, 0,04мкс\дел) Плата в которую подключен ТФТ с платой с контроллером соединяется шлейфом IDC-40 20см. При отключении ТФТ форма не меняется. Шлейф укорачивал с 50см - форма не поменялась.. Померять на плате с контроллером не удалось т.к. осциллограф не синхронизируется) Но подозреваю что там все нормально.. Неужели шлейф так все портит? Он же в ATA используется.. Пулл-ап\даун отключены. Или форма все-таки не смертельная и причина в другом?
Сообщение отредактировал overloaded - Apr 6 2010, 11:03
|
|
|
|
|
Apr 6 2010, 11:45
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422

|
Спасибо, как-то об этом не подумал)) Действительно, Осциллограф С1-49 Полоса пропускания, МГц 5, 1МОм 50 пФ (( Поставил клок 2 Мгц - форма стала нормальная. Т.е. рябь скорее всего чисто логическая выходит.. Буду думать дальше)
|
|
|
|
|
Apr 6 2010, 14:30
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422

|
Анализатор в ближайшие пару дней возможности достать нет...
экран COM41T4148 (http://www.data-modul.com/eu/products/tft_displays/single_tft_small/com41t4148xlc.html?nav=pn) в режме MODE = VSS - т.е. с конфигурацией через SPI. Но тут вроде тоже все уже много раз пересмотрел + если б формат был неправильный, он бы просто не включился т.к. стартует в режиме standby, а командой по SPI этот стендбай отключается, да и на команды flip horizontal, vertical реагирует...
В общем методом научного перебора)), на всякиц случай, перепробовал все комбинации LCD_POL_IPC, LCD_POL_IHS, LCD_POL_IVS.. а также разные бек и фронт порчи, которые только двигают картинку.
Снижал клок вплоть до 1 кадр в 2 секунды - все то-же самое.. Что удалось заметить: Каждый кадр то ниже то выше на 1 пиксель (чередуются). +при активном сбросе контроллера на работающем ТФТ, половина линий(опять-же через одну) белые, остальные- тех цветов что и были Пиксели слева (а при некоторых настройках порчей и справа) от курсора продолжают появляться - в каждом кадре на разной высоте... Пока все сводится к покупке анализатора.. (((
Сообщение отредактировал overloaded - Apr 6 2010, 14:42
|
|
|
|
|
Apr 6 2010, 15:22
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 10-11-09
Пользователь №: 53 547

|
пару мыслеи: видео буфер выровнен по границе 8? а RGB выводы правильные используются в режиме 555 out of 888? и вообще, у вас видео буфер как char pазмером 2х320х240 при этом режим 555 один пиксел это 16бит но ни как не char
Сообщение отредактировал scorp1969 - Apr 6 2010, 15:26
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|