Как подключить дисплей 3.2 LCD Module

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Как и говорил, за быстродействием не гнался. Почти полностью перетащил UTFT - могу продемонстрировать быстродействие. Стандартное демо от UTFT по ссылке:

https://youtu.be/rv5ML4GPjp8

Поднимал еще частосту ISP начинают появлятся артифакты. Минимальное время теста доводил до 32000.
Если убрать сопли из проводов и качественные регистры взять - можно еще ускорить, но зачем?

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

ArtemRu пишет:

......

Минимальное время теста доводил до 32000.

Если убрать сопли из проводов и качественные регистры взять - можно еще ускорить, но зачем?

Крутяк. вот это да, вроде никто еще так не делал !

Так можно и не на esp8266 сделать , но и на arduino.

попробую попробую сделать на smd hc595  и выжать максималку :) по горячим следам,  черкните для этого схему подключения (просто от руки на бумаге) , и все необходимые библы , скетч на яндекс диск . (и как частоту поднимать, что где менять ? (опыта с esp8266 у меня нет , но модули приобрел для будущих экспериментов)

И что надо сделать чтоб 8ми битные диспы подрубать по одной HC595 ?

Можете если время будет протестить , мож скорость такая же будет?

 

// чтот по видео , справа на диспе темное место, мож по горизонтали он не 320пикс а 400пикс?

///// нашел на ютубе еще видосы по esp8266 и дисп с параллельной шиной https://youtu.be/gvpuhrO4_bw

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Схему обязательно выложу в выходные. После недели бессоных ночей в пятницу я отдыхать :)

8-бит - быстрее не будет, в теории даже чуток медленнее. Но изменения в скорости врятли заметим. А вот проводов заметно меньше.

Сильно не ругать, по ссылке черновой вариант. Все функции  одном файле, не все перенесено еще и порядок не наведен.  Чуть позже наведу красоту.

 

