Обсуждаем контроллеры компании Atmel.
Ответить

ILI9341 то ли я .... то ли лыжи не едут !!!!

Сб фев 09, 2019 20:48:09

Здравствуйте уважаемые форумчане!
Приобрел на Али ILI9341 2,8 SPI 240*320 будь он не.....
Решил немного вспомнить молодость да слепить контролер теплого пола да вот с экраном какие то несросты
Оцените мож че подскажите, все делаю по даташиту а он молчит
Код:
/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 03.02.2019
Author  :
Company :
Comments:


Chip type               : ATmega8A
Program type            : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/

#include <mega8.h>
#include <delay.h>

// Declare your global variables here
unsigned long int k;
// SPI functions
#include <spi.h>


#define CS1             PORTD |= (1<<5)     //
#define CS0             PORTD &= ~(1<<5)    //

#define RESET1          PORTD |= (1<<6)     //
#define RESET0          PORTD &= ~(1<<6)    //

#define DC1             PORTD |= (1<<7)     //
#define DC0             PORTD &= ~(1<<7)    //



void Wr_comm (volatile unsigned char comm)         //функция записи команды
{
   DC0;
   spi(comm); 
   
   //while(!(SPSR & (1<<SPIF)));
   DC1;
   
}

void Wr_param (volatile unsigned char param)         //функция записи параметра
{
   spi(param);
     
}

void Wr_data (volatile unsigned int data)         //функция записи параметра
{
   spi(data>>8);
   spi(data);
   
}


void Init_ili (void)         //функция инициализации
{
   
  RESET0;
   delay_us(15);     //15микросекунд
   RESET1;
    CS0;
   delay_ms(120);
   Wr_comm(0x01);
   delay_ms(120);     
   

   
   
 
   Wr_comm(0x3A); //установка 16 бит цвета Pixel Format Set или COLMOD 
   Wr_param(0x55); //установка 16 бит
   Wr_comm(0x11); //Sleep OUT (код – 0x11)выводит ILI9341 из состояния сна
   delay_ms(130);               //120милисекунд
   Wr_comm(0x29); //Display ON (код – 0x29) – подключение дисплея к ОЗУ
   delay_ms(130);

   Wr_comm(0x2C); 
   for (k=0;k<76800;k++)
   {
      Wr_data(0x07E0);
   
    }
    CS1;
}




void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=In Bit3=Out Bit2=Out Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=T Bit3=0 Bit2=0 Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR=(0<<SPIE) | (1<<SPE) | (0<<DORD) | (1<<MSTR) | (0<<CPOL) | (0<<CPHA) | (1<<SPR1) | (0<<SPR0);
SPSR=(0<<SPI2X);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
RESET1;CS1;DC1;
delay_ms(300);
Init_ili();

while (1)
      {
      // Place your code here

      }
}

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Сб фев 09, 2019 22:06:58

1. покажите схему подключения дисплея
2. контроллер дисплея не понимает сигналы управления напряжением 5 вольт. Только 3,3 вольта.
3. СПИ для этого контроллера можно инициализировать на максимальной скорости - 1/2 от тактовой. Это быстрый контроллер.
4. Поставьте кварц 16 МГц, чисто ради скорости отрисовки.
5. Я не знаю, что внутри функции spi(data). На всякий случай - отправку слова в дисплей делал вот так:
Код:
   // отправка 2 байт в дисплей по SPI
   void sendWordILI9341(unsigned int wordToSend) {
      SPDR = wordToSend >> 8;
      while((SPSR & (1<<SPIF)) == 0);
      SPDR = wordToSend & 0xFF;
      while((SPSR & (1<<SPIF)) == 0);
   }

Т.е. прежде чем отправлять второй байт, нужно дождаться, пока отправится первый.
6. Инициализация дисплея более сложная, я для своей библиотеки ее подсмотрел у EAX'а

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Вс фев 10, 2019 13:03:04

