AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
23.03.2024, 20:05
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Сообщение от ForcePoint
|
Вы пробовали
|
Я подключил дисплей изначально
atmega displey
VCC ----------VCC
GND ----------GND
PB4 ----------CS
PB5 ----------RESET
PB6 ----------DC/RS
PB2 ----------SDI(MOSI)
PB1 ----------SCK
VCC ----------LED
PB3 ----------SDO(MISO)
я так понял RES, RS, CS - к любым портам контроллера.
Это же соответствует верной распиновке, так?
Последний раз редактировалось Devil Byte; 23.03.2024 в 20:14.
|
|
|
|
23.03.2024, 20:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 6,990
Сказал спасибо: 3,012
Сказали Спасибо 3,186 раз(а) в 2,161 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Да, выводы SPI (PB1-PB3) соответствуют. А в программе - объявляете (#define ***) совсем другие выводы.
Т.е. надо привести директивы #define *** в соответствие с физическим подключением, которое сделано правильно.
__________________
Экзорцист 40-го уровня.
|
|
|
|
23.03.2024, 20:27
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Сообщение от ForcePoint
|
привести директивы
|
Сделал. сейчас дисплей загорелся ярко белым. Но дальше ничего не меняется
Нажмите, чтобы открыть спойлер
PHP код:
|
#define F_CPU 8000000UL #include ‹avr/io.h› #include ‹util/delay.h›
// Определение пинов для SPI и контрола дисплея #define TFT_RST PB5 #define TFT_DC PB6 #define TFT_CS PB4 // Chip select #define TFT_SDI PB2 // MOSI #define TFT_CLK PB1 // SCK #define TFT_MISO PB3 // MISO
// Определение команд для ILI9488 #define TFT_CMD_SLEEP_OUT 0x11 #define TFT_CMD_DISPLAY_ON 0x29 #define TFT_CMD_MEMORY_WRITE 0x2C
// Цвета #define RED 0xF800
// Прототипы функций void SPI_MasterInit(void); void TFT_Init(void); void TFT_Reset(void); void TFT_SendCommand(uint8_t cmd); void TFT_SendData(uint8_t data); void TFT_FillScreen(uint16_t color);
int main(void) { // Инициализация SPI и дисплея SPI_MasterInit(); TFT_Init();
// Закрашивание экрана в красный цвет TFT_FillScreen(RED);
while (1) { // Основной цикл программы } }
void SPI_MasterInit(void) { // Настройка портов на вывод DDRB |= (1 ‹‹ TFT_RST) | (1 ‹‹ TFT_DC) | (1 ‹‹ TFT_CS) | (1 ‹‹ TFT_SDI) | (1 ‹‹ TFT_CLK); // Активация SPI, Master, установка частоты SCK = fosc/4, режим 0 SPCR = (1 ‹‹ SPE) | (1 ‹‹ MSTR); }
void TFT_Init(void) { // Сброс дисплея TFT_Reset();
// Выход из спящего режима TFT_SendCommand(TFT_CMD_SLEEP_OUT); _delay_ms(120);
// Включение дисплея TFT_SendCommand(TFT_CMD_DISPLAY_ON); }
void TFT_Reset(void) { // Сброс дисплея PORTB |= (1 ‹‹ TFT_RST); _delay_ms(5); PORTB &= ~(1 ‹‹ TFT_RST); _delay_ms(20); PORTB |= (1 ‹‹ TFT_RST); _delay_ms(150); }
void TFT_SendCommand(uint8_t cmd) { // Выбор дисплея PORTB &= ~(1 ‹‹ TFT_CS); // Отправка команды PORTB &= ~(1 ‹‹ TFT_DC); // Команда SPI_MasterTransmit(cmd); // Отмена выбора дисплея PORTB |= (1 ‹‹ TFT_CS); }
void TFT_SendData(uint8_t data) { // Выбор дисплея PORTB &= ~(1 ‹‹ TFT_CS); // Отправка данных PORTB |= (1 ‹‹ TFT_DC); // Данные SPI_MasterTransmit(data); // Отмена выбора дисплея PORTB |= (1 ‹‹ TFT_CS); }
void SPI_MasterTransmit(char cData) { // Начать передачу SPDR = cData; // Ожидание завершения передачи while(!(SPSR & (1 ‹‹ SPIF))); }
void TFT_FillScreen(uint16_t color) { uint32_t n = 480 * 320; // Количество пикселей uint8_t hi_color = color ›› 8; uint8_t lo_color = color;
// Запись в память TFT_SendCommand(TFT_CMD_MEMORY_WRITE); for (uint32_t i = 0; i ‹ n; i++) { TFT_SendData(hi_color); TFT_SendData(lo_color); } }
|
Последний раз редактировалось Devil Byte; 23.03.2024 в 21:09.
|
|
|
|
23.03.2024, 21:17
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
А команды на включение дисплея (0x29) и выход из слипа (0x11) подаете? Обычно после этих команд должен отображаться "мусор" пикселей. Ну и не перепутали ли контакты подключения, ибо там два раздельных SPI, второй - для тача.
Кстати, ILI9488 - он для 320х480 пикс, очень уж большой дисплей для столь слабого микроконтроллера.
Я ж говорю - берите дисплей попроще, полегче. Если желаете непременно цветной, то хотябы на ST7735 размером 160х128 пикс.
|
|
|
|
23.03.2024, 21:27
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Сообщение от NewWriter
|
для тача.
|
да вроде подаю(, но ни какого мусора нет, несколько раз перепроверял пины
для тача ноги не трогал, только касательно самого дисплея.
На счет слабости МК, ну не знаю, если посмотреть ютюб то на мега 2560 бегает очень резво. Мне тоже ничего не помешает перейти на внешний кварц 16мгц
|
|
|
|
23.03.2024, 22:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,627
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Devil Byte, 6кБ ОЗУ есть для буферов? Если нет - выбирай другой МК! Нонче полным-полно дешевых китайских. За 30-50 рублей вполне можно подобрать МК с 10-20кБ ОЗУ.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
24.03.2024, 08:33
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
После включения и вывода из слипа отправьте в дисплей команды All Pixel On (0x23) и All Pixel Off (0x22) при DC = 0. Что-то изменяется? Все пиксели должны включиться (0x23) и выключиться (0x22). Есть реакция?
|
|
|
|
24.03.2024, 19:43
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Сообщение от NewWriter
|
(0x23)
|
не совсем понимаю как их правильно писать в этот код
Нажмите, чтобы открыть спойлер
PHP код:
|
#define SPI_DDR DDRB #define SPI_PORT PORTB #define CS PB4 #define RESET PB5 #define DC PB6 #define MOSI PB2 #define SCK PB1
// Инициализация SPI интерфейса void SPI_init() { // Установим MOSI, SCK, CS и DC как выходные пины SPI_DDR |= (1 ‹‹ MOSI) | (1 ‹‹ SCK) | (1 ‹‹ CS) | (1 ‹‹ DC); // Включим SPI, установим мастер-режим и установим частоту SCK SPCR = (1 ‹‹ SPE) | (1 ‹‹ MSTR) | (1 ‹‹ SPR0); }
// Функция для отправки байта данных через SPI void SPI_send_byte(uint8_t data) { // Запускаем передачу данных SPDR = data;
// Ждем окончания передачи while (!(SPSR & (1 ‹‹ SPIF))); }
// Функция для отправки команды на дисплей void ILI9488_send_command(uint8_t command) { // Переводим линию DC в низкое состояние для отправки команды SPI_PORT &= ~(1 ‹‹ DC);
// Переводим линию CS в низкое состояние для начала передачи SPI_PORT &= ~(1 ‹‹ CS);
// Отправляем команду SPI_send_byte(command);
// Переводим линию CS в высокое состояние для окончания передачи SPI_PORT |= (1 ‹‹ CS); }
// Функция для отправки данных на дисплей void ILI9488_send_data(uint8_t data) { // Переводим линию DC в высокое состояние для отправки данных SPI_PORT |= (1 ‹‹ DC);
// Переводим линию CS в низкое состояние для начала передачи SPI_PORT &= ~(1 ‹‹ CS);
// Отправляем данные SPI_send_byte(data);
// Переводим линию CS в высокое состояние для окончания передачи SPI_PORT |= (1 ‹‹ CS); }
// Функция для инициализации дисплея void ILI9488_init() { // Сброс дисплея SPI_PORT &= ~(1 ‹‹ RESET); _delay_ms(100); SPI_PORT |= (1 ‹‹ RESET); _delay_ms(100); // возможно тут вызовы функций ILI9488_send_command() и ILI9488_send_data() // конфигурации дисплея согласно его техническому описанию. }
int main() { // Инициализация SPI SPI_init();
// Инициализация дисплея ILI9488_init();
// код для работы с дисплеем (рисование, обновление и т.д.)
while (1) { // Основной цикл программы } }
|
|
|
|
|
24.03.2024, 19:51
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
Хм. Не понимаете, как передать число в функцию? Ну уж это не ко мне, это к учебнику по языку Си. Ритчи, Керниган, "Язык программирования Си". Я тут не знаю что и как.
|
|
|
|
24.03.2024, 19:58
|
|
Временная регистрация
Регистрация: 07.03.2019
Сообщений: 87
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Дисплей 3.5 на ILI9341 + atmega128
NewWriter, я имею ввиду то я инициализирую дисплей функцией ILI9488_init
Но что бы я не передал в нее дисплей просто светится белым. я просто не понимаю правильно ли это 0х23
Последний раз редактировалось Devil Byte; 24.03.2024 в 20:01.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:02.
|
|