Перейти к содержанию

ST7789 пишу библиотеку


Kostyanskiy

Рекомендуемые сообщения

Здравствуйте, пишу либу для ST7789 проблемы с инициализацией, помогите пожалуйста.

Вот код

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
//==========================================================================================
#define RGB565(r, g, b)         (((r & 0xF8) << 8) | ((g & 0xFC) << 3) | ((b & 0xF8) >> 3))
#define RGB16(color) (unsigned int)(((color&0xF80000)>>8)|((color&0x00FC00)>>5)|((color&0x0000F8)>>3))
//==========================================================================================
#define DDR_DC	    DDRB	// Порт на котором будет DC
#define DDR_RES		DDRB	// Порт на котором будет RES
//==========================================================================================
#define PORT_DC     PORTB	// Порт на котором будет DC
#define PORT_RES	PORTB	// Порт на котором будет RES
//==========================================================================================
#define LCD_DC 1    //Command/Data
#define LCD_RESET 2 //LCD Reset
#define LCD_MISO 4
#define LCD_MOSI 3
#define LCD_SCK 5
//==========================================================================================
#define DC_HIGH        PORT_DC |=  (1<<DC);
#define DC_LOW         PORT_DC &=~ (1<<DC);
#define RESET_HIGH     PORT_RES |=  (1<<RES);
#define RESET_LOW      PORT_RES &=~ (1<<RES);
//==========================================================================================
void SPI_Init()
{
	DDRB |=  (1<<LCD_SCK)|(1<<LCD_MISO)|(1<<LCD_MOSI);
	DDR_DC |= (1<<LCD_DC);
	DDR_RES |= (1<<LCD_RESET);
	PORT_DC &=~(1<<LCD_DC);
	
	SPCR |= (1<<SPE)|(1<<MSTR);// 8MHz/2
	SPSR |= (1<<SPI2X);
}
//==========================================================================================
void ST7789_SendData(char Data)
{
	DC_HIGH;
	SPDR = Data;
	while (! (SPSR & ( 1 << SPIF)));
	
}
//==========================================================================================
void ST7789_SendCommand(char Data)
{
	DC_LOW;
	SPDR = Data;
	while (! (SPSR & ( 1 << SPIF)));
	
}
//==========================================================================================
void ST7789_Init()
{
		// Инициализация SPI
		SPI_Init();
		_delay_ms(100);
		RESET_HIGH;
		_delay_ms(100);
		RESET_LOW;
		_delay_ms(100);
		ST7789_SendCommand(0x01);
		_delay_ms(100);
		
		ST7789_SendCommand(0x3A);
		ST7789_SendData(0x50);
		ST7789_SendData(0x05);
		_delay_ms(10);
		ST7789_SendCommand(0x11);  
		_delay_ms(10);
		ST7789_SendCommand(0x36);
		ST7789_SendData(0x20);
		ST7789_SendData(0x08);
		ST7789_SendData(0x10);
		ST7789_SendData(0x04);
	    _delay_ms(10);
		ST7789_SendCommand(0x21);
		ST7789_SendCommand(0x29);
		_delay_ms(10);
}

 

Изменено пользователем Kostyanskiy
Ссылка на комментарий
Поделиться на другие сайты

14 минут назад, hasl сказал:

Возьмите либу от ардуино на данное железо и посмотрите, что делаете не так

В том то и проблема, что в либу под ардуино писали индусы, и там ничего не понятно.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 часов назад, Kostyanskiy сказал:

либу под ардуино писали индусы, и там ничего не понятно.

на индусском языке, что ли?

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 часов назад, Kostyanskiy сказал:

В том то и проблема, что в либу под ардуино писали индусы, и там ничего не понятно.

Не страшно что индусы! Берете их поделие и строчка за строчкой приводите к человеческому виду. Потом рефакторинг чтобы выкинуть ту часть библиотеки, которая посвящена восхвалению Кришны (по желанию можно заменить на восхваление Ктулху или Омниссии), рисованию логотипа производителя или другие не относящиеся к делу куски.

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

 Я так делал для ili9341, e-ink'ов и какого-то дисплея от телефона.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

17 часов назад, Kostyanskiy сказал:

писали индусы, и там ничего не понятно

И это говорит человек, который застрял уже на инициализации :) У них он хоть работает...
Покажите этот индусский код, который Вам непонятен. И скажите, что конкретно в нём не понятно.

Ссылка на комментарий
Поделиться на другие сайты

20 часов назад, Kostyanskiy сказал:

проблемы с инициализацией,

И в чем проблема?

 

18 часов назад, Kostyanskiy сказал:

там ничего не понятно.

https://github.com/ananevilya/Arduino-ST7789-Library/blob/master/Arduino_ST7789.cpp чего тут непонятного? Весь инит свели в массив, причем каждая строка подписана. В чем проблема то? Не нравится ардуйня, вот либа под stm https://github.com/Floyd-Fish/ST7789-STM32/blob/master/ST7789/st7789.c Тут инит вообще красиво сделан, понятнее уже некуда.

Ссылка на комментарий
Поделиться на другие сайты

 

21.07.2021 в 14:53, Alex сказал:

Покажите этот индусский код, который Вам непонятен. И скажите, что конкретно в нём не понятно.