схема стандартная ILI9341 mega 8
1 VCC +5 v (на плате стабилизатор 3,3v)
2GND GND
3 CS PD5
4 RESET PD6
5 DC PD7
6 SDI MOSI
7 SCK SCK
8 LED 470 ом +3,3V
9 SDO MISO
сейчас попробую перевести логические входы на 3,3 v (поставлю делители)

SPI так и работает как вы написали
спасибо

Добавлено after 4 minutes 48 seconds:
УРААААА!!!!
перевел на 3,3 и все заработало

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Вс фев 10, 2019 15:27:15

ну покопайте еще вот эту тему, я там свою версию либы выкладывал.... Там инициализация подробно выписана, которую я потянул у ЕАКС.МИ

Добавлено after 5 minutes 35 seconds:
broocks писал(а):8 LED 470 ом +3,3V

Почитайте доку на ваш дисплей либо попробуйте отследить по плате, куда идет управление подсветкой. (либо подайте туда 3.3 вольта через миллиамперметр).
На моем дисплее вход подсветки - логический, втекающий от 3.3 вольт ток - в районе 1 миллиампера. На плате там стоит свой транзистор, управляющий подсветкой. И я на вход подсветки завел ШИМ от МК и регулирую яркость подсветки программно.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Вс фев 10, 2019 17:51:40

Да я тоже так подумываю если место для кода останется
теперь разбираюсь со шрифтами

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Вс фев 10, 2019 18:29:44

Со шрифтами полный аллес.
У меня дисплей 320*240 2,4".
Нормально читается шрифт 12*20.
10*16 - еще нормально читается, но уже мелковат для 2.4"
Изображение
Температура слева вверху - 10*16, все остальное 12*20

Аллес вот в чем - шрифт с кириллицей - это 168 символов.
Изображение
12*20 = 240 бит или 30 байт на символ, 168 символов - это 5040 байт - почти 5 кб данных.
10*16 - 160 бит или 20 байт на символ, 168*20 = 3360 байт или 3,3 кб.
А у вас всего 8 кб в меге.
Тут уже или меняйте на мегу 328, если плата уже готова, или смотрите в сторону меги32.
Мой проект часов с календарем и будильниками на таком дисплее с трудом вместился в мегу32 (там кроме шрифтов еще и растровые картинки есть). Сейчас обсуждаем в соседней ветке переход на мегу128, что бы вместить все хотелки.

Добавлено after 8 minutes 2 seconds:
У вас дисплей 2.8" - вам и 10*16 пойдет.

В спойлере - заготовка шрифта 10*16 - тут идет 2 байта на строку, 15 строк (шестнадцатую строку-разделитель между строками нужно самому предусмотреть).
Можно использовать шрифт как есть - но этот массив займет 30*168=5040 байт. Если заморочиться и сделать хранение шрифта как поток бит - и хранить только 9*15 пикселей, а межстрочный и межсимвольный интервал предусматривать программно - то шрифт ужимается в 9*15=135 бит или 17 байт, 168 символов - это 2856 байт.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 18:05:33

Крутой проект если не сложно скинь исходник
У меня попроще - граф экран + тач на нем часы и управление температурой теплых полов во всей квартире, связь по nRF24L01 5 абонентов, датчик температуру по I2 , силовая часть симистор.
на счет меги 8 еще не определился может че и побольше
а вот шрифты у меня разные, но латиница мне не нужна

Добавлено after 40 seconds:
broocks@yandex.ru

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 18:18:36

исходник в вашем проекте не поможет, сильно разные проекты

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 18:35:51

меня интересует только отображение шрифтов и часы реального времени

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 19:06:13

во вложении - графическая библиотека. шрифты, линии, прямоугольники, окружности, спрайты.

по часам - часы сделаны на ds3231, подключаются по i2c.
Вложения
GraphLib.zip
(39.16 KiB) Скачиваний: 308

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 19:47:32

сложновато
если такая библиотека то я точно в 8 -ку не влезу
я хочу создать библиотеку только тех символов которые буду отображать

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 20:09:05

