3.95 TFT ILI9488

servmv
Offline
Зарегистрирован: 15.01.2016

Доброго всем дня)

Приобрел девайс http://ru.aliexpress.com/item/Mega-2560-R3-Development-Board-3-6-inch-TF...

У меня в AtmelStudio был написан драйвер для HX8357C, как писали на форумах инициализация подходит от 61581 так и произошло, по поводу "поворотов" экрана почитал даташит, короче забил все нули в регистр.

Дисплей работает но както не так. Даже незнаю как это описать вот фото https://yadi.sk/d/sGxha7EBn3ZmL

обратите внимание, первая строка - буква Ш, во второй строке в слове "детей" 2 одинаковые буквы "е" но втроя кривая) в 4той строке последнее слово "лет" но букву "т" даже не разобрать.

Инициализация:

void LCD_Init_ILI9488(void){
	LCD_RST_H;
	_delay_ms(50);
	LCD_RST_L;
	_delay_ms(150);
	LCD_RST_H;
	_delay_ms(150);
	LCD_CS_L;
	LCD_Write_COM(0xB0);
	LCD_Write_DATA(0x1E);

	LCD_Write_COM(0xB0);
	LCD_Write_DATA(0x00);

	LCD_Write_COM(0xB3);
	LCD_Write_DATA(0x02);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x10);

	LCD_Write_COM(0xB4);
	LCD_Write_DATA(0x00);//0X10

	 		LCD_Write_COM(0xB9); //PWM Settings for Brightness Control
	 		LCD_Write_DATA(0x01);// Disabled by default.
	 		LCD_Write_DATA(0xFF); //0xFF = Max brightness
	 		LCD_Write_DATA(0xFF);
	 		LCD_Write_DATA(0x18);

	LCD_Write_COM(0xC0);
	LCD_Write_DATA(0x03);
	LCD_Write_DATA(0x3B);//
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0x00);//NW
	LCD_Write_DATA(0x43);

	LCD_Write_COM(0xC1);
	LCD_Write_DATA(0x08);
	LCD_Write_DATA(0x15);//CLOCK
	LCD_Write_DATA(0x08);
	LCD_Write_DATA(0x08);

	LCD_Write_COM(0xC4);
	LCD_Write_DATA(0x15);
	LCD_Write_DATA(0x03);
	LCD_Write_DATA(0x03);
	LCD_Write_DATA(0x01);

	LCD_Write_COM(0xC6);
	LCD_Write_DATA(0x02);

	LCD_Write_COM(0xC8);
	LCD_Write_DATA(0x0c);
	LCD_Write_DATA(0x05);
	LCD_Write_DATA(0x0A);//0X12
	LCD_Write_DATA(0x6B);//0x7D
	LCD_Write_DATA(0x04);
	LCD_Write_DATA(0x06);//0x08
	LCD_Write_DATA(0x15);//0x0A
	LCD_Write_DATA(0x10);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x60);//0x23
	
	//LCD_Write_COM(0x36);
	//LCD_Write_DATA(0x0048);
	//LCD_Write_COM(0x36); 
	//LCD_Write_DATA(0x0A);//0x0A
	LCD_Write_COM(0x36);
	LCD_Write_DATA(0b00000000);//0x0A

	LCD_Write_COM(0x0C);
	LCD_Write_DATA(0x55);

	LCD_Write_COM(0x3A);
	LCD_Write_DATA(0x55);

	LCD_Write_COM(0x38);
	
	LCD_Write_COM(0xD0);
	LCD_Write_DATA(0x07);
	LCD_Write_DATA(0x07);//VCI1
	LCD_Write_DATA(0x14);//VRH 0x1D
	LCD_Write_DATA(0xA2);//BT 0x06

	LCD_Write_COM(0xD1);
	LCD_Write_DATA(0x03);
	LCD_Write_DATA(0x5A);//VCM  0x5A
	LCD_Write_DATA(0x10);//VDV

	LCD_Write_COM(0xD2);
	LCD_Write_DATA(0x03);
	LCD_Write_DATA(0x04);//0x24
	LCD_Write_DATA(0x04);

	LCD_Write_COM(0x11);
	_delay_ms(150);

	LCD_Write_COM(0x2A);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0xDF);//320

	LCD_Write_COM(0x2B);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0x3F);//480

	
	_delay_ms(100);

	LCD_Write_COM(0x29);
	_delay_ms(30);

	LCD_Write_COM(0x2C);
	_delay_ms(30);
	
	LCD_CS_H;
}

