Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 22
1

Display image in 240x_320x_ILI9341_SPI atmega8

09.06.2020, 20:35. Просмотров 280. Ответов 9

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

C++
1
const unsigned char gImage_123[] PROGMEM = { //Картинка в формате Hex //}
Компилированая в HEX через прогу Image2Lcd.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void ILI9341_Draw_Image(const char *Image_Array,int x, int y, int With, int Height)
{
    
        unsigned int i; //Для цикла
        unsigned char c1; //Для отправки
        
        LCD_SetCursorPosition(x, y, x + With-1, y + Height-1); // Задаю координаты
        
        TFT9341_SendCommand(0x2c);  // write to RAM
            DC_HIGH; //дергаем ножку записи(хотя, что она есть, что её нету)
        
            for(i=0;i < (With * Height);i++)// Главный цикл
        {
            
            
    c1 = pgm_read_word(&(*Image_Array++)); 
 
TFT9341_SendData(c1 >> 8);// И почему-то всегда выводится в синем оттенке, 
//при уменьшении цифры 8 - картинку не узнать.
 
TFT9341_SendData(c1);
            
            
            
        }
        
 
}
И если кто думает, что проблема в функции TFT9341_SendData(), то вот и она:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void TFT9341_SendData(unsigned char data)
{
  DC_HIGH; //дергаю соответствующую ножку 
  CS_LOW;
  SPI_MasterTransmit(data); 
  CS_HIGH;
}
 
int SPI_MasterTransmit(unsigned char cData){
  
  SPDR = cData;
  
  while (! (SPSR & ( 1 << SPIF)));
  return  SPDR; 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2020, 20:35
Ответы с готовыми решениями:

Tkinter display image
как правильно сделать чтобы картинка при каждом клике по кнопке не снижалась ? Код # coding:...

come Display This video mode change computer display input to 1240 x .... 60hz
Здравствуйте, у моего знакомого полетел компьютер,пожалуйста помогите его вернуть к жизни,очень...

Cannot display this video mode,change computer display input to 1024x768 60 HZ
Компьютер стабильно работал,и внезапно появился черный экран на котором написано &quot;Cannot display...

Как отобразить скрытые элементы HTML(css-display:none;) используя JS!(display:block;)
&lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; ...

9
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,263
10.06.2020, 12:14 2
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
И если кто думает, что проблема в функции TFT9341_SendData(), то вот и она:
если эта же функция используется в инициализации дисплея и работает там нормально, дело точно не в ней.
Если бы еще знать что за артефакты и правильно ли сгенерирован массив.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
10.06.2020, 13:07 3
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
unsigned char c1;
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
c1 >> 8
после сдвига здесь будет 0
для ILI9341 нужны 16 битные данные
следовательно
C
1
uint16_t c1;
и посмотри раскладку цветов RRRRRGGG GGGBBBBB
то что выделено своим сдвигом ты уничтожаешь
и получаем 00000000 GGGBBBBB
вот тебе и
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
// И почему-то всегда выводится в синем оттенке,
Добавлено через 1 минуту
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
pgm_read_word
название функции как бы предполагает работу со словами(16 бит) а не с байтами(8 бит)
1
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 22
10.06.2020, 13:48  [ТС] 4
pgm_read_word я ставил, результатов это никаких не дало
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
10.06.2020, 14:08 5
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
pgm_read_word я ставил,
куда?
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
результатов это никаких не дало
а каких результатов ты хочешь, если переменная у тебя 8 бит, а нужно 16

Добавлено через 2 минуты
Read a word from the program space with a 16-bit (near) address
отсюда
https://www.nongnu.org/avr-lib... 3ba3e1fa07
0
2512 / 1557 / 335
Регистрация: 09.09.2017
Сообщений: 6,263
10.06.2020, 15:22 6
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
pgm_read_word я ставил, результатов это никаких не дало
Верно, читали вы 16 бит, но хранили потом в 8-битной переменной, вам на это "тонко намекают".
0
1778 / 1108 / 109
Регистрация: 04.01.2010
Сообщений: 3,885
10.06.2020, 15:51 7
...при беглом изучении ДШ (стр.55) экран может работать в двух режимах - 16(5-6-5)бит на пиксель, и 18(6-6-6)бит.

Соответственно, вопрос - какой режим у вас выставлен в инициализации, и какой режим вы предполагаете при преобразовании картинки?
PS: для удобства сгенерируйте градиент на экране, по каждому из цветов, чтобы и вы (и мы) убедились, что вы понимаете о чем идет речь.
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 22
10.06.2020, 16:44  [ТС] 8
C++
1
TFT9341_SendData(0x55);//16bit
Это в инициализации дисплея, я исправил переменную на uint16_t c1;
Теперь это выглядит вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ILI9341_Draw_Image(const char *Image_Array,int x, int y, int With, int Height)
{
    
        unsigned int i;
        uint16_t c1;
        
        LCD_SetCursorPosition(x, y, x + With-1, y + Height-1);
        
        TFT9341_SendCommand(0x2c);  // write to RAM
       
        
        for(i=0;i < (With * Height );i++)
        {
            
            
            c1 = pgm_read_word(&(*Image_Array++));
            TFT9341_SendData(c1 >> 8);
                    TFT9341_SendData(c1);
 
            
        }
        
 
}
Но все равно картинка выводится не корректно
0
Миниатюры
Display image in 240x_320x_ILI9341_SPI atmega8   Display image in 240x_320x_ILI9341_SPI atmega8  
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
10.06.2020, 17:06 9
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
я исправил переменную на uint16_t c1;
а здесь
Цитата Сообщение от Kostyanskiy Посмотреть сообщение
const char *Image_Array
и в каком формате лежат данные в Image_Array
0
0 / 0 / 0
Регистрация: 04.01.2020
Сообщений: 22
10.06.2020, 17:27  [ТС] 10
Всё заработало, благодарю вас, я переставил
C
1
 void ILI9341_Draw_Image(const char *Image_Array,int x, int y, int With, int Height)
на
C
1
void ILI9341_Draw_Image(uint16_t *Image_Array,int x, int y, int With, int Height)
и все заработало
0
Миниатюры
Display image in 240x_320x_ILI9341_SPI atmega8  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2020, 17:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

CMA Vestel WM-P1247 Display, Пишет END -display
на все программы сразу пишет END на дисплее Когда вы кладете программное обеспечение с WM-P1047,...

Как исправить ошибку cannot display this video mode change computer display input 1280*1024@60hz
Привет!!!Помогите пожалуста!!!!!!!!! Стала изменять расширение экрана, изменила,компьютер попросил...

Замена display:none; на display:block; при нажатии
Приветствую всех! Мои познания в JavaScript очень слабы, поэтому буду благодарен за любую помощь....

SlideUp() и slideDown() без display: block и display: none
Как сделать так чтобы при вызове slideUp() или slideDown() не назначался их display. Я просто хочу...

Разница между ATMEGA8-16AI и ATMEGA8-16AU
Кто подскажет, в чем разница между ATMEGA8-16AI и ATMEGA8-16AU. Смотрю в Платане цены между ними...

display block display none onclick
когда я нажимаю на слово hello, с низу появляются новые слова. Я хочу, чтоб когда нажимать на слове...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.