в ESP частота 80МГц, а не как в меге 16МГц.  Если привязываться к тактованию процессора - скорость SPI можно сделать довольно приличной. Я в сам протокол не вникал, но похоже используется аппаратный, с жесткой привязкой к некоторым пинам. Скорость передачи меняется "Делителем" относительно частоты тактования. В этом мой главный косяк, я с делителем не разобрался до конца - единственное место где методом тыка подбирал :(.

Для меги в моем файле в setup удалить задание частоты SPI.setFrequency(80000000) и указать делитель правильный SPI.setClockDivider(SPI_CLOCK_DIV2).

Или как вариант не использовать библиотеку SPI.h вообще. Для этого надо ряд функций заменить на вот это:

//********************************************************************
// раздел передачи данных по SPI В РЕГИСТРЫ
//********************************************************************
 
void writeShiftRegister16(int ss_pin, uint16_t value)
{
  //digitalWrite(ss_pin, LOW);
  cbi(P_SS, B_SS);
  /* Фокус вот в чём: сначала шлём старший байт */
  //SPI.transfer(highByte(value));
  /* А потом младший */
  //SPI.transfer(lowByte(value));

        if ( value & 0x8000 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x4000 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x2000 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x1000 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x0800 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x0400 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x0200 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x0100 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );

        if ( value & 0x80 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x40 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x20 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x10 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x08 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x04 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x02 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x01 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
  
  //digitalWrite(ss_pin, HIGH);
  sbi(P_SS, B_SS);
}

void writeShiftRegister16(int ss_pin, uint8_t valueH, uint8_t valueL)
{
  //digitalWrite(ss_pin, LOW);
  cbi(P_SS, B_SS);
  /* Фокус вот в чём: сначала шлём старший байт */
  //SPI.transfer(valueH);
  /* А потом младший */
  //SPI.transfer(lowByte(valueL));

        if ( valueH & 0x80 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x40 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x20 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x10 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x08 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x04 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x02 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueH & 0x01 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );


        if ( valueL & 0x80 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x40 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x20 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x10 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x08 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x04 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x02 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( valueL & 0x01 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );        
  
  //digitalWrite(ss_pin, HIGH);
  sbi(P_SS, B_SS);
}

void writeShiftRegister8(int ss_pin, uint8_t value)
{
  //digitalWrite(ss_pin, LOW);
  cbi(P_SS, B_SS);
  //SPI.transfer(value);
  //***** тест ручной передачи

        if ( value & 0x80 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x40 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x20 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x10 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x08 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x04 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x02 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
        if ( value & 0x01 )
            sbi ( P_SDA, B_SDA );
        else
            cbi ( P_SDA, B_SDA );
        pulse_low ( P_SCL, B_SCL );
  
  //digitalWrite(ss_pin, HIGH);
  sbi(P_SS, B_SS);
}

Черная полоса - это уже не экран. Если вплотную посмотреть - там стекло с клеенкой, экран под ней.

diger67
Offline
Зарегистрирован: 25.07.2015

 Есть у меня стекло ili9341, на нем выведен Fmark. Судя по даташиту это сигнал начала чтения памяти экрана(отображение ОЗУ в область матрицы). Пробовал его активировать, но не как не пойму, то ли он работает только в режиме 18 bit RGB, то ли я не все настраиваю в контроллере TFT. Если получится то можно будет используя внешнее ОЗУ размещать там обновленный фрэйм, а затем переписывать его в память TFT. При этом можно добится неплохих результатов и практически избавится от водимой отрисовки экрана. Максимальная скорость SPI которую использовал - это 50 МГц(stm32f746), использовался SPI на индикаторе. Очень хороший результат при использовании DMA. Но все равно видна отрисовка на экранах размером 480х320.

 

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Впечатлился:

супер скорость, но конец RAM

в том числе подборка роликов

45мс а нам слабо :)

Почитал посмотрел - пока оно того не стоит.

Сечас сформулирую требования к отображаемой информации и с библиотекой для работы с элементами управления на экране (коллекция элементов управления). Определюсь с количеством свободных ресурсов или их осутствии. Далее видно будет заниматься этим или нет.

Плюс у меня явно проблема с линией передачи - при увиличении скорости SPI появляются артифакты на цветах - где чередование 0101 часто встречается.

Но вариант с буфером отображаемой информации внутри контроллера мне все более симпотизирует, лучше два буфера актуальные данные и данные для передачи. Намного проще распределить процессорное время и легче делать наложение - оконный интерфейс :)

Без DMA тоже можно ускорить обновление, но буфер всеравсно нужен. Можно оформить "сжатие" данных. Делем массив не из 2х байт, а из 3х. 3й байт информация о "свежести данных". Если свежие данные передаем текущией пиксел и ближайшие пять. Или свежесть хранить построчно.

Пока задача номер два, 4 свободных пина и много датчиков. Похоже мультиплексоры......

Я три раза пересмотрел даташит на ili9341, что за Fmark? 
вот тут нашел, по ILI это "TE"

только не понимаю зачем он? на прерывание повесить?

ssss
Offline
Зарегистрирован: 01.07.2016

Теории не знаете, считать не любите, с референсом не дружите, вот и ковыряетесь пожизненно.
На голимом стм8 на восьмибитной шине при 320х240 и времени вывода инфы 60мС отрисовки не видно!

diger67
Offline
Зарегистрирован: 25.07.2015

ArtemRu пишет:

Я три раза пересмотрел даташит на ili9341, что за Fmark? 

вот тут нашел, по ILI это "TE"

только не понимаю зачем он? на прерывание повесить?

В даташите от производителя tft помечен как Fmark, проедпологаю что да, повесить на прерывание и использовать ка сигнал синхронизации. 

ssss, ой ли. Что по вашему незаметна отрисовка? Это когда вы цыферки выводите в област 16x24 пикселя. А нука отрисовать фон, да не статический, а динамический и при этом наложить на него спирайты динамические. Что то мне подсказывает что будут проблеммы. Большая часть библиотек растровая а не векторная. Да и для векторной графики вычислительных мощьностей stm8 вряд ли хватит.

ssss
Offline
Зарегистрирован: 01.07.2016

diger67 пишет:

ой ли.

Да-да-да!

Цитата:

Что по вашему незаметна отрисовка?

Да то и значит!

Цитата:

Это когда вы цыферки выводите в област 16x24 пикселя.

Ващета... 32х50 было. Да ещё и с увеличением х2, и в 16 бит цвете. Для типовых восьмибиток это уже задача непомерно тяжёлая, изначально. И тем не менее, отрисовка была незаметна, не смотря на время в 60мС.

Просто юзались некоторые аппаратные фишки СТМ8.

Цитата:

А нука отрисовать фон, да не статический, а динамический и при этом наложить на него спирайты динамические. Что то мне подсказывает что будут проблеммы.

Для такой шняги проще взять планшет или навигатор и не прослыть, заодно, изобретателем-долгожителем каменного топора.

Пользуйтесь калькулятором, не стесняйтесь. Термин "максимально возможная теоретическая скорость передачи данных" ещё никто не отменял, как и "типовая скорость обновления экрана ТФТ".

Цитата:

Большая часть библиотек растровая а не векторная. Да и для векторной графики вычислительных мощьностей stm8 вряд ли хватит.

Красиво выдавать прописные истины за свои, да? Только если всё знаете, почему у вас не работает так как надо? Никто на стм8 HD контент крутить и не собирался. Какбэ и так было понятно. Ну, может быть не всем.

diger67
Offline
Зарегистрирован: 25.07.2015

ssss, планшет или навигатор - это не интересно. Там аппаратная часть уже решена, да и приложения в достатке для разработки. И да, ты  подтвердили что восьмибитки могут, но сильно ограничены. Не смотря на аппаратные фишки. Что касается частоты вывода фрэйма, то для ili9341 она может быть от 61 до 119 Гц, что соответственно равно от 16 до 9 мс. Если применить делитель то и того меньше, И в итоге все упирается в скорость обаботки и передачи информации в TFT. Многие да и я в то числе пока не нашел лучше способа чем использовать DMA, ну и на свой стах и риск разгонять кмикроконтроллкр до предела.

ArtemRu
Offline
Зарегистрирован: 04.12.2017

В выходные только часов 5 уделил, к сожалению ничего не успел - проблема с Тачем нарисовалась, точнее 2:

1) запускается через раз. В буквальном смысле слова. Ловлю на "PEN" - сброс в уровень 0 при касании. Проверял контроллером, мультитестором и светодиодом, результат один. Можно не меняя программы сидеть и перезагружать контроллер - пока не заработает.  При этом заметил, что когда Тач оживает - просадка по питанию идет. В нормальном состоянии напряжение 3,3В, когда оживает тач просаживается до 3,1В. Сегодня попробую источник питания поменять, в том числе на экран отдельный блок выделить. Возможно не вытягивает преобразователь в ESP.

2) чтение координат странное. После замены источника питания буду повторять. По примеру sva_khv - чтение "работает" даже координата "Y" совпадает, Х - инверсия. Но главная проблема - после первого нажатия на экран постоянно пытается читать, при этом координаты уже далеки от реальности.
Попробовал библиотеку URTouch. Для ESP примеры надо переписывать - она в бесконечные циклы загоняет программу в ожидании ответа от татча. Как результат ESP - уходит в ребут по сторожевому таймеру. В калибровке вставил везде delay(0);  - калибровка прошла, даже разные данные если "тыкать" не туда.  И повторяются, если целится правильно.
Остальные примеры переписываю. Пока на первом остановился - кнопки. Координаты не читает (-1; -1). Сегодня посмотрю, где не доглядел.
Еще вопрос по библиотеке URTouch, зачем она вход для прерывания PEN от экрана, в перерывах между чтением переводит в выход и поднимает высокий уровень?