так а кто заставляет вам всю библиотеку использовать ?

Отколупайте нужные вам фрагменты.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 20:35:58

во вложении - графическая библиотека. шрифты, линии, прямоугольники, окружности, спрайты.

Допустим есть шрифт 12x20, что требуется для отрисовки одного символа? Задаем в нужном месте окно 12x20, шлем команду начала отрисовки, затем перебираем в цикле 30 байт(240 бит), если бит включен то шлем два байт одного цвета, иначе другого, при этом если у нас работа идет по SPI, то RS достаточно установить один раз для всех 30 байт. Итого общее количество отправляемых байт равно 22 + 30*2 = 82. У тебя в либе цикл по высоте, внутри него вложено еще два цикла, один из них по ширине, второй вообще непонятно для чего... Внутри цикла по ширине проверяются биты и вызывается функция рисующая точку, с 5-ю параметрами. Функция тяжелая и вызывается много где, так что шансы на инлайн не такие и высокие. Для отрисовки точки нужно отправить на дисплей 11 * 2 байт, перед каждой парой байт выставить RS и еще эта пара обрамляется двумя установками CS, для чего нужно дождаться фактической передачи данных. Более того, это все происходит не в самой функции вывода точки, она эту работу переадресует функции заливки области, опять же передавая 5 параметров. Еще и в зависимости от ориентации экрана точки рисуются по-разному замедляя все еще больше, хотя этого тоже можно избежать... Итого только если подсчитать количество передаваемых на дисплей байт, то оно больше в 30 * 22 / 82 = 8 раз, а если учесть все остальное, то медленнее может быть и раз в 20...
Остальное так же рисуется, даже вертикальные и горизонтальные линии рисует по одной точке, хотя чем таким принципиальным отличается линия от прямоугольной области, которая заливается гораздо быстрее? Ничем, это прямоугольник единичной высоты или ширины.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:07:47

Reflector, за все надо платить.
Библиотека не знает, какой у нас дисплей. И будет работать даже с монохромником от нокии 84*48 пикселей.
Библиотека умеет выводить текст в разных направлениях и с возможностью отзеркаливания по двум координатам.
Если выкинуть возможности вращения (надо, кстати, об этом подумать и сделать через условную компиляцию), то символ в режиме FONT_BIT_FLOW можно будет выводить заданием области символа и далее, потоком гнать биты.

По линиям - если вы внимательно смотрели код, то там горизонтальные и вертикальные линии умеют так же рисоваться в потоковом режиме - смотрите дефайн DISPLAY_USE_AREA.

И да, человек попросил исходники - он их получил.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:25:01

Reflector, за все надо платить.
Библиотека не знает, какой у нас дисплей. И будет работать даже с монохромником от нокии 84*48 пикселей.

Во-первых, что-то я там не то насчитал :) Должно быть 22 + 12*20*2 = 502 байта в первом случае и 22 * 12*20 = 3168 во-втором, т.е. разница в 6.3 раза.
Во-вторых, у меня в либе поддержка 5 разных дисплеев, у каждого 4 ориентации и в любой из них рисование линий или текста одинаковое, отличие только в инициализации или функции установки окна. С монохромным она конечно не работает, но это уже совсем другой тип дисплеев, там можно весь экран в памяти держать, тем более я работаю с STM32 и там этой памяти много.

Библиотека умеет выводить текст в разных направлениях и с возможностью отзеркаливания по двум координатам.

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

По линиям - если вы внимательно смотрели код, то там горизонтальные и вертикальные линии умеют так же рисоваться в потоковом режиме - смотрите дефайн DISPLAY_USE_AREA.

Это я проглядел, но можно еще в разы ускорить рисование и наклонных линий...

И да, человек попросил исходники - он их получил.

С одной стороны да, а с другой потом и он с кем-то поделится и в итоге получается, что большинство умеющих хождение либ медленно рисуют символы по точкам :)
Последний раз редактировалось Reflector Пн фев 11, 2019 21:45:00, всего редактировалось 1 раз.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:41:31

