forfrends, перевод на ДУЕ неудобен, там с портами набезобразили, раскидали кусками по всей плате и обозначаются иначе.
неужели у друзей или знакомых нет какойнибудь электроники? этих резисторов валом везде, особенно в старых материнках, cd-rom, hdd , платах принтеров, телевизоров, ... . пойдут от 10ком-20ком (мож и поменьше номиналы, непроверял) . вместо стабилитрона 3,0-3,3в белый светодиод, или 2 старых красных последовательно.
Lelick, как подключить смотрите внимательно подобные примеры выше, можете в инете найти схему на тлф и глянуть, на других форумах от сониэриков подключали, ссылка подобного давал в предыдущем посте.
дисплей 16бит, для перевода на 8 бит надо перекинуть дорожку проходящую между кондерами С6 и С2 с "+" на "GND". Распиновка оказалась часто встречающаяся 37пин:
вызов библиотеки UTFT myGLCD(ILI9325D_16ALT,38,39,40,41);
всё таки для надёжности лучше не использовать подсветку дисплея в качестве стабилизатора , желательно стабилитроном 3,0-3,3в . Разноцветные эмальрованные провода с моторчиков cd-rom, старых кассетных магнитофонов,....
дисплейчик большой, красочный, очень хорошие углы обзора, имеет металлизацию с тылу, к которой удобно приклеить на 2х сторонний скотч всё остальное. Можно высвободить ещё 2 пина : вывод RESET дисплея соеденить с таким же на ардуино, чтоб дисплей сбрасывался вместе с ней. и вывод CS (выбор кристалла) лог.0 (на GND) . с UTFT вычистить их использование и вуаля :) , имеем 12 пинов свободных (8 из них аналоговые) . Если прижмет можно и D0-D7 использовать, если микросхему регистр добавлять.
устройство получилось очень компактное и тонкое (если заменить кварц, кондеры, убрать кнопку, то толщина 5мм , львиная доля - толщина дисплея) . По ширине и длине чуть меньше пластиковой карты.
В качестве корпуса превосходно подходят карточницы, и прозрачный корпус от пакета симки Мегафон , Теле2 ,... , сверху ещё остается место чтоб шурупами насквозь притянуть корпус куда нибудь.
устройство предназначалось как логгер с графиками температур и напряжений.
//Если использовать ардуино 3,3в, то никакие резисторы и не надо. питание можно от лития, и в корпус от старых аудио кассет вместе с аккумулятором.
новые дисплеи можно ещё найти в магазинах в своих городах, то там обычно остатки, цена 50-200руб.
// 05.2017 дополнение
стабилитрон понадежнее поставить 3.0в , 3.3 это рядом с пределом диспа.
Slider, можете помочь? Пытаюсь подогнать программу из первого поста к Дуе... Сразу возникло несколько вопросов:
В коде используется пин #define CD_Pin 38 // (RS), Но у меня в распиновке нет ни CD ни RS, это случайно не DC? Также вопрос: в коде есть RST_Pin 41 это подключение пина RESET дисплея?
И еще : PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
Как именно происходит считывание ИД дисплея? Если не ошибаюсь - это команды настройки портов А и С на вход? Можно ли просто заменить на код for (i=22; i<=37;i++) { pinMode(i, INPUT); }
Попробовал переделать код под Arduino DUE и дисплей 128*64 на контроллере ST7920. Вот что получилось:
#include "U8glib.h"
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17
int i;
byte byteH;
byte byteL;
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//lcd.begin(16, 2);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=42;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
u8g.setPrintPos(0, 10);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0);
byteL=0;
if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0);
u8g.setPrintPos(0, 30);
u8g.print("ID display: ");
u8g.print(byteH, HEX);
u8g.setPrintPos(0, 50);
u8g.print(byteL, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void setup(void) {
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
void loop() {
// put your main code here, to run repeatedly:
}
В результате в верхней строке только нули и ИД контроллера - тоже нули. Есть большое побозрение на неправильное подключение дисплея (писал в предыдущем посте). Можете с этим помочь?
Перелапатил кучу сайтов... Не нашел никакой другой распиновки кроме той что уже имеется. НО! Везде распиновка была на дисплеи 1.5-2.5 дюймов, а здесь все 4". Настораживает это.
Попробовал переделать программу читалка ID дисплеев v2.0 под ДУЕ. Собственно, вот что получилось:
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteH=0x00 ; byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteH=0x00 ; byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteH=0x00 ; byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteH=0x00 ; byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteH=0x00 ; byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(RSTX, 0); delay(15);
digitalWrite(RSTX, 1); delay(250);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вверх и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
//byteH=0; byteL=0;
//byteH=PINA; // считываем с выводов PORTA
//byteL=PINC; // считываем с выводов PORTC
byteH=0; // PORTA считаем
if ( digitalRead(29) ) byteH=byteH+128;
if ( digitalRead(28) ) byteH=byteH+64;
if ( digitalRead(27) ) byteH=byteH+32;
if ( digitalRead(26) ) byteH=byteH+16;
if ( digitalRead(25) ) byteH=byteH+8;
if ( digitalRead(24) ) byteH=byteH+4;
if ( digitalRead(23) ) byteH=byteH+2;
if ( digitalRead(22) ) byteH=byteH+1;
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
//PORTA=byteH ;
//PORTC=byteL ;
if (byteL == 0x00){
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
Serial.print("register " );
Serial.print(byteH, HEX );Serial.print(" ");Serial.println(byteL, HEX );
// 1-будем передавать команду
//digitalWrite(RDX, 1); // порт дисплея в режим приема ***************
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
wrx_u(); // дергаем WRITE вверх
// 2-будем принимать данные
port_in(); // порт ардуины на вход
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
digitalWrite(WRX, 1);
rdx_u(); // дергаем RD и получаем данные
Serial.print("1 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
Serial.println("");
}
Из дисплея ничего не читает. Пины DB7-0 подключал к пинам 37-30 ардуины.
так то правильно перевод байтов на пины и обратно, молодец,(точность не проверял, но принцип вы точно уловили) так мне кажется проще для DUE (можно и ещё упростить чтение с пинов используя операции сдвига в байте - эт для заядлых разбирающихся в С++, я начинал с программирования на ассемблере, С++ для меня тяжко, надо постоянно в нём быть, чтоб помнить что к чему).
Как вариант , можно ещё глянуть как пересылает UTFT 8ми битные байты (H+L) в 32х разрядные для DUE , в файлике ...Arduino\libraries\UTFT\hardware\arm\HW_SAM3X8E.h
через установку побитно 0 и 1 в 32х разрядном байте DUE , для попадания на нужные пины по плате. Но эт для скорости вывода такая припарка из-за разбросанности пинов порта по плате. Для чтения ID скорость не важна.
Проще посылать в сериал монитор и смотреть там, зачем приляпывать экран для вывода ID , хотя и 4х строчный на ST7920 . Вторая читалка выдаёт очень много инфы , по многим часто встречающимся адресам, поэтому внешний дисплей не покажет это всё сразу. Первая читалка(с первого сообщения) только по нулевому адресу, поэтому там и внешний экран для вывода.
пока ваше подключение не проверял, но надо подключить как указано в UTFT_Requirements.pdf , на стр2 есть табличка , 6-е уточнение - для 8ми битного дисплея DB0-DB7 на земле, тогда подключать к пинам D22...D29 (начиная с младшего заканчивая старшим, в вашем случае соответственно дисплейные DB10...DB17 , т.е. D22 DUE подключаем к DB10 дисплейному и т.д.) . на RD подаем лог1 (+3,3в). Далее убеждаемся что в файле memorysaver.h все disable иницициализаций закоментированы. Далее в файле UTFT.cpp меняем bytedtm[] = {16, .... , SERIAL_5PIN}; на все "8" bytedtm[] = {8, .... , 8}; , т.е. перестраиваем все режимы на 8бит . ( worddsx[] = и worddsy[] пока необязательно, главно пока угадать инициализацию) Далее открываем пример, к примеру UTFT\examples\Arduino (ARM) + Teensy\UTFT_Demo_400x240 (можно под лупой разглядеть пиксели на экране на сантиметр и примерно прикинуть его разрешение) и перебираем UTFT myGLCD(ITDB32WD,38,39,40,41); 32 раза от UTFT myGLCD(0,38,39,40,41); до UTFT myGLCD(31,38,39,40,41); загружая в ардуино , и ожидая около 5 секунд на какой инициализации что появится на экране. Если экран хоть немного сменит яркость - эт тоже хорошо(дисплей проснулся, заработали преобразователи для питания ЖК матрицы), значит инициализация немного подходит к семейству его контроллера. Ну а в лучшем случае появится тест на экране.
И обязательно попробовать UTFT_v2.77b2_uno_ili9327_8bit_turbo либу из соседней ветки 3.5", на Уно подключается как адафруитский шилд (DB0-DB7 к D8,D9,D2-D7) , на меге к портуС (D37-D30) . Ибо с некоторыми контоллерами дисплеев в режиме 8бит надо немного по другому общаться. В этой либе по умолчанию настроен №31 инит - ili9327, но можно подменять закидывая в папку UTFT_\tft_drivers\ili9327_8 другие иниты и установки.
2.способ вероятность 99,9% , считать ID, и использовать его инициализацию в UTFT, если в ней не окажется , то запросто найти в инете и подменить схожую в UTFT.
либо а). переделать первую читалку согласно пинам DUE , и перебрать все самые распространённые регистры где может лежать ID .
либо б). лучше также переделать вторую читалку, + возможно её прийдётся переделать на 8 бит (добавляется ещё дерганье WR для пересылки второго 8бит для 16ти битной инфы , и дерганье RD для принятия второго 8битного 16ти битной инфы) , хотя вроде в дисплеях у которых адрес не лежит в 0x00 адресе, и так адрес(регистр) 8ми битный. Или мож там просто предусмотреть переключение PORTA и PORTC между собой, ибо при переключении разных контроллеров с 16 на 8 бит, у них эти 8бит оказываются у кого на PORTA, у кого на PORTC (речь о Меге).
посмотреть к примеру можно скачать даташит ili9488 стр.40-42 , на 40стр показано запись и чтение в 8ми битном режиме "DBI Type B 8-bit". на 41-42 графики записи чтения 16ти битного режима , надо только добавить дерганье соответственно WR и RD для отправки/получения второго и последующего 8ми битного байта. Что-то мне помниться оно немного иное чем для контроллеров у которых ID лежит по 0x00 адресу.
// 8битные дисплеи вторая читалка хорошо читает, если у них ID лежит в 0x00 адресе(регистре). Если в других регистрах, надо время тестить проверять/допиливать на 8бит на DUE(у меня её нет). Если будете переделывать первую читалку, то проверте в ней чтоб правильно устанавливались лог. уровни управляющих сигналов согласно графикам записи чтения , а то я сомневаюсь там в правильности. Вторую читалку переделывать/проверять на 8бит пока у меня нет ни надобности(все дисплеи что мне попадаются, имеют возможность 16ти битного режима) ни самого главного - времени.
//// 1. сделайте 1 способ. 2. когда будете добивать второй способ , то там для 8ми битов надо оставить только их ,
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
без того что должно падать во второй порт PORTA на другие пины, ибо если вторая читалка ничего не вычитала (лог сериал монитора надо было приложить, подключение D37пин меги/дуе младший бит к младшему биту вашего дисплея D10 и т.д.) , то скорее всего у вас контроллер у которого ID не по 0x00 адресу, пилите вторую читалку, выложите что она ответила в сериал монитор. т.е. выложите что отвечает в сериал монитор переделанная вторая читалка без убирания старшего байта, и с убиранием работы со старшим байтом (пины 29-22).
Спасибо за помощь! С программой сегодня уже не успею, скорее всего завтра- послезавтра. Надеюсь на следующей неделе выбраться в город и купить резисторы, что бы попробовать с Мегой (если не получится с ДУЕ).
Начал читать UTFT_Requirements.pdf, немного не понятно: написанно что для 8-ми битного режима пины DB0-DB7 (подключенные к D37-D30) нужно подключить к земле. Соответственно в 8-ми битном режиме используются только старшие пины DB8-DB15 (подключенные к D22-D29). Но на дисплее только младшие пины DB0-DB7. Получается их нужно поставить на место старших? Так? Что-то я сегодня устал и немного торможу...
forfrends, покажи пожалуйста подробную схему подключения... если можно все.. и весь код? у меня тоже несколько экранчиков есть но на них практически нет информации... есть информация более менее на экранчик от k750i... но вот с чего начать не знаю.... боюсь что спалить..
Точно, извиняюсь ,ошибся, (исправил по возможности), при дисплеях 8бит надо подключать к меге/дуе D22-D29 а не к D30-37. Т.е. у вас младшим битом DB8 к младшему D22 и т.д.
цветной мусор это очень хорошо. это значит дисплей работает, выводится на экран что в видеоОЗУ в контроллере при включении оказалось , значит либо неработает только очистка экрана, м.б. из-за большой скорости дуе, экран не успел отработать или попробуйте перевернуть подключение DB8..DB15 на DB15..DB8 (крайне редко встречал когда распиновка зеркальна была в отличии как на схеме распиновки), либо у UTFT не оказалось нужной инициализации, без чтения ID не обойтись.
// судя по фоткам дорожек в шлейфе и в какой очередности они заходят в стекло, можно попробовать перевернуть DB8..DB15 на зеркально DB15..DB8 и снова прогнать все иниты в UTFT
и попробуйте ещё с прямым и зеркальным подключением инит от ili9488, https://yadi.sk/d/eO7CXOMQkpdYV (файлы из папки UTFT\tft_drivers\ili9486 закиньте в свою UTFT\tft_drivers\ili9486 , вызов UTFT myGLCD(28,38,39,40,41); )
если не поможет, пробуйте вычитать ID, скиньте свою переделку под дуе на 8 бит, проверю на меге (отвечать изменять буду на старые свои сообщения уже заблокированные для изменения, чтоб у вас был доступ отредактировать свое последнее, чтоб не засирать ветку новыми сообщениями)
Lelick , перечитайте тему, ответ написан. Если очень коротко, то:
1) смотрите примерную распиновку дисплея (GND и питание подсветки легко найти, а после и + не сложно)
2) Считаете количество контактов и ищите в интернете все похожие распиновки.
3) Подключаете к Ардуине (лучше Меге, что бы не мучаться так как я) Примерную распиновку подключения смотрите в UTFT_Requirements.pdf на стр2 и перечитайте посты выше.
slider, пробовал переворачивать когда прогонял инициализации - дисплей не реагировал. Но я пробовал не на все, а только на те, на к оторые была реакция. Попробую все прогнать в зеркальном. Отпишусь о результатах.
Инит от ili9488 не подошел. Реакции от дисплея нет ни в прямом, ни в зеркльном подключении.
Пробую вариант 2. Пересмотрел код из первого поста, вроде все верно, но я могу и ошибаться.
// программа для определения ID контроллера дисплея, подключать все 16бит
// (эт чтоб найти старшие биты , ибо в большинстве случаев именно они используются для 8ми битного режима)
//
// в верхней строчке покажет 16 бит ответа с дисплея , начиная со старшего бита
// в нижней строчке в HEX коде старший и младший байты. (для ILI контроллеров это будет 9325, 9320, 9327,...)
// при угадывании правильного подключения шины данных дисплея должно получиться к примеру:
// 1я строчка: 1001 0011 0010 0101
// 2я строчка: 9 3 2 5 ,т.е. это контроллер ILI9325
// подсветку дисплея через ом~20-30 к +5v, питание дисплея от ардуиновских 3.3v (если надо то занизить стабилитроном
// или стабилизатором до 2.8v - т.к. иногда инициализации дисплеев приводятся для 2.8v - там константы напряжений
// для правильной работы ЖК матрицы)
//
// выводы дисплея желательно подключать через резист. делители к примеру 10к+22к , на крайняк тупо через 10к,
// но тогда на питание диспл. посадить стабилитрон 3,0-3,1v и запитывать через резист. ом~20-30 от +3,3v,
// иначе дисплей запитается через выводы и ~4-5v пересилят ардуиновские +3,3v
//
// выводы подключать стандартно UTFT на arduino mega RS(CD),WR, CS, RST
// Standard Arduino Mega/Due shield : <display model>,38, 39, 40, 41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,38, 39, 40, 41
//
//выводы ардуино меги 22-29 к предполагаемым выводам дисплея DB8-DB15
//выводы ардуино меги 30-37 к предполагаемым выводам дисплея DB8-DB0
// и дополнительно, для получения ответа от дисплея, необходимо
// к выв. ардуино меги 42 подключить вывод RD дисплея. (по умолчанию на шилдах он кинут на +3.3v)
// Дисплей 1602, выводы VSS, VDD, RS, E, D4, D5, D6, D7
// к выводам ардуино меги GND, +5v, 13, 12, 11, 10, 9, 8
// помним на дисплее поставить резистор 3,3к между VO и VSS(+) , RW замкнуть на VSS(+), подключить A и K к VSS(+) и VDD
#include "U8glib.h"
//#include <LiquidCrystal.h>
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17
//LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int i;
byte byteH;
byte byteL;
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//lcd.begin(16, 2);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=37;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
u8g.setPrintPos(0, 10);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0);
byteL=0;
if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0);
u8g.setPrintPos(0, 30);
u8g.print("ID display: ");
u8g.print(byteH, HEX);
u8g.setPrintPos(0, 50);
u8g.print(byteL, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void setup(void) {
// flip screen, if required
// u8g.setRot180();
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
void loop() {
// put your main code here, to run repeatedly:
}
Единственное что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
А вот вариант Б с переделкой 2-й читалки под 8 бит - для меня это пока что высшая математика. Вроде все просто объяснено, но я сам это не смогу сделать - не хватает знаний.
Кстати, меня терзают сомнения по поводу правильности моего перевода 2-й читалки. Особенно перевода 0x00, 0xEF и др... Мне кажется я мог биты в обратном порядке написать, но как проверить - не знаю.
// читалка ID дисплеев v2.0 Slider , вопросы и предложения можно на segun@yandex.ru
// "спасибо" поблагодарить за проделанную работу можно на карту Сбербанка 4276 4500 1754 7783 или скинуть на тлф. 8-951-404-7109
// моя ветка http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-...
// подключить дисплей к Arduino Mega:
// старший DB15-8 , пины 29-22 PORTA к примеру считать с 00D3 =>0x00 старший
// младший DB7-0 , пины 37-30 PORTC к примеру считать с 00D3 =>0xD3 младший
// при использовании 8битных дисплеев, подключать к младшему, DB7-0 , пины 37-30 PORTC
// Это соответственно UTFT распиновке.
// Для некоторых дисплеев при их включении на 8 бит, шина переносится в старший байт, а для некоторых , разбрасывается по битам DB0-DB18
// поэтому дабы не утраивать вывод инфы в сериал монитор для всех случаев, здесь только для UTFT случая.
// Кому надо, можно поменять везде местами PORTA PORTC , на случай подключения 16битного дисплея и активированного на 8бит,
// шина данных которого смещается на старший байт. Ну или если попадётся такой шилд, то сделаю это в этом скетче.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteH=0x00 ; byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteH=0x00 ; byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteH=0x00 ; byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteH=0x00 ; byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteH=0x00 ; byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(RSTX, 0); delay(15);
digitalWrite(RSTX, 1); delay(250);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вверх и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
//byteH=0; byteL=0;
//byteH=PINA; // считываем с выводов PORTA
//byteL=PINC; // считываем с выводов PORTC
byteH=0; // PORTA считаем
if ( digitalRead(29) ) byteH=byteH+128;
if ( digitalRead(28) ) byteH=byteH+64;
if ( digitalRead(27) ) byteH=byteH+32;
if ( digitalRead(26) ) byteH=byteH+16;
if ( digitalRead(25) ) byteH=byteH+8;
if ( digitalRead(24) ) byteH=byteH+4;
if ( digitalRead(23) ) byteH=byteH+2;
if ( digitalRead(22) ) byteH=byteH+1;
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
//PORTA=byteH ;
//PORTC=byteL ;
if (byteL == 0x00){
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
Serial.print("register " );
Serial.print(byteH, HEX );Serial.print(" ");Serial.println(byteL, HEX );
// 1-будем передавать команду
//digitalWrite(RDX, 1); // порт дисплея в режим приема ***************
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
wrx_u(); // дергаем WRITE вверх
// 2-будем принимать данные
port_in(); // порт ардуины на вход
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
digitalWrite(WRX, 1);
rdx_u(); // дергаем RD и получаем данные
Serial.print("1 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
Serial.println("");
}
..... что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
.....
млин, как могла опечатка затесаться, непонятно, бывает видимо, имелось ввиду VSS(-, GND) , речь шла о подключении 1602, чтоб выводить инфу что по 0му адресу у изучаемого дисплея.
хорошо. проверю скетч на разных дисплеях, черкну. ,// в скетче не должно быть использование
digitalRead(30) )
....
digitalRead(37)
дисплей же 8ми битный ))) . сейчас, погодь, посмотрю... чтобы получать второй байт нужно дергнуть RD , чтобы отправить второй байт, нужно дернуть WR ....
для одних дисплеев надо так
вот , пробуйте (протестировал на ili9325)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку ////////////////////////////////////////////////////////////////
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
//Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(100);
digitalWrite(RSTX, 1); delay(100);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(10);
//byteL=PINA; // считываем с выводов PORTA
byteL=0; // PORTA считаем
if ( digitalRead(29) ) byteL=byteL+128;
if ( digitalRead(28) ) byteL=byteL+64;
if ( digitalRead(27) ) byteL=byteL+32;
if ( digitalRead(26) ) byteL=byteL+16;
if ( digitalRead(25) ) byteL=byteL+8;
if ( digitalRead(24) ) byteL=byteL+4;
if ( digitalRead(23) ) byteL=byteL+2;
if ( digitalRead(22) ) byteL=byteL+1;
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
delay(10);
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
//for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
wrx_u(); ///////////////////////////////////////////////////////////////////////////////////////////////
// теперь передадим младший байт
// if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } }
if (byteL == 0x00){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
Serial.print("register " );
Serial.println(byteL, HEX );
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(10);
wrx_u(); // дергаем WRITE вверх
delay(10);
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(10);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(10);
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print("1 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.println(byteL, HEX);
Serial.println("");
}
////11.02.2016
Если ответы будут 00 EF BF D3 04 , то скорее всего забыли после использования UTFT переключить RD дисплея обратно c "+" на 42пин . И проверьте всёже на Меге. у меня с десяток разных дисплеев у которых ID по 00 адресу, эта читалка превосходно их читает. других дисплеев пока нет.
Мне кажется это ни на что не влияет, так это всего лишь чтение с дисплея. Просто в итоге результат пишет чуть больше чем надо (так мне кажется). Только что попробовал: убрал из программы всякое использование 30-37. Результат тот же:
00000000
ID display: 00
На всякий случай, код программы Переделал под вывод в сериал:
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
int i;
byte byteH;
byte byteL;
void setup(void) {
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=22;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=22;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
for (i=22; i<=22;i++) { digitalWrite(i, LOW); }
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; Serial.print(1); } else Serial.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; Serial.print(1); } else Serial.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; Serial.print(1); } else Serial.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; Serial.print(1); } else Serial.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; Serial.print(1); } else Serial.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; Serial.print(1); } else Serial.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; Serial.print(1); } else Serial.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; Serial.print(1); } else Serial.print(0);
Serial.println("");
Serial.print("ID display: ");
Serial.print(byteH, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=22;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void loop() {
// put your main code here, to run repeatedly:
}
Здраствуйте. Попался мне дисплей "CDT 128 96-002V2", дисплей от сотика, не могу найти на него нормальной информации, вроде - бы на контроллере ST7571, даташит на ST7571 нашёл но толку мало. Может кто использовал такай дисплей, подскажите.
ладно, буду писать следующие сообщения(по возможности сохраняя старые), чтоб прослеживалась последовательноость в диалоге, не в угоду конечно малостраничности темы (((
для одних дисплеев надо так: 16бит разбивается на 2 последовательных по8
на примере ili9325, для передачи адреса регистра сначала выводим старший байт ( 00 ), дергаем WR чтоб дисплей принял , потом выводим младший байт (00, или какой нужно) дергаем WR чтоб дисплей принял . Чтение тож в 2 последовательных байта (видимо м.б. и больше)
для других дисплеев на примере ili9488, регистры 8ми битные, поэтому нужен один такт WR для передачи адреса регистра, но несколько тактов, если будем записывать "параметры"(а они очень иногда глубокие, своего рода стек), и несколько тактов RD чтобы из регистра вынимать много "параметров"( последовательных байтов стека). Таким образом дстигается некоторое ускорение при записи/вычитывании байтов (не нужно передавать адрес следующего реристра, а контроллер сам инкрементирует его в пределах главного) , и уже эти "параметры" могут иметь 8/16/18 битное слово.
вот , пробуйте, накидал скетч читалка ID дисплеев V3.0beta Mega/Due (протестировал на Mega+8bit ili9325, делал не полное кажись соответствие диаграмме , но работает)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку ////////////////////////////////////////////////////////////////
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
//Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(100);
digitalWrite(RSTX, 1); delay(100);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(10);
//byteL=PINA; // считываем с выводов PORTA
byteL=0; // PORTA считаем
if ( digitalRead(29) ) byteL=byteL+128;
if ( digitalRead(28) ) byteL=byteL+64;
if ( digitalRead(27) ) byteL=byteL+32;
if ( digitalRead(26) ) byteL=byteL+16;
if ( digitalRead(25) ) byteL=byteL+8;
if ( digitalRead(24) ) byteL=byteL+4;
if ( digitalRead(23) ) byteL=byteL+2;
if ( digitalRead(22) ) byteL=byteL+1;
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
delay(10);
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
//for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
wrx_u(); ///////////////////////////////////////////////////////////////////////////////////////////////
// теперь передадим младший байт
// if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } }
if (byteL == 0x00){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
Serial.print("register " );
Serial.println(byteL, HEX );
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(10);
wrx_u(); // дергаем WRITE вверх
delay(10);
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(10);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(10);
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print("1 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.println(byteL, HEX);
Serial.println("");
}
потом закоментить 158 строчку wrx_u(); ///// и посмотреть снова что выдаст монитор порта
Спасибо за пример! Правда мне све это еще сложно понять, точнее сложно понять согласование таймингов. Это так, к слову.
Попробовал ваш код, оба раза ответа не было. Потом появилась мысль немного увеличить задержки. Поменял delay(10) на delay(50). В результате в регистре "0" появилось "10". wrx_u(); - закоментированна.
Не пробавали написать код не в IDE arduino, а в Keil. По началу трудновато конечно, а потом как по маслу. Пройдены варианты и по SPI и с 8 и 16 бит шинами. И вот еще вопрос, как вы при инициализации управляете RESET-ом? Можно просто подключить к цепи сброса процессора, у меня так работает, экономит целый пин I/O.
diger67, Вариант, как по мне хороший, но подходит только для уже готового подключения и опознанного контроллера. Если же дисплей не опознан и нужно прочитать его ИД, то такой вариант не подходит, так как Ресет используется в процессе.
slider, наконец-то купил резисторы! Тодключил к Меге. Протестировал. Читалка из первого поста выдает одни нули. Читалки №2 и №3 вернули один и тот же ответ:
о, эт хорошо, что к меге, через резисторы, и ответ нормальный виден, и видно что не по 0му адресу у него ID. Из широкораспространеных адресов пока не понятно. Недавно диспл. от sony ericsson копал, так там вообще распиновка на 1бит оказалось сдвинута, не как по схеме. Еле запустил, пока не проверил что неспользованный пин лог.1/0 выдавал, он оказался вхож в нужные 8бит/пин. Эт я к тому что можно попробовать прикинуть какой ответ бы был, если зеркально перевернуть биты, или мож проще физически перевернуть и глянуть что выдаст. Вечерком с ноута скину читалку, сделал чтение всех подряд регистров с 0 по 255 (00 - FF ) // эт проще в меге счетчик for и кидаем это наращивание в порт PORTA, для дуе вообще мутно побитно получилось бы.
Так с некоторых дисплеев видно было, в регистрах попадалось разрешение контроллера (дисплея) 00EF 01AF 013F (240x432 x320) , ну и ID тож.
Проконтролируйте ещё напр. 3,3в , оно не должно быть выше, особенно когда запускались схожие иниты UTFT, когда был виден цветной мусор. Если есть время, можете прогнать теперь уже на меге иниты UTFT.
Для питания дисплея пока остановился на резисторе 100-150 Ом от 5в и стабилитроне 3.0 в с параллельно smd кондером 4-10мкф. (ибо если делать 300 Ом то при запуске инита, питание может просесть ниже 2,8в . И если ставить стабилитрон 3,3в, то без инита напряжение может подняться аж до 3,6в , а для контроллеров это уже критично) . Если ещё параллельно стабилитрону подключить, для опыта, белый светодиод , то по маленькому снижению его яркости можно судить о возможной подходящего инита(инициализации), что заработали внутренние преобразователи для питания ЖК матрицы. Если хорошо притухнет, эт плохо, значит было перенапряжение на дисплее и преобразователи скончались. хотя ID, перед запуском инита вычитывается правильно, типа как контроллер рабочий. Но в ваше случае всё живое 99,9% , ведь виден цветной мусор на некоторых инитах.
В вашем случае на меге можно запитать от меговских 3,3в и параллельно какую нить нагрузку кинуть, типа стабилитрона 3,3в.
И прикиньте примерно сколько у него разрешение, как, писал выше, раз такая байда затяжная получилась. Эт чтобы отсеять малые контроллеры.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
читалка 3.1 PORTA, проверена на дисплеях с ID в 00h , и на других (ili9327 8bit , R61523 16bit) - отлично читает всю память, соответственно и ID в ней. (да, иногда некоторые регистры имеют глубину 10 , но ID так глубоко не запихивают, хватает в читалке и глубины =8) .
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке,
// только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором
// digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTA=0x00;
byteL=0; // PORTA считаем
byteL=PINA; // считываем с выводов PORTA
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRA=0x00; // конфиг всех пинов на вход
PORTA=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRA=0xFF;// конфиг всех пинов на выход
PORTA=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTA=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTA=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
~522*290 не встречал похожего разрешения, ближние разрешения 480x320 (ili9486,ili9488,ili9481,HX8357,HX8347,RM68040,R61581,...) и 640x360 (R61523,...)
судя по логу, это подделка (аналог) известного контроллера . не все ID знаю, но здесь подозрительно он слишком короткий (здесь м.б. данные с регистов 04 BF , DA DB DC, 2A 2B-размер), похоже на подделку . Но это не мешает работать этим дисплеям с ардуинкой. инит должен подойти от широкораспространённого. Есть ещё вариант поискать прошивку на этот тлф. по его названию , в прошивке глянуть какой драйвер дисплея используется. Еслиб тлф. был живой, то ещё вариант можно было включить анализатор при его включении, и снять короткий лог инита и вывода графики.
Ещё вариант, простой для вас, переберите иниты распространенных 480x320 дисплеев, которых нет в UTFT ( memorysaver.h ). какие можно поиском по aliexpress, инету, вайенжиниринг.ком найти, 480x320 , 320x480 , 480 x 320 LCD screen - будут много разных вариантов, смотрите описание , зачастую приводят тип контроллера, далее находите инит , подтыкаете в UTFT , заводите, радуетесь победе, и стряпаете на нём чтонибудь полезное.
// позже, если время будет, мож через недельку выложу ещё несколько изученных контроллеров/дисплеев вместе с логами читалки для сравнения , как оформлю. вот на днях попался 640x360 R61523 , подделка (ID почти пустое, как у вас, и не такое как в PDF) , но инит подошёл, UTFT тест кажет (подменил значения и переназвал функции в ините r61581, от найденного инита от STM в инете) , . как куплю оригинал, исследую , выложу инфу о разнице по чтению оригинала и аналога(подделки).
Вот по некоторым контроллерам есть ещё старенькая табличка LCD_Table.xls контроллеров, дисплеев, тлф найденная на просторах инета https://yadi.sk/i/Z_0aZQkAoyDGo . (мож существует и дополнение благодаря тому кто её составляет) . Когда ищите в ней, не забывайте , избегать выделенных фрагментов и ставить галку искать по всей книге, а не листу.
////Чтоб ветку не засорять, можете на емайл писать sеgun coб. яндekс ру (переписать все буквы латиницей)
Проблема в таче- он работает только с одной стороны экрана . Добавил #define TOUCH_ORIENTATION PORTRAIT , все равно точно не попадает куда нажимаешь. Я где то давно видел в библиотеку добавляется , что то типа x=480 y=240 и тогда точно работает . Сам искал - ненашел .
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Я по той ссылке что выше прочитал всего одно сообщение... И то там увидел что возможно у кого то перепутаны были пины... X и Y или что то в этом роде... Проверте у себя...
Про перепутанные пины это верно, есть у меня tft на ili9327. Подключение 8бит UNO. Работать нормально не хотел, пока в программе не подкорректировал подкючение выводов тача. Они там напрямую к ардуино подключены.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
Раз его нет на руках, к чему тогда вопрос?! На сейчас он уже превосходно гуглиться, поиск и аналоги выдает. В соседней ветке вам отвечали по нему. Неохота снова искать? И еслли раз никто не потратил на него драгоценного времени, не выложил в инет, (раз был вопрос, значит рассчитывали на ответ) - предлагаю тогда самим потратить пару дней. разобраться безвозмездно и сделать добро, выложить инфу по нему. мож кому пригодиться. или мож скажут хотя бы спасибо. Находя себе тоже нужную инфу в инете, задумывались, кто то ж добрый потрудился, её выложил.
forfrends пишет:
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
...
register 04 54 66 00 00 00 00 00 00 *
..
register 2A 00 00 00 01 00 00 00 00
register 2B 00 00 00 01 00 00 00 00
...
register DA 54 54 54 54 54 54 54 54
register DB 80 80 80 80 80 80 80 80
register DC 66 66 66 66 66 66 66 66
...
глянул ещё парочку даташитов больших дисплейчиков , замечу, что ID иногда не только ложат в 04h (или вообще пустой оставят). но и дублируют ID1 ID2 ID3 в DAh DBh DCh . ( DAh - manufacture фабрика (не стоит обращать внимание)DBh DCh - module / driver драйвер ).
Из 800x480 864x480 попались такие замечательные даташиты
ILI9486 ILI9486L : 04h 1параметр не определен, 2й-фабрика. 3,4й-драйвер , DAh - xx , DBh от 80 до FF , DCh 00h (тоже немного подходит под то что выдала читалка)
кстати эти регистры м.б. перепрограммированы в OTP режиме.
Специально проводить экспиримент я и не просил. Знаю по себе как заниматься инженирингом. Покупать кота в мешке тоже не айс. Хватает вопросов и по работе с контроллерами и с их перефирией.
Да. спасибо. про vivaz знал, хорошая статейка. Ранее запускал уже дисплеи от SonyEricsson U5 и U8i на ардуино мега . шаманил UTFT под него.
Разрешение превосходное. Диагональ бы поболе. Повышайку для подсветки поставил готовый модуль MT3608, 19вольт через гасящий резистор. Подпаивал дисплей проводками, ибо разъем ( шаг 0.2мм против обычных 0.3мм ) стоит дороже дисплея в 4ре раза! . Ищу пока оригинал дисплея чтоб сравнить с неоригиналом. В плане потом черкнуть по ним. Да и флаи надо добить. U5 U8i перевести на 8 бит для мини, чтоб было много свободных пинов, весьма трудно , смотрел , очень тонкие дорожки от im0-2 со стекла в шлейф и там сразу на + и - . Если делать как есть 16бит , на мини остануться 4ре свободных пина, хотя для некоторых проектов хватит. И если сравнивать 8 бит и 16 бит на ардуино уно/мини/нано , то 8бит будет гораздо шустрее работать, чем 16 бит. (из-за раскидывании по многим разным портам при 16бит) . На меге да, 16 побыстрей будет чем 8 . К примеру тест UTFT на меге на ili9325 320x240 8бит-за 45сек, а в режиме 16бит - 41сек.
//////////////////// по R61523 Vivaz Arduino UTFT в следующих постах на 6й странице
Имхо LCD с разрешением более 320х240 подключать к 8-ми разрядным процам да еще по 8 разрядной шине считаю кащумством. Тогда уж лучше miniSTM на 103c8t, да на 16 полноценных битах. остается порядка 20 свободных пинов, есть адаптация под IDE arduino. http://www.stm32duino.com/viewforum.php?f=1&sid=776b93cae447043c5a6340572d148fe3
register EFh for ILI9327(0 02 04 93 27 FF),
register 0 EF
1 Parameter 0 EF
2 Parameter 0 EF
3 Parameter 0 EF
4 Parameter 0 EF
5 Parameter 0 EF
6 Parameter 0 EF
судя по логу (считывается тоже, что и посылается), у вас неподключен RD дисплея на 42й пин меги.
Для вставки кода , при написании сообщения, надо пользоваться значком {....} code , в окошко скопировать выданный код из монитор порта. В окошке, еще есть вкладка дополнительно , поставить галочку на Сворачитьвать код по умолчанию...
Примените читалку для 8ми бит. версию 3.1 она считывает все регистры. Управляющие пины подключать как написано в скетче читалки. шину данных два варианта:
читалка v3.1 для PORTC , если дисплей вы подключили на PORTC (пины ардуино 30-37 соответственно подключили к дисплейным DB7-DB0), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTC.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// дисплейные DB0-7 (и могут быть физические DB8-DB15 , DB10-DB17) , соответственно на arduino пины 37-30 ( микроконтроллера PORTC PC0-PC7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение не соответствует UTFT распиновке, для 8ми бит она ориентирована на PORTA
// разве что для ili9327 в UTFT_v2.77b2_uno_ili9327_8bit_turbo, там используется PORTC
// тогда не забыть на 42 пин подать лог.1 хотя бы внутренним резистором digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTC=0x00;
byteL=0; // PORTC считаем
byteL=PINC; // считываем с выводов PORTC
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRC=0x00; // конфиг всех пинов на вход
PORTC=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRC=0xFF;// конфиг всех пинов на выход
PORTC=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTC=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTC=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
читалка v3.1 для PORTA , если дисплей вы подключили на PORTA (пин 22-29 ардуино меги соответственно подключать к дисплейным DB0-DB7), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке,
// только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором
// digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTA=0x00;
byteL=0; // PORTA считаем
byteL=PINA; // считываем с выводов PORTA
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRA=0x00; // конфиг всех пинов на вход
PORTA=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRA=0xFF;// конфиг всех пинов на выход
PORTA=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTA=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTA=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
Вот к примеру что она выдала для неизвестного 2.4" tft lcd shield arduino uno
, который тоже запустился на адафруитской переделке от SPFD5408 (для запуска на UTFT, никто видимо не хочет попыхтеть для него, можно было сделать на базе UTFT_v2.77b2_uno_ili9327_8bit_turbo).
Как видно из лога, это вообще непонятный левый аналог. Согласно даташиту http://www.micro4you.com/files/lcd/SPFD5408A.pdf , для SPFD5408, ID должен лежать в 00h , и должно было считаться 54 08 .
По факту в дисплее стоит контроллер - аналог . Поэтому и применяют переделки, в частности от adafruita ,они не вычитывают какой id контроллера, чтобы скормить ему подходящий инит , а тупо дают ему определенный инит. Собственно как и делает UTFT, для неизвестных дисплеев в нем может не оказаться подходящего инита, да и подходящую битность там надо установить. К тому же в UTFT ,если дисплей переведен с 16ти на 8 бит, иногда приходиться немного попыхтеть. К примеру выставить все 16ть бит bytedtm[] = {16, 16 ... 16}, но физически использоватьмладшие 8мь бит, т.е. PORTC ( пин 30-37 соответственно подключать к дисплейным DB7-DB0 ) , так хоть можно увидеть какие нибудь корявые картинки теста. Т.о. перебирая иниты можно убедиться что дисплей жив и может что-то рисовать.
как конечное решение можно , подсмотреть на переделке UTFT UTFT_v2.77b2_uno_ili9327_8bit_turbo , на форуме она есть . Для меги, уновский шилд по умолчанию подключать проводочками на PORTC . Можно и напрямую , в соседней ветке про 3.5", выкладывал переделку на базе её, чтоб уновский адафруитский дисплей воткнутый в мегу работал.
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
у меня дсиплей с вот такими пинами LCD_CS A3 LCD_CD A2 LCD_WR A1 LCD_RD A0. это фактическое подключение в соответствии с надписями на дисплее. переделка так работает
я пробовал для UTFT делать инит в соответствии с рабочей AdafruiSPFD5408, вроде всё верно, но всё равно белый экран
а почему именно белый экран горит? что это значит? почему не абракадабру выводит?
самое интересное что я пробовал в соответствии с инструкцией рабочей переделки исправить оргинал Adafrui, но всё равно белый экран, вот это и странно
а есть ли какаято статья обучающая про это всё про битность способы передачи регистры и тп, именно при работе с дисплеями такими а то ничего почти не понятно? вот этим было бы интерсно заняться, там бы исам разобрался
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
так уновские дисплеи на проводках никто и не собирается использовать, невнимательно читали. Это подключение только для удобного считывания ID программе. и если что удобного и понятного управления. И как стандартное подключение меговских шилдов. Читалку специально для уновского дисплея напрямую воткнутого в мегу , нету надобности делать , ибо не всегда у них реально выведен RD, да и по некоторым адресам сама адафруитская либа умеет считывать и выводит в монитор порта.
Для использования же Уновских Адафруитских шилдов на меге и уно, подходят либы и адафруит и UTFT-подшаманенная. В теме про 3.5" явный пример использования UTFT для связки Уно+адафруитский уновский шилд к примеру на базе ili9327 - решение UTFT_v2.77b2_uno_ili9327_8bit_turbo. Для связки Мега+адафруитский уновский шилд -http://arduino.ru/forum/apparatnye-voprosy/tft-35-i-arduino?page=6#comment-90708 разбирался сам в работе библиотеки , и на форуме обсуждалось что и как, изучите внимательней. там же народ нашёл методы ещё ускорения работы UTFT.
// на адафруитском уновском шилде DB0 DB1 заведены на пины ардуиновские D8 D9 . Для UTFT в уновском шилде по умолчанию они должны быть физически на пинах D0 D1 (на которых находится сериал порт, адафруит их высвобождает) .
по R00h вычитывается ID 0x52 что соответствует HX8352A . В UTFT он есть . вызов UTFT myGLCD(HX8352A,38,39,40,41); . Дисплейчик 16бит. Перевод в 8бит на шлейфе не предусмотрен (разве что чем нибудь острым перекоммутировать дорожки со стекла в шлейф).
пришли стабилизаторы 3,3в 0.25-0.5A XC6206P332MR , маркировка 662K , теперь по питанию лучше их ставить .
Вот такой вот шилд получился. Габариты дисплея не загораживают верхний и нижний ряд выводов ардуино.
углы обзора вверх вниз вправо хорошие , влево не очень . Попробовал пины длинные long , поэтому можно под шилдом разместить обычную плату или шилд.
по R00h вычитолась ID 6809h , изучение даташитов дало что это контроллер RM68090 , причём в старой версии rev01 этот контроллер имеет ID 6807h , в новой версии rev04 - ID 6809h .
На шлейфе есть даже подписанная перемычка R1-16bit R2-8bit (используютсяDB0-DB7) .
Методом подбора подошли инициализации UTFT для 16бит: ILI9325D_16 , ILI9325D_16ALT . для 8 бит: ILI9325D_8 ILI9325C . Время теста UTFT на 16бит = 41сек. , на 8бит = 45сек.. Углы обзора хорошие .
дисплей пока некуда приспособить, изучал на одной из макеток (резисторы 10ком), по питанию такая вот такое исследование получилось: при стабилитроне 3,3в и резисторе
- 300ом , при запуске инита напряжение с 3,3в падает до 2,5в(эт уже мало) ,
- 200ом , с 3,5в до 2,9в
- 150 ом , с 3,6в(эт уже много) до 3,1в
так что вывод , лучше либо ставить стабилитрон 3,0в и резистор 100-150ом , либо ставить микросхему стабилизатор 3,3в .
инет находит еще соответствия OT-906 A906 A919 8K4669 FPC706-10 W939 , но подобных распиновок не было найдено.
картинки кликабельны:
собрал макетку для исследования дисплеев с плоским разъемом , с шагом пинов 0.3мм
исследование дорожек в шлейфе и вход и в кристалл выявило ШинуДанных 18бит .и непонятные управляющие вывода ШиныУправления. Толстые дорожки - это VCC .
Методика дальше такова : устанавливаем на упр. вывода (через резисторы 10к) лог.0 , и по одному выводу, потом по 2 выводу подавать лог1. . Смотреть на несколько подключенных на ШД белых светодиодов, через 10к на +3,3в . Т.о. если свечение тускло - это Zсост , если ярко - это лог.1 , если тухнет - лог.0 .
Это выявило
- DC (RS) - лог 1 вызывает смену ШД с Z-сост в лог0
- CS и RD - лог.1 на них переводят оюратно шину данных с лог.0 на Z-состояние.
- при подаче разных лог. уровней на 39 38 вывод , на ШД появляются лог. на разных пинах , а именно 00 - 16бит 10 - 8бит 10 - 18бит 11 - 9бит . И теперь понятна очередность бит с пин11по пин28 соостветствие c DB0 по DB17 .
методом подбора ШУ вычиталось с r00h ID 0x47 . Путем пересмотра PDF нашелся такой ID в HX8347D
и это можно было предположить и по редко встечающемуся распределению ШД , а именно вывода очередности DB0-DB17 не друг за дружкой, а по паре ,
пересматривая PDF наткнуться на HX8347D
и уже по дорожкам в шлейфе прослеживаем более точное распределение im0-3 ШД ШУ на разъеме.
установка UTFT всё на 16бит и перебор всех инитов не завёл дисплей. Значит в поиск по инету родной init code HX8347D . пришлось зарегаться на китайском хранилище и от туда его взять . ( есть ещё какое-то еще иностранное, так там вообще попандос, платить деньги)
найденный расчитанный для напряжения питания 2,8в (как показала практика и на 3,1в тож хорошо кажет) :
вызов UTFT myGLCD(0,38,39,40,41); либо UTFT myGLCD(HX8347A,38,39,40,41);
для справки замечу из PDF серии HX8347x соответствие контроллеров -
регистр - ID
HX8347A r67h ID 0x47
HX8347B r00h ID 0x9325 (ID1 ID2 ID3 м.б. в rDAh rDBh rDCh - программируется в OTP режиме)
HX8347D r00h ID 0x47
HX8347G r00h ID 0x75
HX8347I pdf бесплатный не найден . возможно ID 0x9595
дисплей разгадан и запущен:
Время теста UTFT в режимах 8бит - 45сек и 16бит - 40 сек. (при закомменте в setxy.h // LCD_Write_COM_DATA(0x04,x2>>8); ещё немного быстрее, т.к. разрешение экрана не большое)
На этот дисплейчик больше всего дней ушло. распиновка кристалла таже (шина данных выводится попарно в шлейф) , но инит от hx8347d не хотел подходить. оказался ili9338 . На 16бит запустился , на 8 нивкакую. Читалкой(без сбросов аппаратных и командных) потом смотрю после инита UTFT - параметры записывались с чередованием 0x00 . Помогла только UTFT_v2.77b2_uno_ili9327_8bit_turbo . Да и редкий контроллер оказался ili9338 ( ili9338b ) . его ID в регистре D3h xx 00 xx 38 ( читалка выдает register D3 00 00 93 38 38 38 38 38 * )
LCD_Write_COM(0x11);// обязательно
delay(100);
//LCD_Write_COM(0x13);
LCD_Write_COM(0x3A); // Pixel Format Set
LCD_Write_DATA(0x05); //0x05-65k color565
LCD_Write_COM(0x36); // Memory Acces Control
LCD_Write_DATA(0x48); //e8-orig , 48-ili9327 16bit! ,
LCD_Write_COM(0x29); // обязательно
LCD_Write_COM(0x2C); // обязательно
Вот архив , где собрал datasheet ili9338 ( ili9338b ) , hx8347d , hx8347a hx8347b hx8347g ili9335 ili9340 ili9342 , подготовленные UTFT для 16 и 8 битного режимов.
forfrends, перевод на ДУЕ неудобен, там с портами набезобразили, раскидали кусками по всей плате и обозначаются иначе.
неужели у друзей или знакомых нет какойнибудь электроники? этих резисторов валом везде, особенно в старых материнках, cd-rom, hdd , платах принтеров, телевизоров, ... . пойдут от 10ком-20ком (мож и поменьше номиналы, непроверял) . вместо стабилитрона 3,0-3,3в белый светодиод, или 2 старых красных последовательно.
Lelick, как подключить смотрите внимательно подобные примеры выше, можете в инете найти схему на тлф и глянуть, на других форумах от сониэриков подключали, ссылка подобного давал в предыдущем посте.
вызов библиотеки UTFT myGLCD(ILI9325D_16ALT,38,39,40,41);
всё таки для надёжности лучше не использовать подсветку дисплея в качестве стабилизатора , желательно стабилитроном 3,0-3,3в . Разноцветные эмальрованные провода с моторчиков cd-rom, старых кассетных магнитофонов,....
Slider, можете помочь? Пытаюсь подогнать программу из первого поста к Дуе... Сразу возникло несколько вопросов:
В коде используется пин #define CD_Pin 38 // (RS), Но у меня в распиновке нет ни CD ни RS, это случайно не DC? Также вопрос: в коде есть RST_Pin 41 это подключение пина RESET дисплея?
И еще : PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
Как именно происходит считывание ИД дисплея? Если не ошибаюсь - это команды настройки портов А и С на вход? Можно ли просто заменить на код for (i=22; i<=37;i++) { pinMode(i, INPUT); }
Проверьте правильность подключения дисплея:
Попробовал переделать код под Arduino DUE и дисплей 128*64 на контроллере ST7920. Вот что получилось:
В результате в верхней строке только нули и ИД контроллера - тоже нули. Есть большое побозрение на неправильное подключение дисплея (писал в предыдущем посте). Можете с этим помочь?
Перелапатил кучу сайтов... Не нашел никакой другой распиновки кроме той что уже имеется. НО! Везде распиновка была на дисплеи 1.5-2.5 дюймов, а здесь все 4". Настораживает это.
Попробовал переделать программу читалка ID дисплеев v2.0 под ДУЕ. Собственно, вот что получилось:
Из дисплея ничего не читает. Пины DB7-0 подключал к пинам 37-30 ардуины.
так то правильно перевод байтов на пины и обратно, молодец,(точность не проверял, но принцип вы точно уловили) так мне кажется проще для DUE (можно и ещё упростить чтение с пинов используя операции сдвига в байте - эт для заядлых разбирающихся в С++, я начинал с программирования на ассемблере, С++ для меня тяжко, надо постоянно в нём быть, чтоб помнить что к чему).
Как вариант , можно ещё глянуть как пересылает UTFT 8ми битные байты (H+L) в 32х разрядные для DUE , в файлике ...Arduino\libraries\UTFT\hardware\arm\HW_SAM3X8E.h
через установку побитно 0 и 1 в 32х разрядном байте DUE , для попадания на нужные пины по плате. Но эт для скорости вывода такая припарка из-за разбросанности пинов порта по плате. Для чтения ID скорость не важна.
Проще посылать в сериал монитор и смотреть там, зачем приляпывать экран для вывода ID , хотя и 4х строчный на ST7920 . Вторая читалка выдаёт очень много инфы , по многим часто встречающимся адресам, поэтому внешний дисплей не покажет это всё сразу. Первая читалка(с первого сообщения) только по нулевому адресу, поэтому там и внешний экран для вывода.
И так, у вас дисплей только с 8ми битной шиной http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-162948 , распиновка 99% известна (если есть ещё возможность, то скиньте качественные фото шлейфа с 2х сторон и платы где он стоял, на какойнибудь бесплатный без регистрации фотохостинкг типа ipicture.ru http://fastpic.ru/ http://radikal.ru/ ) . Есть Мега (но нужны резисторы и стабилитрон, чтобы уровни через резисторы не пересиливали питание) , и DUE (не нужно согласование),
Вижу 2 варианта запустить ваш неизвестный дисплей на DUE.
1.способ вероятность 70% , перебиранием инициализаций UTFT
пока ваше подключение не проверял, но надо подключить как указано в UTFT_Requirements.pdf , на стр2 есть табличка , 6-е уточнение - для 8ми битного дисплея DB0-DB7 на земле, тогда подключать к пинам D22...D29 (начиная с младшего заканчивая старшим, в вашем случае соответственно дисплейные DB10...DB17 , т.е. D22 DUE подключаем к DB10 дисплейному и т.д.) . на RD подаем лог1 (+3,3в). Далее убеждаемся что в файле memorysaver.h все disable иницициализаций закоментированы. Далее в файле UTFT.cpp меняем byte dtm[] = {16, .... , SERIAL_5PIN}; на все "8" byte dtm[] = {8, .... , 8}; , т.е. перестраиваем все режимы на 8бит . ( word dsx[] = и word dsy[] пока необязательно, главно пока угадать инициализацию) Далее открываем пример, к примеру UTFT\examples\Arduino (ARM) + Teensy\UTFT_Demo_400x240 (можно под лупой разглядеть пиксели на экране на сантиметр и примерно прикинуть его разрешение) и перебираем UTFT myGLCD(ITDB32WD,38,39,40,41); 32 раза от UTFT myGLCD(0,38,39,40,41); до UTFT myGLCD(31,38,39,40,41); загружая в ардуино , и ожидая около 5 секунд на какой инициализации что появится на экране. Если экран хоть немного сменит яркость - эт тоже хорошо(дисплей проснулся, заработали преобразователи для питания ЖК матрицы), значит инициализация немного подходит к семейству его контроллера. Ну а в лучшем случае появится тест на экране.
И обязательно попробовать UTFT_v2.77b2_uno_ili9327_8bit_turbo либу из соседней ветки 3.5", на Уно подключается как адафруитский шилд (DB0-DB7 к D8,D9,D2-D7) , на меге к портуС (D37-D30) . Ибо с некоторыми контоллерами дисплеев в режиме 8бит надо немного по другому общаться. В этой либе по умолчанию настроен №31 инит - ili9327, но можно подменять закидывая в папку UTFT_\tft_drivers\ili9327_8 другие иниты и установки.
2.способ вероятность 99,9% , считать ID, и использовать его инициализацию в UTFT, если в ней не окажется , то запросто найти в инете и подменить схожую в UTFT.
либо а). переделать первую читалку согласно пинам DUE , и перебрать все самые распространённые регистры где может лежать ID .
либо б). лучше также переделать вторую читалку, + возможно её прийдётся переделать на 8 бит (добавляется ещё дерганье WR для пересылки второго 8бит для 16ти битной инфы , и дерганье RD для принятия второго 8битного 16ти битной инфы) , хотя вроде в дисплеях у которых адрес не лежит в 0x00 адресе, и так адрес(регистр) 8ми битный. Или мож там просто предусмотреть переключение PORTA и PORTC между собой, ибо при переключении разных контроллеров с 16 на 8 бит, у них эти 8бит оказываются у кого на PORTA, у кого на PORTC (речь о Меге).
посмотреть к примеру можно скачать даташит ili9488 стр.40-42 , на 40стр показано запись и чтение в 8ми битном режиме "DBI Type B 8-bit". на 41-42 графики записи чтения 16ти битного режима , надо только добавить дерганье соответственно WR и RD для отправки/получения второго и последующего 8ми битного байта. Что-то мне помниться оно немного иное чем для контроллеров у которых ID лежит по 0x00 адресу.
// 8битные дисплеи вторая читалка хорошо читает, если у них ID лежит в 0x00 адресе(регистре). Если в других регистрах, надо время тестить проверять/допиливать на 8бит на DUE(у меня её нет). Если будете переделывать первую читалку, то проверте в ней чтоб правильно устанавливались лог. уровни управляющих сигналов согласно графикам записи чтения , а то я сомневаюсь там в правильности. Вторую читалку переделывать/проверять на 8бит пока у меня нет ни надобности(все дисплеи что мне попадаются, имеют возможность 16ти битного режима) ни самого главного - времени.
//// 1. сделайте 1 способ. 2. когда будете добивать второй способ , то там для 8ми битов надо оставить только их ,
без того что должно падать во второй порт PORTA на другие пины, ибо если вторая читалка ничего не вычитала (лог сериал монитора надо было приложить, подключение D37пин меги/дуе младший бит к младшему биту вашего дисплея D10 и т.д.) , то скорее всего у вас контроллер у которого ID не по 0x00 адресу, пилите вторую читалку, выложите что она ответила в сериал монитор. т.е. выложите что отвечает в сериал монитор переделанная вторая читалка без убирания старшего байта, и с убиранием работы со старшим байтом (пины 29-22).
Спасибо за помощь! С программой сегодня уже не успею, скорее всего завтра- послезавтра. Надеюсь на следующей неделе выбраться в город и купить резисторы, что бы попробовать с Мегой (если не получится с ДУЕ).
Вот ссылки на фото дисплея и схемы от телефона:
А вот что выдает 2-я программа чтения ИД:
Начал читать UTFT_Requirements.pdf, немного не понятно: написанно что для 8-ми битного режима пины DB0-DB7 (подключенные к D37-D30) нужно подключить к земле. Соответственно в 8-ми битном режиме используются только старшие пины DB8-DB15 (подключенные к D22-D29). Но на дисплее только младшие пины DB0-DB7. Получается их нужно поставить на место старших? Так? Что-то я сегодня устал и немного торможу...
forfrends, покажи пожалуйста подробную схему подключения... если можно все.. и весь код? у меня тоже несколько экранчиков есть но на них практически нет информации... есть информация более менее на экранчик от k750i... но вот с чего начать не знаю.... боюсь что спалить..
говорил D10-D17 эт по распиновке http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-163168 , да их можно как вы DB8-DB15 обзываете.
Точно, извиняюсь ,ошибся, (исправил по возможности), при дисплеях 8бит надо подключать к меге/дуе D22-D29 а не к D30-37. Т.е. у вас младшим битом DB8 к младшему D22 и т.д.
цветной мусор это очень хорошо. это значит дисплей работает, выводится на экран что в видеоОЗУ в контроллере при включении оказалось , значит либо неработает только очистка экрана, м.б. из-за большой скорости дуе, экран не успел отработать или попробуйте перевернуть подключение DB8..DB15 на DB15..DB8 (крайне редко встречал когда распиновка зеркальна была в отличии как на схеме распиновки), либо у UTFT не оказалось нужной инициализации, без чтения ID не обойтись.
// судя по фоткам дорожек в шлейфе и в какой очередности они заходят в стекло, можно попробовать перевернуть DB8..DB15 на зеркально DB15..DB8 и снова прогнать все иниты в UTFT
и попробуйте ещё с прямым и зеркальным подключением инит от ili9488, https://yadi.sk/d/eO7CXOMQkpdYV (файлы из папки UTFT\tft_drivers\ili9486 закиньте в свою UTFT\tft_drivers\ili9486 , вызов UTFT myGLCD(28,38,39,40,41); )
если не поможет, пробуйте вычитать ID, скиньте свою переделку под дуе на 8 бит, проверю на меге (отвечать изменять буду на старые свои сообщения уже заблокированные для изменения, чтоб у вас был доступ отредактировать свое последнее, чтоб не засирать ветку новыми сообщениями)
Пробую вариант 2. Пересмотрел код из первого поста, вроде все верно, но я могу и ошибаться.
Единственное что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
А вот вариант Б с переделкой 2-й читалки под 8 бит - для меня это пока что высшая математика. Вроде все просто объяснено, но я сам это не смогу сделать - не хватает знаний.
Кстати, меня терзают сомнения по поводу правильности моего перевода 2-й читалки. Особенно перевода 0x00, 0xEF и др... Мне кажется я мог биты в обратном порядке написать, но как проверить - не знаю.
..... что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
.....
млин, как могла опечатка затесаться, непонятно, бывает видимо, имелось ввиду VSS(-, GND) , речь шла о подключении 1602, чтоб выводить инфу что по 0му адресу у изучаемого дисплея.
хорошо. проверю скетч на разных дисплеях, черкну. ,// в скетче не должно быть использование
digitalRead(30) )
....
digitalRead(37)
дисплей же 8ми битный ))) . сейчас, погодь, посмотрю... чтобы получать второй байт нужно дергнуть RD , чтобы отправить второй байт, нужно дернуть WR ....
для одних дисплеев надо так
вот , пробуйте (протестировал на ili9325)
////11.02.2016
Если ответы будут 00 EF BF D3 04 , то скорее всего забыли после использования UTFT переключить RD дисплея обратно c "+" на 42пин . И проверьте всёже на Меге. у меня с десяток разных дисплеев у которых ID по 00 адресу, эта читалка превосходно их читает. других дисплеев пока нет.
.
Мне кажется это ни на что не влияет, так это всего лишь чтение с дисплея. Просто в итоге результат пишет чуть больше чем надо (так мне кажется). Только что попробовал: убрал из программы всякое использование 30-37. Результат тот же:
Здраствуйте. Попался мне дисплей "CDT 128 96-002V2", дисплей от сотика, не могу найти на него нормальной информации, вроде - бы на контроллере ST7571, даташит на ST7571 нашёл но толку мало. Может кто использовал такай дисплей, подскажите.
ладно, буду писать следующие сообщения(по возможности сохраняя старые), чтоб прослеживалась последовательноость в диалоге, не в угоду конечно малостраничности темы (((
для одних дисплеев надо так: 16бит разбивается на 2 последовательных по8
на примере ili9325, для передачи адреса регистра сначала выводим старший байт ( 00 ), дергаем WR чтоб дисплей принял , потом выводим младший байт (00, или какой нужно) дергаем WR чтоб дисплей принял . Чтение тож в 2 последовательных байта (видимо м.б. и больше)
для других дисплеев на примере ili9488, регистры 8ми битные, поэтому нужен один такт WR для передачи адреса регистра, но несколько тактов, если будем записывать "параметры"(а они очень иногда глубокие, своего рода стек), и несколько тактов RD чтобы из регистра вынимать много "параметров"( последовательных байтов стека). Таким образом дстигается некоторое ускорение при записи/вычитывании байтов (не нужно передавать адрес следующего реристра, а контроллер сам инкрементирует его в пределах главного) , и уже эти "параметры" могут иметь 8/16/18 битное слово.
вот , пробуйте, накидал скетч читалка ID дисплеев V3.0beta Mega/Due (протестировал на Mega+8bit ili9325, делал не полное кажись соответствие диаграмме , но работает)
Спасибо за пример! Правда мне све это еще сложно понять, точнее сложно понять согласование таймингов. Это так, к слову.
Попробовал ваш код, оба раза ответа не было. Потом появилась мысль немного увеличить задержки. Поменял delay(10) на delay(50). В результате в регистре "0" появилось "10". wrx_u(); - закоментированна.
После поднятия задержек до "100" картина совсем изменилась:
Мне кажется что это не ответ а просто ошибки чтения из-за сильно больших пауз
Не пробавали написать код не в IDE arduino, а в Keil. По началу трудновато конечно, а потом как по маслу. Пройдены варианты и по SPI и с 8 и 16 бит шинами. И вот еще вопрос, как вы при инициализации управляете RESET-ом? Можно просто подключить к цепи сброса процессора, у меня так работает, экономит целый пин I/O.
diger67, Вариант, как по мне хороший, но подходит только для уже готового подключения и опознанного контроллера. Если же дисплей не опознан и нужно прочитать его ИД, то такой вариант не подходит, так как Ресет используется в процессе.
slider, наконец-то купил резисторы! Тодключил к Меге. Протестировал. Читалка из первого поста выдает одни нули. Читалки №2 и №3 вернули один и тот же ответ:
Что можете сказать по этому поводу? Это типа у меня контроллер дисплея HX5466 или ILI8600 или ...? Что выдала читалка?
о, эт хорошо, что к меге, через резисторы, и ответ нормальный виден, и видно что не по 0му адресу у него ID. Из широкораспространеных адресов пока не понятно. Недавно диспл. от sony ericsson копал, так там вообще распиновка на 1бит оказалось сдвинута, не как по схеме. Еле запустил, пока не проверил что неспользованный пин лог.1/0 выдавал, он оказался вхож в нужные 8бит/пин. Эт я к тому что можно попробовать прикинуть какой ответ бы был, если зеркально перевернуть биты, или мож проще физически перевернуть и глянуть что выдаст. Вечерком с ноута скину читалку, сделал чтение всех подряд регистров с 0 по 255 (00 - FF ) // эт проще в меге счетчик for и кидаем это наращивание в порт PORTA, для дуе вообще мутно побитно получилось бы.
Так с некоторых дисплеев видно было, в регистрах попадалось разрешение контроллера (дисплея) 00EF 01AF 013F (240x432 x320) , ну и ID тож.
Проконтролируйте ещё напр. 3,3в , оно не должно быть выше, особенно когда запускались схожие иниты UTFT, когда был виден цветной мусор. Если есть время, можете прогнать теперь уже на меге иниты UTFT.
Для питания дисплея пока остановился на резисторе 100-150 Ом от 5в и стабилитроне 3.0 в с параллельно smd кондером 4-10мкф. (ибо если делать 300 Ом то при запуске инита, питание может просесть ниже 2,8в . И если ставить стабилитрон 3,3в, то без инита напряжение может подняться аж до 3,6в , а для контроллеров это уже критично) . Если ещё параллельно стабилитрону подключить, для опыта, белый светодиод , то по маленькому снижению его яркости можно судить о возможной подходящего инита(инициализации), что заработали внутренние преобразователи для питания ЖК матрицы. Если хорошо притухнет, эт плохо, значит было перенапряжение на дисплее и преобразователи скончались. хотя ID, перед запуском инита вычитывается правильно, типа как контроллер рабочий. Но в ваше случае всё живое 99,9% , ведь виден цветной мусор на некоторых инитах.
В вашем случае на меге можно запитать от меговских 3,3в и параллельно какую нить нагрузку кинуть, типа стабилитрона 3,3в.
И прикиньте примерно сколько у него разрешение, как, писал выше, раз такая байда затяжная получилась. Эт чтобы отсеять малые контроллеры.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
читалка 3.1 PORTA, проверена на дисплеях с ID в 00h , и на других (ili9327 8bit , R61523 16bit) - отлично читает всю память, соответственно и ID в ней. (да, иногда некоторые регистры имеют глубину 10 , но ID так глубоко не запихивают, хватает в читалке и глубины =8) .
~522*290 не встречал похожего разрешения, ближние разрешения 480x320 (ili9486,ili9488,ili9481,HX8357,HX8347,RM68040,R61581,...) и 640x360 (R61523,...)
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
А это результат с закоментированной wrx_u();
Результат, похоже, одинаковый
судя по логу, это подделка (аналог) известного контроллера . не все ID знаю, но здесь подозрительно он слишком короткий (здесь м.б. данные с регистов 04 BF , DA DB DC, 2A 2B-размер), похоже на подделку . Но это не мешает работать этим дисплеям с ардуинкой. инит должен подойти от широкораспространённого. Есть ещё вариант поискать прошивку на этот тлф. по его названию , в прошивке глянуть какой драйвер дисплея используется. Еслиб тлф. был живой, то ещё вариант можно было включить анализатор при его включении, и снять короткий лог инита и вывода графики.
Ещё вариант, простой для вас, переберите иниты распространенных 480x320 дисплеев, которых нет в UTFT ( memorysaver.h ). какие можно поиском по aliexpress, инету, вайенжиниринг.ком найти, 480x320 , 320x480 , 480 x 320 LCD screen - будут много разных вариантов, смотрите описание , зачастую приводят тип контроллера, далее находите инит , подтыкаете в UTFT , заводите, радуетесь победе, и стряпаете на нём чтонибудь полезное.
// позже, если время будет, мож через недельку выложу ещё несколько изученных контроллеров/дисплеев вместе с логами читалки для сравнения , как оформлю. вот на днях попался 640x360 R61523 , подделка (ID почти пустое, как у вас, и не такое как в PDF) , но инит подошёл, UTFT тест кажет (подменил значения и переназвал функции в ините r61581, от найденного инита от STM в инете) , . как куплю оригинал, исследую , выложу инфу о разнице по чтению оригинала и аналога(подделки).
Вот по некоторым контроллерам есть ещё старенькая табличка LCD_Table.xls контроллеров, дисплеев, тлф найденная на просторах инета https://yadi.sk/i/Z_0aZQkAoyDGo . (мож существует и дополнение благодаря тому кто её составляет) . Когда ищите в ней, не забывайте , избегать выделенных фрагментов и ставить галку искать по всей книге, а не листу.
////Чтоб ветку не засорять, можете на емайл писать sеgun coб. яндekс ру (переписать все буквы латиницей)
Интересно подниму тему :-)
.
Здравствуйте помогите разобраться :
дисплей с мегой
http://ru.aliexpress.com/item/MEGA-2560-ATmega2560-16AU-Board-For-Arduin...
в скетче инициализация :
UTFT myGLCD(CTE40,38,39,40,41);
UTouch myTouch(6, 5, 4, 3, 2);
бтблиотеки -
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>
Проблема в таче- он работает только с одной стороны экрана . Добавил #define TOUCH_ORIENTATION PORTRAIT , все равно точно не попадает куда нажимаешь. Я где то давно видел в библиотеку добавляется , что то типа x=480 y=240 и тогда точно работает . Сам искал - ненашел .
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Я по той ссылке что выше прочитал всего одно сообщение... И то там увидел что возможно у кого то перепутаны были пины... X и Y или что то в этом роде... Проверте у себя...
Про перепутанные пины это верно, есть у меня tft на ili9327. Подключение 8бит UNO. Работать нормально не хотел, пока в программе не подкорректировал подкючение выводов тача. Они там напрямую к ардуино подключены.
по калибровке, пожалуйста, пишите в одноименные темы .
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
Раз его нет на руках, к чему тогда вопрос?! На сейчас он уже превосходно гуглиться, поиск и аналоги выдает. В соседней ветке вам отвечали по нему. Неохота снова искать? И еслли раз никто не потратил на него драгоценного времени, не выложил в инет, (раз был вопрос, значит рассчитывали на ответ) - предлагаю тогда самим потратить пару дней. разобраться безвозмездно и сделать добро, выложить инфу по нему. мож кому пригодиться. или мож скажут хотя бы спасибо. Находя себе тоже нужную инфу в инете, задумывались, кто то ж добрый потрудился, её выложил.
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
...
register 2A 00 00 00 01 00 00 00 00
register 2B 00 00 00 01 00 00 00 00
...
register DA 54 54 54 54 54 54 54 54
register DB 80 80 80 80 80 80 80 80
register DC 66 66 66 66 66 66 66 66
...
глянул ещё парочку даташитов больших дисплейчиков , замечу, что ID иногда не только ложат в 04h (или вообще пустой оставят). но и дублируют ID1 ID2 ID3 в DAh DBh DCh . ( DAh - manufacture фабрика (не стоит обращать внимание) DBh DCh - module / driver драйвер ).
Из 800x480 864x480 попались такие замечательные даташиты
NT35510 : 04h 00 80 00 , DAh 00 , DBh 80 , DCh 00 .
HX8369 HX8369A : 04h-отсутствует , DAh 00 , DBh 80 ( 81 82 83 84 85 ) , DCh 00 .
иниты гугляться . к примеру " HX8369 init "
480x320
ILI9486 ILI9486L : 04h 1параметр не определен, 2й-фабрика. 3,4й-драйвер , DAh - xx , DBh от 80 до FF , DCh 00h (тоже немного подходит под то что выдала читалка)
кстати эти регистры м.б. перепрограммированы в OTP режиме.
т.е. у вас получается id1 0x54 id2 0x80 id3 0x66
что то такое подобное уже гуглиться , https://github.com/notro/fbtft/issues/62
# tinylcd35: 0x2A, 0x40, 0x33
возможно похоже на HX8369 , скормите его инит дисплею .
в книге LCD_Table.xls (спасибо составителю) https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0ahUKEwiu6vXx2IrLAhULDCwKHanVDi0QFghGMAU&url=http%3A%2F%2Fvrtp.ru%2Findex.php%3Fact%3DAttach%26type%3Dpost%26id%3D385043&usg=AFQjCNF0lMgp6m6m0UoU_nnF17Uwp79spA&bvm=bv.114733917,d.bGg поищите подходящие по разрешению контроллеры, и в инете гляньте в их даташитах , какие у них бывают ID .
вот ещё попалось интересное место инитов с файлов какой-то версии андроида под контроллеры применяемых больших дисплеев https://github.com/wiko-sources/cink-slim/tree/master/mediatek/custom/common/kernel/lcm . Также из файловой системы андроида, полагаю можно подсмотреть инфу чтобы подключить емкостный тачскрин к ардуино, ведь они тоже дешевые , от 50руб. ( Разработка ядер и прошивок для Android http://4pda.ru/forum/index.php?showtopic=583114 )
Специально проводить экспиримент я и не просил. Знаю по себе как заниматься инженирингом. Покупать кота в мешке тоже не айс. Хватает вопросов и по работе с контроллерами и с их перефирией.
вот здесь много и со ссылками где заказать сделать плату и с написаными драйверами
http://andybrown.me.uk/2013/10/19/vivaz-u5-lcd/
Да. спасибо. про vivaz знал, хорошая статейка. Ранее запускал уже дисплеи от SonyEricsson U5 и U8i на ардуино мега . шаманил UTFT под него.
Разрешение превосходное. Диагональ бы поболе. Повышайку для подсветки поставил готовый модуль MT3608, 19вольт через гасящий резистор. Подпаивал дисплей проводками, ибо разъем ( шаг 0.2мм против обычных 0.3мм ) стоит дороже дисплея в 4ре раза! . Ищу пока оригинал дисплея чтоб сравнить с неоригиналом. В плане потом черкнуть по ним. Да и флаи надо добить. U5 U8i перевести на 8 бит для мини, чтоб было много свободных пинов, весьма трудно , смотрел , очень тонкие дорожки от im0-2 со стекла в шлейф и там сразу на + и - . Если делать как есть 16бит , на мини остануться 4ре свободных пина, хотя для некоторых проектов хватит. И если сравнивать 8 бит и 16 бит на ардуино уно/мини/нано , то 8бит будет гораздо шустрее работать, чем 16 бит. (из-за раскидывании по многим разным портам при 16бит) . На меге да, 16 побыстрей будет чем 8 . К примеру тест UTFT на меге на ili9325 320x240 8бит-за 45сек, а в режиме 16бит - 41сек.
//////////////////// по R61523 Vivaz Arduino UTFT в следующих постах на 6й странице
Имхо LCD с разрешением более 320х240 подключать к 8-ми разрядным процам да еще по 8 разрядной шине считаю кащумством. Тогда уж лучше miniSTM на 103c8t, да на 16 полноценных битах. остается порядка 20 свободных пинов, есть адаптация под IDE arduino. http://www.stm32duino.com/viewforum.php?f=1&sid=776b93cae447043c5a6340572d148fe3
И быстре решает задачи. и больше перифирии.
у меня меньше пинов, 10 штук . дисплей от айфона 5+++( татч косил, ну я его и списал на запчасти).
пины просто подписаны 1.......10,
может кто даст в какую сторону искать и как прозвонить пины
у меня TFT 2.8/ Не работает с оргиналом Адафруита ни с UTFT, но работает вот с этой переделкой https://hackaday.io/project/6829-spfd5408-arduino-library-for-24-tft
У меня программа вот это выдала, не пойм что с этим делать? как понять что за дисплей? подключал в соответсвии с пинами на плате как есть
start...
UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)
register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)
HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)
R61509V(B509), R61505W(C505), SPFD5420A(5408)
if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit
register 0 0
1 Parameter 0 0
2 Parameter 0 0
3 Parameter 0 0
4 Parameter 0 0
5 Parameter 0 0
6 Parameter 0 0
register EFh for ILI9327(0 02 04 93 27 FF),
register 0 EF
1 Parameter 0 EF
2 Parameter 0 EF
3 Parameter 0 EF
4 Parameter 0 EF
5 Parameter 0 EF
6 Parameter 0 EF
register BFh for ILI9481(0 0 94 81 xx xx)
register 0 BF
1 Parameter 0 BF
2 Parameter 0 BF
3 Parameter 0 BF
4 Parameter 0 BF
5 Parameter 0 BF
6 Parameter 0 BF
register D3h for ILI9488(0 0 94 88 xx xx)
register 0 D3
1 Parameter 0 D3
2 Parameter 0 D3
3 Parameter 0 D3
4 Parameter 0 D3
5 Parameter 0 D3
6 Parameter 0 D3
register 04h for HX8357(?DA-DC), HX8353(?80-85),
register 0 4
1 Parameter 0 4
2 Parameter 0 4
3 Parameter 0 4
4 Parameter 0 4
5 Parameter 0 4
6 Parameter 0 4
у меня TFT 2.8/ Не работает с оргиналом Адафруита ни с UTFT, но работает вот с этой переделкой https://hackaday.io/project/6829-spfd5408-arduino-library-for-24-tft
Если работает, тогда нечего уже и пытать.
судя по логу (считывается тоже, что и посылается), у вас неподключен RD дисплея на 42й пин меги.
Для вставки кода , при написании сообщения, надо пользоваться значком {....} code , в окошко скопировать выданный код из монитор порта. В окошке, еще есть вкладка дополнительно , поставить галочку на Сворачитьвать код по умолчанию...
Примените читалку для 8ми бит . версию 3.1 она считывает все регистры. Управляющие пины подключать как написано в скетче читалки. шину данных два варианта:
читалка v3.1 для PORTC , если дисплей вы подключили на PORTC (пины ардуино 30-37 соответственно подключили к дисплейным DB7-DB0), то :
читалка v3.1 для PORTA , если дисплей вы подключили на PORTA (пин 22-29 ардуино меги соответственно подключать к дисплейным DB0-DB7), то :
Вот к примеру что она выдала для неизвестного 2.4" tft lcd shield arduino uno
, который тоже запустился на адафруитской переделке от SPFD5408 (для запуска на UTFT, никто видимо не хочет попыхтеть для него, можно было сделать на базе UTFT_v2.77b2_uno_ili9327_8bit_turbo).
Как видно из лога, это вообще непонятный левый аналог. Согласно даташиту http://www.micro4you.com/files/lcd/SPFD5408A.pdf , для SPFD5408, ID должен лежать в 00h , и должно было считаться 54 08 .
По факту в дисплее стоит контроллер - аналог . Поэтому и применяют переделки, в частности от adafruita ,они не вычитывают какой id контроллера, чтобы скормить ему подходящий инит , а тупо дают ему определенный инит. Собственно как и делает UTFT, для неизвестных дисплеев в нем может не оказаться подходящего инита, да и подходящую битность там надо установить. К тому же в UTFT ,если дисплей переведен с 16ти на 8 бит, иногда приходиться немного попыхтеть. К примеру выставить все 16ть бит byte dtm[] = {16, 16 ... 16}, но физически использовать младшие 8мь бит, т.е. PORTC ( пин 30-37 соответственно подключать к дисплейным DB7-DB0 ) , так хоть можно увидеть какие нибудь корявые картинки теста. Т.о. перебирая иниты можно убедиться что дисплей жив и может что-то рисовать.
как конечное решение можно , подсмотреть на переделке UTFT UTFT_v2.77b2_uno_ili9327_8bit_turbo , на форуме она есть . Для меги, уновский шилд по умолчанию подключать проводочками на PORTC . Можно и напрямую , в соседней ветке про 3.5", выкладывал переделку на базе её, чтоб уновский адафруитский дисплей воткнутый в мегу работал.
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
у меня дсиплей с вот такими пинами LCD_CS A3 LCD_CD A2 LCD_WR A1 LCD_RD A0. это фактическое подключение в соответствии с надписями на дисплее. переделка так работает
я пробовал для UTFT делать инит в соответствии с рабочей AdafruiSPFD5408, вроде всё верно, но всё равно белый экран
а почему именно белый экран горит? что это значит? почему не абракадабру выводит?
самое интересное что я пробовал в соответствии с инструкцией рабочей переделки исправить оргинал Adafrui, но всё равно белый экран, вот это и странно
а есть ли какаято статья обучающая про это всё про битность способы передачи регистры и тп, именно при работе с дисплеями такими а то ничего почти не понятно? вот этим было бы интерсно заняться, там бы исам разобрался
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
так уновские дисплеи на проводках никто и не собирается использовать, невнимательно читали. Это подключение только для удобного считывания ID программе. и если что удобного и понятного управления. И как стандартное подключение меговских шилдов. Читалку специально для уновского дисплея напрямую воткнутого в мегу , нету надобности делать , ибо не всегда у них реально выведен RD, да и по некоторым адресам сама адафруитская либа умеет считывать и выводит в монитор порта.
Для использования же Уновских Адафруитских шилдов на меге и уно, подходят либы и адафруит и UTFT-подшаманенная. В теме про 3.5" явный пример использования UTFT для связки Уно+адафруитский уновский шилд к примеру на базе ili9327 - решение UTFT_v2.77b2_uno_ili9327_8bit_turbo. Для связки Мега+адафруитский уновский шилд - http://arduino.ru/forum/apparatnye-voprosy/tft-35-i-arduino?page=6#comment-90708 разбирался сам в работе библиотеки , и на форуме обсуждалось что и как, изучите внимательней. там же народ нашёл методы ещё ускорения работы UTFT.
// на адафруитском уновском шилде DB0 DB1 заведены на пины ардуиновские D8 D9 . Для UTFT в уновском шилде по умолчанию они должны быть физически на пинах D0 D1 (на которых находится сериал порт, адафруит их высвобождает) .
№11
3,0" 400x240 дисплей Fly E155, HX8352A tft lcd 37pin 4led SR7791493
картинки кликабельны:
распиновка:
по R00h вычитывается ID 0x52 что соответствует HX8352A . В UTFT он есть . вызов UTFT myGLCD(HX8352A,38,39,40,41); . Дисплейчик 16бит. Перевод в 8бит на шлейфе не предусмотрен (разве что чем нибудь острым перекоммутировать дорожки со стекла в шлейф).
Вот такой вот шилд получился. Габариты дисплея не загораживают верхний и нижний ряд выводов ардуино.
углы обзора вверх вниз вправо хорошие , влево не очень . Попробовал пины длинные long , поэтому можно под шилдом разместить обычную плату или шилд.
№12
3,2" 320x240 дисплей Fly IQ230, tft lcd 41pin 6led FPC-FRD32181A
картинки кликабельны:
распиновка:
по R00h вычитолась ID 6809h , изучение даташитов дало что это контроллер RM68090 , причём в старой версии rev01 этот контроллер имеет ID 6807h , в новой версии rev04 - ID 6809h .
setxy.h
здесь видим характерные для больших дисплеев 0x80
register 04 00 54 80 66 ( 0x54 0x80 0x66 ) и
инит и даташит толком небыло в инете
init code ili9338 ili9338b переписанный с PDF , уже переделал в формат UTFT, для файла initlcd.h
setxy.h
вот еще один инит:
но самый короткий инит получился:
Вот архив , где собрал datasheet ili9338 ( ili9338b ) , hx8347d , hx8347a hx8347b hx8347g ili9335 ili9340 ili9342 , подготовленные UTFT для 16 и 8 битного режимов.
https://yadi.sk/d/7eSf9jMXqsFuX
эти экраны, как и все остальные, ещё есть в магазинах в разных городах по смешным 50руб ценам.
на здоровье :) . благодарение принимается :)