diger67
Offline
Зарегистрирован: 25.07.2015

Посмотри, может поможет  https://youtu.be/oAnAdO2NUCQ  . Единственный способ как поборол проблемму с зависанием xpt2046, это в функции чтения координат ввел функцию инита чипа, возможно в xpt2046 не сбрасывается флаг прерывания по касанию. Как правильно это сделать не понял и не нашел ни в одной статье. Так же он стабильно работает при чтении параметра Z. Но возникают другие вопросы, какие сейчас не помню.

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

ArtemRu, питание д.б. хорошим и стабильным. на шилде два VDD , xpt2046 питается от sot-23  662K (это стаб 3.3вольта) , иногда могут ставить другой на 3.0в (на SPI TFT LCD шилдах особенно) . если нет у вас 5в , а только 3.3 внешних , то надо закоротить перемычку J1 , чтоб миновать провисание 662К , но д.б. очень надежное 3.3в.

  Самый лучший вариант это дать всеже стабу 5в , и он сам даст надежные и ровные 3.3в (а не те что провисают у esp8266 под ее работой)

раз все-же просаживается , возможно шлейф тача в месте пайки коротит.  Выключите питалово и прозвоните мультиметром сопротивление линий тача на входе xpt2046 . и при нажатии на тач они должны пересекаться. проверьте 4 крайние точки на таче.

ArtemRu
Offline
Зарегистрирован: 04.12.2017

УПС, сжег 662К :)

Когда питание экрана было подключено к 3.3V ESP - тач работал при более "низком" напряжении, как писал выше

