3.95 TFT ILI9488
- Войдите на сайт для отправки комментариев
Доброго всем дня)
Приобрел девайс 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
Народ походу по коду проблем нету, проблема с железом. Я вчера заметил стоит дисплею полежать 30-40 минут почти все хорошо, текст идеален а фигуры в демо режиме начинают искажатся. Пло народ на дисплейном модуле нет не кирамик не танталов не электролитов. Такое в обще должно работать? И может у кого схемка есть? или назначение пинов. Пло китаиц молчит.
слишком много неизвестных. поди питания не хватает. замерьте питание стабилизатора на шилде во время демо на экране. вход должен быть стабильно 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)
Заливка цветом\очистка экрана, работает на ура (нет полос)
функция заливки:
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; }............
Повесил тантал и керамику на 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};
По поводу минуса, исключено, питание и пульсации мерял на 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С (с другой инициализацией соответственно)