Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Дисплей 3.5 на ILI9341 + atmega128

Непрочитано 23.03.2024, 20:05  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 91
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию 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.
Devil Byte вне форума  
Непрочитано 23.03.2024, 20:17  
ForcePoint
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,459
Сказал спасибо: 3,227
Сказали Спасибо 3,513 раз(а) в 2,394 сообщении(ях)
ForcePoint на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

Да, выводы SPI (PB1-PB3) соответствуют. А в программе - объявляете (#define ***) совсем другие выводы.
Т.е. надо привести директивы #define *** в соответствие с физическим подключением, которое сделано правильно.
__________________
Экзорцист 40-го уровня.
ForcePoint вне форума  
Непрочитано 23.03.2024, 20:27  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 91
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию 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.
Devil Byte вне форума  
Непрочитано 23.03.2024, 21:17  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

А команды на включение дисплея (0x29) и выход из слипа (0x11) подаете? Обычно после этих команд должен отображаться "мусор" пикселей. Ну и не перепутали ли контакты подключения, ибо там два раздельных SPI, второй - для тача.

Кстати, ILI9488 - он для 320х480 пикс, очень уж большой дисплей для столь слабого микроконтроллера.
Я ж говорю - берите дисплей попроще, полегче. Если желаете непременно цветной, то хотябы на ST7735 размером 160х128 пикс.
NewWriter вне форума  
Непрочитано 23.03.2024, 21:27  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 91
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

Сообщение от NewWriter Посмотреть сообщение
для тача.
да вроде подаю(, но ни какого мусора нет, несколько раз перепроверял пины
для тача ноги не трогал, только касательно самого дисплея.
На счет слабости МК, ну не знаю, если посмотреть ютюб то на мега 2560 бегает очень резво. Мне тоже ничего не помешает перейти на внешний кварц 16мгц
Devil Byte вне форума  
Непрочитано 23.03.2024, 22:22  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

Devil Byte, 6кБ ОЗУ есть для буферов? Если нет - выбирай другой МК! Нонче полным-полно дешевых китайских. За 30-50 рублей вполне можно подобрать МК с 10-20кБ ОЗУ.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 24.03.2024, 08:33  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

После включения и вывода из слипа отправьте в дисплей команды All Pixel On (0x23) и All Pixel Off (0x22) при DC = 0. Что-то изменяется? Все пиксели должны включиться (0x23) и выключиться (0x22). Есть реакция?
NewWriter вне форума  
Непрочитано 24.03.2024, 19:43  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 91
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию 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)
    {
        // Основной цикл программы
    }
} 
Devil Byte вне форума  
Непрочитано 24.03.2024, 19:51  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

Хм. Не понимаете, как передать число в функцию? Ну уж это не ко мне, это к учебнику по языку Си. Ритчи, Керниган, "Язык программирования Си". Я тут не знаю что и как.
NewWriter вне форума  
Непрочитано 24.03.2024, 19:58  
Devil Byte
Временная регистрация
 
Регистрация: 07.03.2019
Сообщений: 91
Сказал спасибо: 11
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Devil Byte на пути к лучшему
По умолчанию Re: Дисплей 3.5 на ILI9341 + atmega128

NewWriter, я имею ввиду то я инициализирую дисплей функцией ILI9488_init
Но что бы я не передал в нее дисплей просто светится белым. я просто не понимаю правильно ли это 0х23

Последний раз редактировалось Devil Byte; 24.03.2024 в 20:01.
Devil Byte вне форума  
 

Метки
atmega128, lcd
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
arduino mega 2560 и ILI9341 как симулировать? ruvdos Proteus 0 02.12.2020 02:55
Дисплей ILI9341 на STM32F429 по SPI radian ARM 4 12.11.2017 05:55
Дисплей BL12864CYPNH потух Касьян Песочница (вопросы новичков) 0 28.06.2014 00:47
Текстовый дисплей PILZ PX 150-40-RFL ratfor1 Производственное оборудование 2 21.12.2013 00:16
Разбили дисплей анемометра Sopromat2 Измерительное оборудование 11 01.02.2012 21:47


Часовой пояс GMT +4, время: 11:43.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.