Когда подключил к 5V USB Тач стал намного чаще запускатья 50/50. Но картина обратная. При работающем татче напряжение 3.2 -3.3. При напряжении 3.0-3.1 татч не запускался.

Общее питание у меня от USB компьютера. Попробовал зарядки от телефонов, картина примерна такая же.

Взял внешнее питание 5В от макетки "-" посадил на общую землю, все плюсы от экрана VDD и BL посадил на + внешнего источника. включил и получил дымочек от экрана :)

насколько я понимаю теперь перемычка J1 и назад на 3.3 вольта. Вопрос только 662K лучше вообще удалить?

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

ArtemRu , попробуйте всеже найти  XC6206P332MR (662K) 3.3V/0.5A   в местных магазах должны быть.

Да и в домашней/офисной электронике  полно 3.3в стабов (в других корпусах и распиновкой) , можно дернуть с нее. иногда на переходнике usb-ttl ch340 его допом ставят, на ардуино , да и других ардуино плат.

 стаб этот сгорает от переполюсовки. и как-бы он не пустил сильное напр. в дисп.

 

 

ArtemRu
Offline
Зарегистрирован: 04.12.2017

пока только под заказ нашел...
я проверил раза 4 перед включением. и раз 10 после дымка. переполюсовки и не корректного подключения не нашел :(
Хоят - это с моей точки зрения корректное.

Пациент скорее жив чем мертв.

Поставил перемычку J1 убрал 662K. Экран ожил, татч ожил - в том же виде через раз. Пациент уше в запас до выяснения и ремонта.

Новый клон - симптомы теже. Раз 10 к разу перезагрузил - татч работает, на десятый раз отказал :).

Питание 5В, но в этот раз с контроллера внешнее питание боюсь заводить

 

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Ссылка не работает. У меня сейчас - до первого чтения не доходит. Все библиотеки смотрят пин состояния от татча - а он не реагирует на нажатие.
Поищу про инициализацию - может поможет.

Пока что наиболее стабильно запускается сенс - если пин состояния татча - предварительно выходом сделать и подать высокое на него :).

В связи с выгоранием первого - это уже второй. Глюк аналогичен. У второго в левом нижнем углу трудно нажать. При калибровке приходится рукой придерживать и нажимать сильнее на крестик в нижнем левом углу.

Еще вопрос... ILI9341 и XPT2046 - Это же независимые контроллеры? у меня без инициализации дисплея ни разу татч не получилось запустить. Может в инициализации ILI надо вносить изменения?

diger67
Offline
Зарегистрирован: 25.07.2015

xpt2046 отделный чип и ни как не связан с ili9341 галванически. Еще раз повторюсь в функцию считывания координат после считывания добавте фунцию inittouc(). С гарантией 100% проблема уйдет. У меня функция чтения выглядит примерно вот так.

bool Get_Touch_xy(__IO uint16_t *x_kor, __IO uint16_t *y_kor, bool calibrate)  
{
 __IO uint16_t touch_x = 0;
 __IO uint16_t touch_y = 0;
 uint16_t touch_X[10]={0}, touch_Y[10]={0}, touch_avg;
 uint8_t i, flag;
 
 flag = IsTouch();
 //press = IsTouch_XY();
 if(flag) //Есть касание //There is a touch
 {
   for(i=0;i<10;i++) //Считываем десять измерений x и y в точке касания //Read ten dimensions x and y at the point of tangency
   {
    touch_X[i] = Get_Touch(chx);
    touch_Y[i] = Get_Touch(chy);
   }
   
   Sort(touch_X); //Сортируем измерения по нарастающей //We sort the measurements by increasing
   Sort(touch_Y);
    
   touch_avg=0;  //Расчитываем среднее арифметическое измерений отбросив два наименьших и два наибольших 
   for(i=3;i<7;i++)  //We calculate the average of the arithmetic measurements by discarding the two smallest and two largest
   touch_avg+=touch_X[i];
   touch_x=touch_avg/4;
    
   touch_avg=0;
   for(i=3;i<7;i++) 
   touch_avg+=touch_Y[i];
   touch_y=touch_avg/4;
   
//   touch_x -= Xmin;
//   touch_x = Y_SIZE - touch_x/((Xmax-Xmin)/Y_SIZE);
//   touch_y -= Ymin;
//   touch_y = X_SIZE - touch_y/((Ymax-Ymin)/X_SIZE);
   if(calibrate)
   {
    touch_x = Y_SIZE - touch_x/ay - by;
    touch_y = X_SIZE - touch_y/ax - bx;
   
    if(touch_x > 240) //240
     touch_x = 240;
    if(touch_y > 320) //320
     touch_y = 320;
   
    call_XPT2046(); //вот это обязательно добавлять, иначе глючит.....
   
//    *x_kor = touch_x;
//    *y_kor = touch_y;
    *y_kor = touch_x;
    *x_kor = touch_y;
   }else{
    call_XPT2046(); //вот это обязательно добавлять, иначе глючит.....
    *y_kor = touch_x;
    *x_kor = touch_y;
   }
 }
 return flag;
}
void call_XPT2046(void)
{
  CS_T_ACTIVE;
 
  tx_data[0] = 0x80;
  HAL_SPI_Transmit(&hspi1, (uint8_t*)tx_data, 1, 1000); 
  
  CS_T_IDLE;
}