Адрес пиксиля:

void UTFT_setXY(uint X1, uint Y1, uint X2, uint Y2){
	LCD_Write_COM(0x2a);
	LCD_Write_DATA((X1>>8)& 0xFF);
	LCD_Write_DATA(X1 & 0xFF);
	LCD_Write_DATA((X2>>8)& 0xFF);
	LCD_Write_DATA(X2 & 0xFF);
	LCD_Write_COM(0x2b);
	LCD_Write_DATA((Y1>>8)& 0xFF);
	LCD_Write_DATA(Y1 & 0xFF);
	LCD_Write_DATA((Y2>>8)& 0xFF);
	LCD_Write_DATA(Y2 & 0xFF);
	LCD_Write_COM(0x2c);
}

Рисуем пиксель:

void UTFT_drawPixel(uint X, uint Y, uint Color)
{
	LCD_CS_L;
	UTFT_setXY(X, Y, X, Y);
	LCD_Write_DATA(Color);
	LCD_CS_H;
}

Текст выводится по пиксельно.

void UTFT_printChar8x16(unsigned char sym, int x, int y, uint ColorPix, uint ColorFon, char Flag){
	for (uchar x1=0; x1 < 16; x1++){ // вниз число байт 16
		char dt1 = pgm_read_byte_far(pgm_get_far_address(FONT8x16) + (sym*16) + x1);
		for (uchar y1=0; y1 < 8; y1++){ // число пиксел по горизонтале
			if ((dt1 & (1 << (7 - y1))) != 0){
				UTFT_drawPixel(x+x1,y+y1,ColorPix);
			}
			else{
				if (Flag != 0){
					UTFT_drawPixel(x+x1,y+y1,ColorFon);
				}
			}
		}
	}
}

Повторюсь код на HX8357C отличается только инициализацией, и на 2ром дисплее отрабатывает как часы. Где ошибка? Компилятор atmelstudio6.2

servmv
Offline
Зарегистрирован: 15.01.2016

Народ походу по коду проблем нету, проблема с железом. Я вчера заметил стоит дисплею полежать 30-40 минут почти все хорошо, текст идеален а фигуры в демо режиме начинают искажатся. Пло народ на дисплейном модуле нет не кирамик не танталов не электролитов. Такое в обще должно работать? И может у кого схемка есть? или назначение пинов. Пло китаиц молчит.

slider
Offline
Зарегистрирован: 17.06.2014

слишком много неизвестных. поди питания не хватает. замерьте питание стабилизатора на шилде во время демо на экране. вход должен быть стабильно 5.0-4.9в   , и выход с него 3,25-3,35в. и потом уж добавляйте тантал. 

есть же соседние ветки, там всё про него написано и про других. прочитайте.

 

 

servmv
Offline
Зарегистрирован: 15.01.2016

slider пишет:
слишком много неизвестных. поди питания не хватает. замерьте питание стабилизатора на шилде во время демо на экране. вход должен быть стабильно 5.0-4.9в   , и выход с него 3,25-3,35в. и потом уж добавляйте тантал. есть же соседние ветки, там всё про него написано и про других. прочитайте.

Есть хорошая ветка по 3.5 но там преимущественно другие дисплеи. Мой сильно отличается. Питание в норме. Повесил тантал и керамику на 1117 3.3, есть изменения он заглючил стабильнее, начал разбиратся.

Снял дисплей с шилда, отмыл плату, хорошо припаял. Не помогло. Китаец молчит.

Разбираюсь дальше.

Инициализация, на форумах пишут мол подходит r61581, ну... по сути картинка выше. Разбирась в коде инициализации ссылаясь на даташит https://yadi.sk/d/7ykIwYJ1nB7uR

и прихожу к выводу что высказывания про r61581 полная чушь. Начиная с того что некоторые комманды для r61581 пишут мусор в eeprom ili9488, беру код UTFT от ili9486. И по pdf 9488 сравниваю, немного корректируя до значений по умолчанию. Убирая не нужный код по гаммам. И добавив установку частоты проца и обновления (убрал мерцания).