static const uint8_t PROGMEM
  cmd_240x240[] = {                 		// Initialization commands for 7789 screens
    10,                       				// 9 commands in list:
    ST7789_SWRESET,   ST_CMD_DELAY,  		// 1: Software reset, no args, w/delay
      150,                     				// 150 ms delay
    ST7789_SLPOUT ,   ST_CMD_DELAY,  		// 2: Out of sleep mode, no args, w/delay
      255,                    				// 255 = 500 ms delay
    ST7789_COLMOD , 1+ST_CMD_DELAY,  		// 3: Set color mode, 1 arg + delay:
      0x55,                   				// 16-bit color
      10,                     				// 10 ms delay
    ST7789_MADCTL , 1,  					// 4: Memory access ctrl (directions), 1 arg:
      0x00,                   				// Row addr/col addr, bottom to top refresh
    ST7789_CASET  , 4,  					// 5: Column addr set, 4 args, no delay:
      0x00, ST7789_240x240_XSTART,          // XSTART = 0
	  (ST7789_TFTWIDTH+ST7789_240x240_XSTART) >> 8,
	  (ST7789_TFTWIDTH+ST7789_240x240_XSTART) & 0xFF,   // XEND = 240
    ST7789_RASET  , 4,  					// 6: Row addr set, 4 args, no delay:
      0x00, ST7789_240x240_YSTART,          // YSTART = 0
      (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) >> 8,
	  (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) & 0xFF,	// YEND = 240
    ST7789_INVON ,   ST_CMD_DELAY,  		// 7: Inversion ON
      10,
    ST7789_NORON  ,   ST_CMD_DELAY,  		// 8: Normal display on, no args, w/delay
      10,                     				// 10 ms delay
    ST7789_DISPON ,   ST_CMD_DELAY,  		// 9: Main screen turn on, no args, w/delay
    255 };                  				// 255 = 500 ms delay

Вот это можете мне пояснить, может я чего то не понимаю, ну, я и поэтому пришел сюда.

21.07.2021 в 13:26, COKPOWEHEU сказал:

Не страшно что индусы! Берете их поделие и строчка за строчкой приводите к человеческому виду. Потом рефакторинг чтобы выкинуть ту часть библиотеки, которая посвящена восхвалению Кришны (по желанию можно заменить на восхваление Ктулху или Омниссии), рисованию логотипа производителя или другие не относящиеся к делу куски.

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

Хаха, спасибо за совет, этим уже занимаюсь 

Ссылка на комментарий
Поделиться на другие сайты

21.07.2021 в 13:26, COKPOWEHEU сказал:

Не страшно что индусы! Берете их поделие и строчка за строчкой приводите к человеческому виду. Потом рефакторинг чтобы выкинуть ту часть библиотеки, которая посвящена восхвалению Кришны (по желанию можно заменить на восхваление Ктулху или Омниссии), рисованию логотипа производителя или другие не относящиеся к делу куски.

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

Хаха, спасибо за совет, уже получилось, вот результат

void ST7789_Init()
{
		SPI_Init();		
		
		RESET_HIGH;
		_delay_ms(200);
		RESET_LOW;
		_delay_ms(200);
		RESET_HIGH;
		
		ST7789_SendCommand(0x01);//Software Reset
		_delay_ms(1000);
        ST7789_SendCommand(0x11);
        ST7789_SendCommand(0x3A);
		ST7789_SendData(0x05);
		ST7789_SendCommand(0x36);
        ST7789_SendData(0x20);
        ST7789_SendData(0x10);
		ST7789_SendData(0x04);
		ST7789_SendData(0x08);
		ST7789_SendCommand(0x21);
		ST7789_SendCommand(0x29);
		ST7789_SendCommand(0x2C);
		
   LCD_Fill(BLACK);
}

Проблема была  еще и в контактах, а когда припаял провода - все заработало

Изменено пользователем Kostyanskiy
Ссылка на комментарий
Поделиться на другие сайты

12 часов назад, Kostyanskiy сказал:

Вот это можете мне пояснить

Цифры - первая - количество команд инита, остальные - задержки между командами. Далее идет команда для дисплея, потом команда для МК.

Ссылка на комментарий
Поделиться на другие сайты

  • 7 месяцев спустя...

Доброго времени суток.

Учусь работать с STM32F0 +ST7789.

Провожу инициализацию дисплея. Но есть непонятная вещь. При подаче питания, МК исполняет свою программу как надо, но дисплей пустой. Подключаюсь к МК через ST-Link Utility, после подключения нажимаю кнопку разъединить. И дисплей показывает то, что прописано программой.

Я так понимаю, дисплей начинает работать только после сброса мк утилитой при разъединении. Как можно это обойти, что б экран работал сразу после подачи питания на плату?

П.с. физический сброс выводом nrst на gnd погоды не меняет.

Ссылка на комментарий
Поделиться на другие сайты

Не у одного вас такая проблема, такие аномалии, думаю не один я уже встречал в своих проектах с дисплеями особенно под AVR, но причини каждого случая свои. Проверьте осликом или лог. анализатором, наличие  тактирующего сигнала и MOSI шины SPI, при инициализации дисплея.

А может у вас где-то идёт просадка по питанию дисплея или МК, и при подключении программатора, просадка компенсируется током самого программатора. Киньте ослика на питание и посмотрите, что у вас нету провала напряжения в начальный момент запуска МК, поставьте конденсатор на питание (подбор эмпирически), настройте МК на задержку выполнение основной программы в несколько миллисекунд, чтобы при инициализации дисплея не потерять некоторые пакеты инициализации с плохим питанием (задержка нужна, чтобы переждать пик просадки питания и дождаться его стабилизации)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...