Прошу прощения код писался для stm...   https://youtu.be/oAnAdO2NUCQ

Теперь работает, непонятно почему в пердыдущем посте не работала...

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Да, огромное спасибо.

Уже сделал. Только пока в функцию инициализации тача. Не знаю, почему в библиотеке примеров этого не было. Если глюки появятся в процессе работу - добавлю и в функции чтения данных. Примерно так и контроллеру уходит в режим ожидания и работает пин на прерывание:

  digitalWrite(T_CS, LOW);
  SPI.transfer(0X80);
  SPI.transfer(0X00);
  SPI.transfer(0X00);
  digitalWrite(T_CS, HIGH);

 

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

ArtemRu пишет:

Да, огромное спасибо.

Уже сделал. Только пока в функцию инициализации тача. Не знаю, почему в библиотеке примеров этого не было. ....

была мысля что вы одновременно пытаетесь пользовать аппаратный SPI для тача и для диспа. А не тест только тача - вывод в терминал координат нажатия тача.  

 В UTFT  дисп сидит на других пинах - параллельная шина или на програмном SPI . поэтому пины тача (аппаратный SPI вход выход и скорость spi) настраиваются единожды его инитом вначале программы.

 А если потом вы юзаете SPI для своих  нужд , то надо заново его инитом перенастроить (видимо от большой перенастроенной скорости  диспа SPI,  xpt2046 офигевает и глючит) . мож и настройка доп пинов SS ,... затрагивается.

если глюки какие еще будут, то сделайте хорошие короткие провода - и + до шилда диспа , желательно еще танталовый кондер повешать на питание xpt2046.

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Я скорость пока не дергаю, просто понизил до 2МГц. Когда все отлажу - для дисплея буду поднимать. Ножек у меня мало - что б каждое на свое вешать. Так что все на аппаратном SPI :)
Что б датчики подключить еще мультимплексор придется добавлять.

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

ArtemRu пишет:

..... Ножек у меня мало - что б каждое на свое вешать. Так что все на аппаратном SPI :)
Что б датчики подключить еще мультимплексор придется добавлять.

а модуль ESP32 за 400р ?   всего то 200р-250р разница с node mcu .

36 GPIO , 160 МГц , 4 SPI ,...

 

https://ru.aliexpress.com/item/ESP32-Development-Board-WiFi-Bluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP-32-ESP-32S/32799710563.html

https://geektimes.ru/post/290205/

 

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Которая в первой колонке, она 150 рублей:
https://ru.aliexpress.com/item/1PCS-Wireless-module-CH340-NodeMcu-V3-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266/32665100123.html?spm=a2g0s.9042311.0.0.QvPAIg

за 400 более продвинутая.
Для меня главный плюс - это WIFI. Если объединять потом все устройства - проводов дополнительных тянуть не надо. А питание по умолчанию у всех электрических приборов есть.

К примеру если сделать 5 розеток, пару термодатчикво. То разница в цене чувствительная. А для этих целей и первой версии за глаза.
160 рублей ESP + 50 Рублей термодатчик + 50 рублей Реле +50 рублей Блок питания, итог за 400 рублей уже термостат с удаленным контролем и управлением. Можно добавить 300-500 рублей на экран и за 800 получаем еще и локальный пульт управления. Для управления светом, можно добавить сенсорный датчик и датчик освещенности, вместо дисплея. Если Самому это паять, то можно еще снизить.
Я за децентрализацию - каждый отвечает за себя и за свою маленькую функциональную задачу. А не центральный процессор за все разом.