Reflector, ну если так пошло, то считать надо не байтами, а словами. Ибо дисплей 16-битный. (И да, я считаю, что по SPI на аврках командовать такими дисплеями грустно, даже на СТМках грустновато, но там спасает ДМА).
Задание области вывода - 5 слов, 2 слова - вывод одного пикселя. Итого 7 слов на пиксель.
Шрифт 12*20: один символ = 240 пикселей. 240 * 7 = 1680 слов.

Это если попиксельно. Если через область вывода - 5 слов - задание области, команда перехода в выовд цветовых данных - одно слово, 240 слов цвета пикселей. Итого 246 слов. Я написал, что попробую пересмотреть (когда будет время) вывод символа через область. Ценой отказа от зеркалирования и поворота. Ибо иначе математика сожрет все преимщества потокового вывода цвета.

И да, вы можете предложить топикстартеру свою библитоеку на 5 дисплеев. Я не претендую на истину в последней инстанции....

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:56:51

ну если так пошло, то считать надо не байтами, а словами. Ибо дисплей 16-битный. (И да, я считаю, что по SPI на аврках командовать такими дисплеями грустно, даже на СТМках грустновато, но там спасает ДМА).
Задание области вывода - 5 слов, 2 слова - вывод одного пикселя. Итого 7 слов на пиксель.
Шрифт 12*20: один символ = 240 пикселей. 240 * 7 = 1680 слов.

Я ориентировался по твоей SPI либе, там задание окна такое:

Где каждая из 11 функций в итоге вызывает sendWordILI9341(), которая остылает 2 байта, итого 11 слов. Кстати, вывод самих данные цвета то я не посчитал, будет 24 * 12*20 = 3456.

И да, вы можете предложить топикстартеру свою библитоеку на 5 дисплеев. Я не претендую на истину в последней инстанции....

Он в твоей не особо ориентируется, а моя на С++17, для STM32 и тянет за собой еще другие мои либы :)
Последний раз редактировалось Reflector Пн фев 11, 2019 21:57:27, всего редактировалось 1 раз.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:57:13

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


Если завязваться на команду MADCTL - теряется универсальность либы.

И да, на брудершафт мы вроде не пили...

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 21:59:20

Если завязваться на команду MADCTL - теряется универсальность либы.

MADCTL же для чтения? Я ничего не говорил про чтение.
А, это просто чтение режимов... Их не нужно читать, при необходиомсти их нужно заново выставлять.

Re: ILI9341 то ли я .... то ли лыжи не едут !!!!

Пн фев 11, 2019 23:16:24

не-а. MADCTL - регистр, как раз отвечающий за направление записи данных в видеопамять дисплея.
Запись в регистр - команда 0x36, чтение этого регистра - 0x0B.

И да, вы правы, я сейчас глянул ДШ - задание окна у ILI9341 оперирует восьмибитными аргументами.
Т.е. для задания окна надо отправить 10 слов, значимые у которых будут только младшие байты.
Так что в либе все верно.

А по сложностям библиотек.... тут или делать универсальность, либо затачивать под каждый дисплей отдельную библиотечку.
По тексту - я заморочился, мне повернутый текст нужен был в другом проекте. Поэтому он у меня и появился.
Если просто выводить текст - я там выше выкладывал дамп несжатого шрифта. Автор дисплей запустил.
Инициализацию, команды задания области и отправки цвета пикселя может подсмотреть - и нарисовать своё.
Судя по тому, что у человека реализованы
broocks писал(а):часы и управление температурой теплых полов во всей квартире, связь по nRF24L01 5 абонентов, датчик температуру по I2

- это явно не ардуино-стайл с воплями "напишите мне скетч".
Посмотрит и напишет своё. Код там простой.

Я тоже свою либу не писал в одну харю. Линия и окружность - алгоритм Брезенхема с вики...
Ответить