Проблема не решена но сужена область поиска.

Довайте подробнее по коду: (Видео по коду https://youtu.be/hqOEH4BKvSA)

Заливка цветом\очистка экрана, работает на ура (нет полос)

UTFT_clrScr();
_delay_ms(2500); // паузы для просмотра
UTFT_fillScr(VGA_GREEN); // заливка цветом
_delay_ms(2500);
UTFT_fillScr(VGA_RED);
_delay_ms(2500);
UTFT_fillScr(VGA_BLUE);
_delay_ms(2500);

функция заливки:

void UTFT_fillScr(uint color)
{
	LCD_CS_L;
	UTFT_setXY(0, 0, DISP_Y_SIZE, DISP_X_SIZE);// в дисплей отправляем координаты верхнего левого угла
                                                   // и координаты правого нижнего угла
	LCD_Write_DATA(color);                     // на шину выставляю цвет
	UTFT_FAST_FILL_16(153600);                 // долблю импульсами строб
	LCD_CS_H;
}

Функция заливки блоками 8х8 пиксель, тоже работает.

void UTFT_fill8(uint color, uint X, uint Y)
{
	LCD_CS_L;
	UTFT_setXY(0+Y, 0+X, Y+7, X+7);
	LCD_Write_DATA(color);
	UTFT_FAST_FILL_16(64);
	LCD_CS_H;
}

вызываю так:

for (uint x=0; x < 40; x++){
	for (uint y=0; y < 60; y++){
		UTFT_fill8(VGA_WHITE, 8*y, 8*x); // заливка клетками 8х8
	}
}

заливка пикселями по 1му не работает

for (uint x=0; x < 319; x++){
	for (uint y=0; y < 479; y++){
		UTFT_drawPixel(x, y, VGA_GREEN); // заливка пикселями 1х1
	}
}
void UTFT_drawPixel(uint X, uint Y, uint Color)
{
	LCD_CS_L;
	UTFT_setXY(X, Y, X, Y);
	LCD_Write_DATA(Color);
	_delay_ms(5); // пауза для визуализации, только для отладки
	LCD_CS_H;
}
void UTFT_setXY(uint X1, uint Y1, uint X2, uint Y2){
	LCD_Write_COM(0x2a);
	LCD_Write_DATA((X1>>8)& 0xFF);
	LCD_Write_DATA(X1 & 0xFF);
	LCD_Write_DATA((X2>>8)& 0xFF);
	LCD_Write_DATA(X2 & 0xFF);
	LCD_Write_COM(0x2b);
	LCD_Write_DATA((Y1>>8)& 0xFF);
	LCD_Write_DATA(Y1 & 0xFF);
	LCD_Write_DATA((Y2>>8)& 0xFF);
	LCD_Write_DATA(Y2 & 0xFF);
	LCD_Write_COM(0x2c);
}

переписывал функцию заливки блоками 8х8 пиксель на 4х4, перестает работать появляются полосы шириной 4 пикселя.

На видео все видно. Не пойму инициализация? код? или неисправность?

инициализация:

void LCD_Init_ILI9488(void){
	LCD_RST_H;
	_delay_ms(150);
	LCD_RST_L;
	_delay_ms(150);
	LCD_RST_H;
	_delay_ms(150);
	LCD_CS_L;
	
	LCD_Write_COM(0x11);  // Sleep OUT
	_delay_ms(100);
	
	LCD_Write_COM(0x36);  // Memory Access Control
	LCD_Write_DATA(0x00); // Выключить все повороты

	LCD_Write_COM(0x38);  // Idle Mode OFF

	LCD_Write_COM(0x3A);  // 
	LCD_Write_DATA(0x55); // Interface Pixel Format, DPI 000, DBI 0101(16 BIT)

	LCD_Write_COM(0xC0);		// Power Control 1
	LCD_Write_DATA(0x0d);		// 1.25 x 3.50 = 4.3750
	LCD_Write_DATA(0x0d);

	LCD_Write_COM(0xC1);		// Power Control 2
	LCD_Write_DATA(0x44);

	LCD_Write_COM(0xC2);		// Power Control 3
	LCD_Write_DATA(0x33);
	_delay_ms(50);
	
	LCD_Write_COM(0xC5);		// VCOM Control
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x40);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x40);

	LCD_Write_COM(0xB6);		// Display Function Control
	LCD_Write_DATA(0x02);
	LCD_Write_DATA(0x02);		// 0x42 = Rotate display 180 deg.
	LCD_Write_DATA(0x3B);
	_delay_ms(50);

	LCD_Write_COM(0x2A);		// Column Addess Set
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0xDF);

	LCD_Write_COM(0x002B);		// Page Address Set
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0x3f);
	_delay_ms(50);
	LCD_Write_COM(0x0029);		// Display ON
	LCD_Write_COM(0x002C);		// Memory Write
	_delay_ms(50);
	LCD_Write_COM(0xB1);
	LCD_Write_DATA(0b11010000); // Разгоняем контрол
	LCD_Write_DATA(0b00011111); // 
	LCD_CS_H;
}

 