То что я сечас за уши к ней притягиваю много много - внешних устройств - это разово. Самому потренироваться и посмотреть, что из нее выжать можно.

 

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

150+доставка

ну можно готовые модули ESP32 все в одном  не за 400 , а за 300 найти (если 10шт для проектов брать, а там уже можно и с OLED на борту - подавляющее большинство покупок модулей esp32 именно с дисплеями на борту)

https://ru.aliexpress.com/item/10-ESP32-WiFi-Bluetooth/32832702116.html

 

ArtemRu
Offline
Зарегистрирован: 04.12.2017

Чуть выше - пост откорректировал, зачем и почему.
доставка всего 50 рублей, с увеличением количества - почти не меняется. Я 10 и брал - что бы стоимость доставки размазать.

Я не против новых модулей. ESP32 - думаю еще упадут в цене через полгода - год и до них доберусь. :)

neoblack2
Offline
Зарегистрирован: 15.04.2017

Здравствуйте, есть такой экранчик https://www.itead.cc/wiki/Arduino_3.2_TFT_LCD_Touch_Shield_V2

Как его подключить к stm32f103? Взял библиотеку https://github.com/iwalpola/Adafruit_ILI9341_8bit_STM

Показывает, но все линии ломанные какие-то, текст темный, цвета не те. Вижу что схематика у него через шинные преобразователи 74ХХ541, может они влияют? Все таки на stm32 логика 3.3 вольта. Переключатель на екране 5 - 3.3 вольта не дает ничего. Контакт RD по схеме библиотеки нету как подключить (выведен с самого екрана), он на самом дисплее на на +, думаю тут не влияет чтение данных с дисплея. Перемычка R2 - R1 результата не дает никакого.

 

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

neoblack2 пишет:

Здравствуйте, есть такой экранчик https://www.itead.cc/wiki/Arduino_3.2_TFT_LCD_Touch_Shield_V2

Как его подключить к stm32f103? Взял библиотеку https://github.com/iwalpola/Adafruit_ILI9341_8bit_STM

....

смотрите внимательней , шилд 16бит , библа для 8бит.

два варианта: 

1. нагреть плату , отклеить дисплей от платы ,  посмотреть на шлейф , составить или найти распиновку ,перевести его на 8 бит. 

2. найти либу которая может работать с 16бит , к примеру MCUFRIEND_kbv, поискать там нужный пример ,  подключить еще 8 проводов куда в ней описано . погуглить типа 16bit tft lcd stm32f103 , blue pill 16bit tft lcd,  STM32F103C8T6 16bit tft lcd / 
либа UTFT , и равно MCUFRIEND_kbv , точно работают с 16 бит . в есть MCUFRIEND_kbv поддержка stm32f4 для 16бит , и ардуин для 16бит.   с blue pill  надо искать как там и что для 16бит.

neoblack2
Offline
Зарегистрирован: 15.04.2017

slider пишет:

смотрите внимательней , шилд 16бит , библа для 8бит.

два варианта: 

1. нагреть плату , отклеить дисплей от платы ,  посмотреть на шлейф , составить или найти распиновку ,перевести его на 8 бит. 

2. найти либу которая может работать с 16бит , к примеру MCUFRIEND_kbv, поискать там нужный пример ,  подключить еще 8 проводов куда в ней описано . погуглить типа 16bit tft lcd stm32f103 , blue pill 16bit tft lcd,  STM32F103C8T6 16bit tft lcd / 
либа UTFT , и равно MCUFRIEND_kbv , точно работают с 16 бит . в есть MCUFRIEND_kbv поддержка stm32f4 для 16бит , и ардуин для 16бит.   с blue pill  надо искать как там и что для 16бит.