slider
Offline
Зарегистрирован: 17.06.2014

servmv пишет:

............

Повесил тантал и керамику на 1117 3.3, есть изменения он заглючил стабильнее, начал разбиратся.

..............

 

как будто минус (GND ) слабый.

 

что-то не полная у вас инициализация (но если у народа работает , то возможно дело в железе).

вот здесь  http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie выложил библиотеку UTFT,   переработал несколько инициализаций от ili9488 , закинул в \UTFT\tft_drivers\ili9486  . Оставил распакованую самую лучшую, но можете поэксперементировать.

попробуйте использовать версию IDE 1.5.8.

удалите свою UTFT, замените на эту. Только для своего 16ти битного дисплея в UTFT.cpp   

byte dtm[] = {......., 8, 16, SERIAL_5PIN, SERIAL_5PIN} замените обратно на byte dtm[] = {......., 16, 16, SERIAL_5PIN, SERIAL_5PIN};

рабочий пример:  UTFT\examples\Arduino (AVR)\UTFT_Demo_480x320 . Запустите его. Потом можете и много текста в него добавить.
 
Ну и для эксперемента проверки железа попробуйте остудить и запустить на холоде. 

 

servmv
Offline
Зарегистрирован: 15.01.2016

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

Глюки дисплея были убраны полным изучением и правкой инициализыции. Перед изучением я их там милион от раных авторов перепробовал. Включая ветку 3.5.

По поводу битности в том посте,  ну у меня до сих пор есть соммнения по поводу 8-9-16-18, но по сути битность это только цвет, все комманды принимаются в 8 бит, и контролеру дисплея до п**ды что там на IM0-IM3 при установке адреса, или я не прав?

повторюсь:

void UTFT_drawPixel(uint X, uint Y, uint Color)
{
	LCD_CS_L;
	UTFT_setXY(X, Y, X+1, Y);
	LCD_Write_DATA(Color);
	//_delay_ms(5);
	LCD_CS_H;
}
void UTFT_setXY(uint X1, uint Y1, uint X2, uint Y2){
	LCD_Write_COM(0x2a);
	LCD_Write_DATA((X1>>8)& 0xFF);
	LCD_Write_DATA(X1 & 0xFF);
	LCD_Write_DATA((X2>>8)& 0xFF);
	LCD_Write_DATA(X2 & 0xFF);
	LCD_Write_COM(0x2b);
	LCD_Write_DATA((Y1>>8)& 0xFF);
	LCD_Write_DATA(Y1 & 0xFF);
	LCD_Write_DATA((Y2>>8)& 0xFF);
	LCD_Write_DATA(Y2 & 0xFF);
	LCD_Write_COM(0x2c);
}

работает на 90%, пож. смотрите видео внимательно, 2рая половина это работа функции

for (uint x=0; x < 319; x++){
	for (uint y=0; y < 479; y++){
		UTFT_drawPixel(x, y, VGA_GREEN); // заливка пикселями 1х1
	}
}

на 90% экрана пиксели ставятся на 10 нет. Такое ощущение что какой то глюк контролера дисплея. Собственный счетчик работает (заливка ОК), а принудительная установка адреса пикселя только на 90%.

PS я не юзаю студию от Arduino, я использую AtmelStudio. Код похож на UTFT только по тому что я его портировал от туда.

PS2 Коды показанные в этом посте прекрасно работают с HX8357С (с другой инициализацией соответственно)