Дисплей имеет перемычки R2 - R1 - ничего не дало (( Не заводиться вообще в другой позиции.

utft пишет конкретно unsupported arm cpu ((((

Но ведь завелося же рисует шрифт, линии, кружочки, правда чуть крироватенькое ((

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

если не заводится в другой позиции , значит надо пробовать на других 8бит.

// ili9341 в зависимости от пинов IM , в 8бит режиме , может использовать D0-D7 или D8-15 .  Попробуйте использовать старшие биты  D8-D15 у дисплея.   

/// и так то надо фото выкладывать .  как так могут быть " линии, кружочки, чуть крироватенькое ((" непонятно

neoblack2
Offline
Зарегистрирован: 15.04.2017

slider пишет:

если не заводится в другой позиции , значит надо пробовать на других 8бит.

// ili9341 в зависимости от пинов IM , в 8бит режиме , может использовать D0-D7 или D8-15 .  Попробуйте использовать старшие биты  D8-D15 у дисплея.   

/// и так то надо фото выкладывать .  как так могут быть " линии, кружочки, чуть крироватенькое ((" непонятно

Ура, заработало! Поменял резистор и навесил на DB8-DB15 (обратить внимание что нумерация контактов на плате не в такой последовательности как на DB0-DB8 - тоесть просто внимательно подключать). Библиотека 8 бит (проводов подключения конечно намного меньше чем на 16) +  скорость намного выше чем на 16 бит на ардуино мега.

 

 

fusard
Offline
Зарегистрирован: 28.06.2020

Здравствуйте!

Имею 3.2" TFT сенсорный дисплей ILI9341 34-pin

в сети накопал такое http://www.lcdwiki.com/3.2inch_16BIT_Module_ILI9341_SKU:MRB3205 +
Картинка там прямо копия моей и совпадает MRB3205.

В прилагавшемся софте есть ссылка сюда https://github.com/Bodmer/TFT_HX8357

Прошу подсказать куда копать на тему подключения к Arduino Due.
C самой Arduino небольшой опыт есть.

Kazanova
Offline
Зарегистрирован: 29.01.2015

Приветствую!  Удалось запустить дисплей от ардуины ? 

aragorn1125
Offline
Зарегистрирован: 07.03.2022

Всем привет! есть дисплей на ILI9488 залил прошивку в арудино мега, как сказанно на 1 странице. после прошивки дсиплей на очень короткое вермя запускает программу и отключается(белый экран) при нажатии кнопки ресет на меге все повторяется. не могу понять в чем косяк. Помогите разобраться

aragorn1125
Offline
Зарегистрирован: 07.03.2022

пару лет назад этот дисплей отлично работал в той же связки с мегой. информационные пины нагружены резисторами 10к

MarcusTroy
Offline
Зарегистрирован: 29.05.2022

кто использовал дисплей указанный на форуме. Подскажите как его подключить к nucleo(stm32)  и посоветуйте годную библиотеку для работы с данным дисплеем.

 

Rankle
Offline
Зарегистрирован: 31.10.2020

fusard пишет:

Здравствуйте!

Имею 3.2" TFT сенсорный дисплей ILI9341 34-pin

в сети накопал такое http://www.lcdwiki.com/3.2inch_16BIT_Module_ILI9341_SKU:MRB3205 +
Картинка там прямо копия моей и совпадает MRB3205.

В прилагавшемся софте есть ссылка сюда https://github.com/Bodmer/TFT_HX8357

Прошу подсказать куда копать на тему подключения к Arduino Due.
C самой Arduino небольшой опыт есть.

Добрый день. (Понимаю что два года назад было это сообщение ). Fusard удалось подключить и запустить LCD?

 А может у кого другого получилось? Если да, то с какой библиотекой он заработал на Ардуино Мега

Подскажите пожалуйста.

 

fusard
Offline
Зарегистрирован: 28.06.2020

Rankle пишет:
Добрый день. (Понимаю что два года назад было это сообщение ). Fusard удалось подключить и запустить LCD?
А может у кого другого получилось? Если да, то с какой библиотекой он заработал на Ардуино Мега

Подскажите пожалуйста.


Я не доделал, ушел на ESP32, там проблема общения с контроллером решилась другим способом, для меня более эффективным.

Rankle
Offline
Зарегистрирован: 31.10.2020

Хорошо, тогда прошу помощи у тех, кто может помочь запустить этот модуль на Ардуино Мега (см. фото)

Писал продавцу. Он отписался технической документацией на этот дисплей.

Я в этой ветке выше видел сообщения, но когда начал разбираться, не понял - несоответствие пинов в разъёмах.

Т.е. RS предлагается подключить на Т0, CS на RD, WR - на ALE (кстати что это за пин. не нашел пока ничего) и RST на WR. Это верно?

Может для работы нужны шилды типа таких:

.

Далее, закачал библиотеку на ILI9341

Вот пример скетча

/*  Demo of draw circle's APP
    drawCircle(int poX, int poY, int r,INT16U color);
    fillCircle(int poX, int poY, int r,INT16U color);
*/

#include <stdint.h>
#include <TFTv2.h>
#include <SPI.h>

void setup()
{
    TFT_BL_ON;                                          //turn on the background light 
    
    Tft.TFTinit();                                      //init TFT library             

    Tft.drawCircle(100, 100, 30,YELLOW);                //center: (100, 100), r = 30 ,color : YELLOW              
    
    Tft.drawCircle(100, 200, 40,CYAN);                  // center: (100, 200), r = 10 ,color : CYAN  
    
    Tft.fillCircle(200, 100, 30,RED);                   //center: (200, 100), r = 30 ,color : RED    
    
    Tft.fillCircle(200, 200, 30,BLUE);                  //center: (200, 200), r = 30 ,color : BLUE                 
}

void loop()
{

}

/********************************************************************************
  END FILE
*********************************************************************************/

 

А где создание объекта TFT с указанием сответствующих пинов? А как быть с ТачСкрином?

Помогите пожалуйста разобраться с этим Twix-ом?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Rankle пишет:

 

Может для работы нужны шилды типа таких:

Может, и такие.

Или подобные - изготовленные самостоятельно.

Очевидно лишь, что напрямую этот дисплей к разъему Меги подключить нельзя.

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Добрый день.

имеется стекляшка с сенсором OPEN-Smart 3.2 LCD ILI9329

https://aliexpress.ru/item/32755473754.html?_randl_shipto=RU&gatewayAdap...

Подключал к UNO и к MEGE2560

Проблема в том, что при установленной стекляшке на плате контроллера - не работает сериал порт. 

попытка зашить скетч - заканчивается таймаутом.

если скетч уже залит - то нет от него ни чеко в мониторе порта.

Если дисплей снимать - все заливается норм, а при подключении стекляшка демонстрирует цветное демо.

Вопрос - как подружить SerialPort и этот LCD?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

слот SD карты у вас в какую сторону направлен?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DonVorlon пишет:

Вопрос - как подружить SerialPort и этот LCD?

Для начала прозвоните, соединены ли с чем пины D0 и D1.

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Если установить стекляшку на мегу то слот карты между разъемом УСБ и разъемом питания меги

DonVorlon
Offline
Зарегистрирован: 24.03.2016

andriano пишет:

DonVorlon пишет:

Вопрос - как подружить SerialPort и этот LCD?

Для начала прозвоните, соединены ли с чем пины D0 и D1.

 

прозвонка - не показала контакта с другими элементами (но и добраться смог не до всех)

выпаял пины D0 и D1 у стекляшки - ничего не изменилось. При подключенном модуле - загрузка не происходит.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

нажатие кнопки резет в начале загрузки не пробовали?

DonVorlon
Offline
Зарегистрирован: 24.03.2016

ua6em пишет:

нажатие кнопки резет в начале загрузки не пробовали?

удивительное дело - но помогло. Спасибо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну тогда еще проверить пин Reset (и при необходимости выпаять).

DonVorlon
Offline
Зарегистрирован: 24.03.2016

andriano пишет:

Ну тогда еще проверить пин Reset (и при необходимости выпаять).

влияние оказывал пин AREF

но без него дисплей не запускается.

Venus-T
Offline
Зарегистрирован: 19.10.2022

Добрый день. 

Столкнулся с проблемой по подключению и инициализации LCD open-smart ILI9329. После подключения к arduino MEGA выдает белый экран, что бы не делал. Экраны заказывал с aliexpress в количестве 5шт. и у всех одна и та же проблема.

Может кто даст дельный совет как заставить его работать?

Может есть готовая библиотека (набор библиотек с уже рабочего макета)?

b707
Offline
Зарегистрирован: 26.05.2017

Venus-T пишет:

После подключения к arduino MEGA выдает белый экран, что бы не делал.

белый экран - это неверная инициализация. На али под обозначением ILI9329. могут продавться экраны с самыми разными контроллерами.

Какую библиотеку вы используете? Попробуйте пример тестирования дисплея из библиотеки MCU-friend. Кстати, ее автор доступен в сети, будут проблемы, можно будет у него напрямую спросить

DonVorlon
Offline
Зарегистрирован: 24.03.2016

Появление белого экрана это странный момент. дисплей может стабильно работать, а потом вдруг только бледнеть пару дней. Библиотеки при этом не меняю. 

Хотя, стабильность тоже относительная... иногда после заливки скетча - меняет ориентацию и цветопередачу... желтый становится прикольно фиолетовым. лечится отключением питания. я думаю, дело тут в том, что перед заливкой, ардуина перезагружается, а контроллер дисплея подвисает на это время в растерянности.