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

ili9341 к AtMega 16

Вс апр 24, 2016 01:55:01

Купил дисплеи ili9341
Изображение
Прочитал даташит.
Прочитал много статей, там для STM,Arduino, Raspberry и т.п.
А подключить не как, понял что мне надо (1110) 4-wire 8-bit data serial interface (SCL,SDI,D/CX,SDO, CSX) тип II по SPI.
Шлю с помошью Atmega16 код но инициализация не проходит, нет мурашек которые вроди должны быть.
пробывал как тут ссылка
но ничего не вышло.

Может кто знает, может есть пример "без воды" как на Atmega16, запустить ili9341.
Нужно ли его инициализировать? Должны ли появится мурашки? Или может что еще посоветуете.

Нащёл это но не знаю актуально ли это к нему(и что это за код).

Re: ili9341 к AtMega 16

Вс апр 24, 2016 12:24:53

cgw писал(а):А подключить не как, понял что мне надо (1110) 4-wire 8-bit data serial interface (SCL,SDI,D/CX,SDO, CSX) тип II по SPI.
Что там подключать-то? Всё же написано - CS, SCK, MOSI, MISO (может не потребоваться), ну и RESET.
cgw писал(а):Может кто знает, может есть пример "без воды" как на Atmega16, запустить ili9341.
Есть, в даташите.
cgw писал(а):Нужно ли его инициализировать?
Как я понимаю - именно даташит и не изучался? Разве в "статьях" не сказано про необходимость инициализации?
cgw писал(а):Должны ли появится мурашки?
Про какие "мурашки" ты говоришь? Про экран, заполненный случайными точками? Не факт, у меня сразу белым экран светится после инициализации.
cgw писал(а):Или может что еще посоветуете.
Прочитать даташит.
Проверить правильность подключения.
Настроить SPI в AVR.
Попробовать прочитать ID из индикатора (тут предупреждаю - может не получиться. Сам поймал такое - ILI вообще ничего в ответ не шлёт, и в инете многие жалуются).
В соответствии в даташитом настроить ILI - там описано как её запустить.
Настроить цветопередачу и начало координат.

Re: ili9341 к AtMega 16

Вс апр 24, 2016 15:31:12

для старта лучше использовать програмный SPI

Re: ili9341 к AtMega 16

Вс апр 24, 2016 15:46:20

12val12 писал(а):програмный SPI
А почему? :shock:
Лишний код, лишние возможности сделать ошибку... Скорость обмена, к тому же, куда ниже аппаратной.

Re: ili9341 к AtMega 16

Вс апр 24, 2016 21:10:17

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

я наоборот перевел свои минипроектики с аппаратного на програмный .приятнее на вид и ноги любые назначать можно
вот если бы у avr spi бы буфер байта на 4 это да.

Re: ili9341 к AtMega 16

Вс апр 24, 2016 21:12:52

cgw писал(а):Купил дисплеи ili9341

Нащёл это но не знаю актуально ли это к нему(и что это за код).


ТАКОЕ ГАВНО напоминает stm32 письмена.

Re: ili9341 к AtMega 16

Вс апр 24, 2016 21:30:55

12val12 писал(а):програмный spi легче перенести с платформы на платформу -только порты настроить
На разных платформах "ногодрыг" производится совершенно разными способами, как и настройка портов.
По большей части придётся все функции программного SPI писать с нуля.
12val12 писал(а):допустить ошибку как раз сложнее
Ну здрасте.... Чем больше размер кода - тем выше вероятность ошибки. :))
И когда индикатор не работает - ищи где баг: в коде SPI или в коде инициализации.
12val12 писал(а):я наоборот перевел свои минипроектики с аппаратного на програмный .приятнее на вид
Насчет приятного на вид - очень спорно.
И я придерживаюсь обратной идеологии: нечего самому делать то, что может сделать аппаратная часть и прочая автоматика.
Я уж молчу про лишний размер кода. Да - soft-SPI занимает копейки, и пофиг на это... до поры до времени.

12val12 писал(а):ТАКОЕ ГАВНО напоминает stm32 письмена.
Можно полюбопытствовать почему гуано и почему stm32?
Особенно в свете строчки "Copyright (c) 2012 Atmel Corporation."

Re: ili9341 к AtMega 16

Пн апр 25, 2016 01:14:42

Cразу белым экран светится после подачи питания +5в на LED без инициализации.

Вот что смущает это SPI:

//5-Порядок передачи данных
СпойлерSPCR^=(1<<DORD);// DORD=0;
Порядок передачи битов данных определяется состоянием
бита DORD регистра SPCR. Если бит установлен в
1, первым передается младший бит байта,
если же сброшен в 0 — старший бит.


//3-Полярность тактового сигнала
СпойлерSPCR^=(1<<CPOL);// CPOL=0;
/*Полярность тактового сигнала.
0 —генерируются импульсы положительной полярности, при отсутствии импульсов на выводе присутствует НИЗКИЙ уровень;
1 —генерируются импульсы отрицательной полярности, при отсутствии импульсов на выводе присутствует ВЫСОКИЙ уровень*/


//2-Фаза тактового сигнала
СпойлерSPCR^=(1<<CPHA);// CPHA=0;
/* Фаза тактового сигнала.
0 —обработка данных производится по переднему фронту импульсов сигнала SCK (для CPOL =0 —по нарастающему фронту, а для CPOL =1 —по спадающему фронту);
1 —обработка производится по заднему фронту импульсов сигнала SCK(для CPOL =0 —по спадающему фронту, а для CPOL =1 —по нарастающему фронту) */


Не ясно какие они должны быть в даташите не нащел, может кто знает?

Re: ili9341 к AtMega 16

Пн апр 25, 2016 12:32:48

а вот и непонятки о которых я говорил .

Re: ili9341 к AtMega 16

Пн апр 25, 2016 12:42:41

вот это гавно
возмущен этим бредом беспредельно
{
ili9341_select_command_mode();
ili9341_select_chip();
ili9341_send_byte(command);
ili9341_wait_for_send_done();
ili9341_select_data_mode();
}

вместо понятного
DC_LCD=0;
CS_LSD=0;
SPDR =command; // апаратный
while (SPSR.7==0) ;
DC_LCD=1;

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

Re: ili9341 к AtMega 16

Пн апр 25, 2016 14:05:59

cgw писал(а):Cразу белым экран светится после подачи питания +5в на LED без инициализации.
Это работает подсветка, не более того.
cgw писал(а):Вот что смущает это SPI:
...
Не ясно какие они должны быть в даташите не нащел, может кто знает?
Давай почитаем даташит вместе. Первый попавшийся, https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
Страница 38, смотрим внимательно на графики...
Прекрасно видно, что старший бит передается первым.
Легко читается, что полярность тактового сигнала "генерируются импульсы положительной полярности",
как и то, что "обработка данных производится по переднему фронту импульсов сигнала SCK" - там даже стрелочки нарисованы!
12val12 писал(а):а вот и непонятки о которых я говорил .
Теперь я внимательно слушаю, как ты ответишь на эти-же вопросы при условии soft-SPI. Повторю вопрос: "какие должны быть сигналы"?
12val12 писал(а):возмущен этим бредом беспредельно
ili9341_select_command_mode();
ili9341_select_chip();
....
вместо понятного
DC_LCD=0;
CS_LSD=0;
SPDR =command; // апаратный
У-у-у-у, ну ясно, ясно.
Позволь я угадаю: в твоих исходниках практически нет комментариев и названия функций ни о чем не говорят, особенно постороннему человеку.
А так же ты никогда не писал код для других (а тем более для обучения), и не работал над более-менее большим кодом в более-менее большой команде.

Насчет "понятности":
ili9341_select_command_mode(); - сразу, без чтения хелпов понятно, что данная функция переводит ILI в командный режим.
ili9341_select_chip(); - тут всем ясно, что активируется доступ к чипу.

DC_LCD=0; - что это значит? Понятно, то что-то с LCD-экраном. Можно догадаться, что это установка некого сигнала "DC". А что за сигнал? Надо лезть в описание кода, а оно есть? А "0" - это что? Активно, неактивно?
CS_LSD=0; - а тут вообще реклама наркоты какая-то. :)))

Re: ili9341 к AtMega 16

Вт апр 26, 2016 06:39:27

Выкладываю схему подключения и код (ili9341+Atmega16) может кто что увидит что неправильно.
+ может кому поможет.

Запускается код дисплей 4 раза мигает по 1 сек, потом инициализация и потом должен загореться дисплей и он не загорается. И так до бесконечности. Видимо что то неправильно с инициализацией.

Если порт PB0="+" то шьем его по SPI.
Если порт PB0="-" то запускается программа дисплея.

Reset правильно к PB1 подключить.

Развернуть схему
СпойлерИзображение


Развернуть код (лучше открыть notepad++ комментарий очень много)
Спойлер
Код:
// Главный итоговый проект для ili9341

#define F_CPU 1000000UL

#include <avr/io.h>
#include <stdint.h> // Заголовочный файл объявляет целочисленные типы
#include <stdlib.h> // функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие.
#include <string.h> //строковаые типы.
#include <util/delay.h> //Задержка
#include <avr/interrupt.h>//Прерывания

// Инициализация портов по коротким коммандам..
//#define PIN_SPI_1      PORTA=PORTA|(1<<PORTA0); //PA0 // переключатель SPI.
#define PIN_RST_1      PORTB=PORTB|(1<<PORTB1); //PA1 // сброс.
#define PIN_LED_1      PORTB=PORTB|(1<<PORTB2); //PA2 // подсветка.
#define PIN_DC_1_data   PORTB=PORTB|(1<<PORTB3); //PA3 // выбор комманды0 или данные1.
#define PIN_CS_1      PORTB=PORTB|(1<<PORTB4); //PA4 // выбор чипа.


//#define PIN_SPI_0      PORTA^=(1<<PORTA0); //PA0 // переключатель  SPI.
#define PIN_RST_0      PORTB^=(1<<PORTB1); //PA1 // сброс.
#define PIN_LED_0      PORTB^=(1<<PORTB2); //PA2 // подсветка.
#define PIN_DC_0_cmd    PORTB^=(1<<PORTB3); //PA3 // выбор комманды0 или данные1.
#define PIN_CS_0      PORTB^=(1<<PORTB4); //PA4 // выбор чипа.


int main(void)
{   //char Flag0=1; // флаг если пин включен то работаем иначе пропускаем код.
   unsigned char Flag1=0; // флаш чтобы запустить программу только 1 раз.
   //unsigned char mi=0;
   //unsigned char zn=0;
   
   init_port(); //Инициализируем порт A и B.
   spi_settings(); // Настройка SPI

   while (1){
      
      //Если на ноге PORTB0 ноль то выполним условие.
      if (!(PINB & (1<<PORTB0))) {
      
      //Если на ноге PORTB0 один то выполним условие.
      //if (PINB & (1<<PORTB0)) { //Работает если PINB0 = 1 то выполняется.
            if (Flag1==0){
               PIN_LED_0;
               _delay_ms ( 1000 );
               PIN_LED_1;
               _delay_ms ( 1000 );
               PIN_LED_0;
               _delay_ms ( 1000 );
               PIN_LED_1;
               _delay_ms ( 1000 );
               PIN_LED_0;
               _delay_ms ( 1000 );
               PIN_LED_1;
               _delay_ms ( 1000 );
               PIN_LED_0;
               _delay_ms ( 1000 );
               PIN_LED_1;
               _delay_ms ( 1000 );
               PIN_LED_0;
               
               
               
               ili9341_init();

               
               PIN_LED_1;
               
               
               
               
         Flag1=1;}
         
         //ЗДЕСЬ ДОЛЖНА БЫТЬ Ф-ЦИЯ инициализации Дисплея.
         //i+=1;
         //spi_SPDR_otpravit(0b00001010);
         //_delay_ms ( 1000 );
         /*spi_prinyat();
         sei();
         while(1);
      
*/
/*
               LCD_Fill(0x10);
               _delay_ms (1000);
               
               LCD_Fill(0x50);
               _delay_ms (3000);
               
               LCD_Fill(0x80);
               _delay_ms (3000);
               
               LCD_Fill(0xA0);
               _delay_ms (3000);
               
               LCD_Fill(0xFF);
               _delay_ms (3000);
*/
      }

   }
}


void init_port()
{
   PORTB= 0b00000001;
   DDRB = 0b11111110;
   PORTA= 0b00000000;
   DDRA = 0xFF;
   
}

void spi_settings(void)
{
   //регистр SPCR. $2D ($4D)
   
   //7-Разрешение прерывания от SPI
   SPCR^=(1<<SPIE);// SPIE=0;
   //6-Включение/выключение SPI
   SPCR|=(1<<SPE);// SPE=1;
   //5-Порядок передачи данных
   SPCR^=(1<<DORD);// DORD=0;
   //4-Выбор режима работы (Master/Slave)
   SPCR^=(1<<MSTR);//MSTR=0;
   //3-Полярность тактового сигнала
   SPCR^=(1<<CPOL);// CPOL=0;
   /*Полярность тактового сигнала.
   0 —генерируются импульсы положительной полярности, при отсутствии импульсов на выводе присутствует НИЗКИЙ уровень;
   1 —генерируются импульсы отрицательной полярности, при отсутствии импульсов на выводе присутствует ВЫСОКИЙ уровень*/

   //2-Фаза тактового сигнала
   SPCR^=(1<<CPHA);// CPHA=0;
   /* Фаза тактового сигнала.
   0 —обработка данных производится по переднему фронту импульсов сигнала SCK (для CPOL =0 —по нарастающему фронту, а для CPOL =1 —по спадающему фронту);
   1 —обработка производится по заднему фронту импульсов сигнала SCK(для CPOL =0 —по спадающему фронту, а для CPOL =1 —по нарастающему фронту) */

   //1,0-Скорость передачи
   SPCR^=(1<<SPR1);// SPR1=0
   SPCR^=(1<<SPR0);// SPR0=0

   //Формат регистра SPSR



   /*
   7 SPIF
   Флаг прерывания от SPI. Данный флаг устанавливается в 1 по окончании
   передачи очередного байта. Если флаг SPIE регистра SPCR установлен в 1 и
   прерывания разрешены, то одновременно с установкой флага генерируется
   прерывание от SPI. Также флаг SPIF устанавливается в 1 при переводе_мик-
   роконтроллера из режима Master в режим Slave посредством вывода SS (см.
   раздел 10.4). Флаг сбрасывается аппаратно либо при старте подпрограммы
   обработки прерывания, либо после чтения регистра состояния SPI с
   последующим обращением к регистру данных SPI (SPDR)

   6 WCOL
   Флаг конфликта записи. Данный флаг устанавливается в 1 при попытке
   записи в регистр данных (SPDR) во время передачи очередного байта. Флаг
   сбрасывается аппаратно после чтения регистра состояния SPI с последующим
   обращением к регистру данных SPI

   5...1 -

   0 */
   SPSR^=(1<<SPI2X);// SPI2X=0
   /*Зарезервированы, читаются как 0
   Удвоение скорости обмена. При установке этого бита в 1 и работе
   микроконтроллера в режиме Master частота сигнала SCK удваивается


   Передаваемые данные записываются, а принимаемые — считываются из регистра данных SPDR. по адресу $0F ($2F),
   */
}


// spi_SPDR_otpravit(i);  Эта функция передает код по SPI. то что в переменной idat.
void spi_SPDR_otpravit(char idat)  //функция с примера SPI server2
{   SPDR = idat; // Начало передачи
   while(!(SPSR & (1<<SPIF))) ; // Ожидание окончания передачи
   //return;// SPDR; //возвращаем принятый байт
}



/*char spi_SPDR_prinyat(void){ // Чтение из SPI
//Включение SPI, режима ведомого, разрешаем прерывани¤
   //7-Разрешение прерывания от SPI // SPIE=1;
   //6-Включение/выключение SPI // SPE=1;
   SPCR = (1<<SPE)|(1<<SPIE);

ISR(SPI_STC_vect) //прерывание по приему байта
{
if (SPDR!=(0x00)) {PORTA=SPDR; _delay_ms(1000);}//выводим байт на PORTA
}

}*/

/*
char spi_SPIF(void){ //Флаг прерывания от SPI
   return SPIF;
}

char spi_WCOL(void){//Флаг конфликта записи SPI
   return WCOL;
}
*/


//Отправить комманду.
void SPI_CMD_otpravit(char data0) // ЭТО ОТПРАВИТЬ ВЕРХНЮЮ КОММАНДУ 1 БИТ(8байт).
{
PIN_DC_0_cmd;
PIN_CS_0;
spi_SPDR_otpravit(data0);
PIN_CS_1;
   //if (spi_SPDR_otpravit(data) > 0b00000000)  {return 0b11111111;} else {return 0b00000000;}
}

//Отправить данные
void SPI_DATA_otpravit(char data1) // "ЭТО ОТПРАВКА ПАРАМЕТРОВ из может быть несколько"
//Также ты можешь и передавать после отправки комманды.
{
PIN_DC_1_data;
PIN_CS_0;
spi_SPDR_otpravit(data1);
PIN_CS_1;
   //if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;}
}


//uint8_t тип другой.
// Инициализация
void ili9341_init(void)
{
     
  PIN_CS_1;
     
  // сброс дисплея
  PIN_RST_1;
 
  SPI_CMD_otpravit(0x01); //ILI9341_RESET);
    /*приводит к программному сбросу. Она возвращает команды и параметры их S/W Reset значения по умолчанию.
(См таблиц по умолчанию в каждом описании команды.)
Примечание: Содержание кадровой памяти не затрагиваются этой командой
Надо будет подождать  5msec  перед отправкой новой команды следующие программного
сброса. Дисплейный модуль загружает все дисплей поставщиком заводским значениям к
регистрам в течение этого 5msec. Если Software Reset применяется в режиме Sleep Out,
надо будет ждать 120msec перед отправкой Sleep out команды. Software Reset Command не
может быть отправлено во время выполнения последовательности Sleep Out .
Примечание мое. 1msec=0,001sec*/

  _delay_ms(100);
   

   /// настраиваем дисплей

  //Power control A (CBh)
  SPI_CMD_otpravit(0xCB);
  // EXTC должен быть высоким, чтобы включить эту команду
  SPI_DATA_otpravit(0x39); //по умолчанию
  SPI_DATA_otpravit(0x2C); //по умолчанию
  SPI_DATA_otpravit(0x00); //по умолчанию
  SPI_DATA_otpravit(0x34); //по умолчанию Vcore 1,6V
  SPI_DATA_otpravit(0x02); //по умолчанию ddvdh 5,6V
 
 
  SPI_CMD_otpravit(0xCF); //Power control B (CFh)
  /*
  Параметр 2-й: управление мощностью [1: 0] Только установка
управления мощностью [1:0] = 11, уровень напряжения VGH и VGL приведены в табл.
bit[5]: DRV_ena : Для VCOM ведущее улучшение возможности, DRV_ena = 1: Включите, и наоборот
bit[6]: PCEQ: PC и EQ операция для экономии электроэнергии
0:disable эта функция
1:enable эта функция

rd параметр: значение по умолчанию: 30h
bit[2:0]: DRV_vmh[2:0] 3’b000 корректируются по ширине диска для VMH(000: 1 op_clk ~111: 8 op_clk)
bit[3]: DRV_vml[0] 1’b0
bit[4]: DC_ena: Разряд путь включения. Включите высоко для защиты ESD, 1: включено и наоборот
bit[7:6] : DRV_vml[2:1] 2’b00
EXTC должен быть высоким, чтобы включить эту команду*/

  SPI_DATA_otpravit(0x00); //по умолчанию
  SPI_DATA_otpravit(0xC1); //0b11000001  DRV_ena : Для VCOM=0 ведущее улучшение возможности выкл/экономии электроэнергии вкл /
  SPI_DATA_otpravit(0x30); //по умолчанию   ESD=1: вкл для защиты
 
  SPI_CMD_otpravit(0xE8); //Driver timing control A (E8h)
  SPI_DATA_otpravit(0x85);
  /*
  1 parameter : gate управление синхронизацией неперекрытия драйвера.
  1:default + 1unit
  */
  SPI_DATA_otpravit(0x00);
  /*
  2 parameter : EQ timing control
0: default – 1unit

parameter : CR timing control
0: default – 1unit
  */
 
  SPI_DATA_otpravit(0x78);
/*
3 parameter : управление синхронизацией перед обвинением
00:default – 2unit
*/
 
  SPI_CMD_otpravit(0xEA);//Driver timing control B (EAh)
// 1 parameter:gate управление синхронизацией драйвера
 
  SPI_DATA_otpravit(0x00);
/*VG_SW_T1[1:0]:EQ to GND   00: 0 unit
  VG_SW_T2[1:0]:EQ to DDVDH 00: 0 unit
  VG_SW_T3[1:0]:EQ to DDVDH 00: 0 unit
  VG_SW_T4[1:0]:EQ to GND   00: 0 unit */
  SPI_DATA_otpravit(0x00); //по умолчанию

 
  SPI_CMD_otpravit(0xED); //Power on sequence control (EDh)
/*
кадры
1кадр и 3кадра
1кадр и 4кадра
2кадра и 3кадра

Ограничение EXTC должен быть высоким, чтобы включить эту команду
*/
  SPI_DATA_otpravit(0x64); //0b01(CP1 soft start =10) 01(CP23 soft start =00) 0b01100100
  /*1 st parameter:soft start control
00:soft start keep 3 frame
01:soft start keep 2 frame
10:soft start keep 1 frame
11:disable*/

  SPI_DATA_otpravit(0x03); //0b00000011
  SPI_DATA_otpravit(0x12); //0b00010010
/*
2nd/ 3rd parameter:включите управление последовательностью
00:1st frame enable
01:2nd frame enable
10:3rd frame enable
11:4th frame enable
*/
  SPI_DATA_otpravit(0x81); // 0b10000001
  /*
  4th parameter:DDVDH улучшите режим (только для 8 внешних конденсаторов)
1: enable
  */
 
 
  SPI_CMD_otpravit(0xF7);  //Pump ratio control (F7h)
  //EXTC должен быть высоким, чтобы включить эту команду
  SPI_DATA_otpravit(0x20); //0b00100000
  /*1 st parameter:ratio control
10:DDVDH=2xVCI*/
 
 
  SPI_CMD_otpravit(0xC0); //Power Control 1 (C0h)
  /*VRH [5:0]: Установите уровень GVDD, который является контрольным уровнем для
уровня VCOM и полутонового уровня напряжения.*/
  SPI_DATA_otpravit(0x23); // 0b00100011  4.6V (5v это 0b00101011=0x2B) см табл.
  /*Примечание1: Удостоверьтесь что VC и VRH урегулирование ограничения: GVDD (DDVDH -  ?
0.2) V.*/
 
  SPI_CMD_otpravit(0xC1); //Power Control 2 (C1h)
  SPI_DATA_otpravit(0x10); // по умолчанию 0b00010(000)
  /*
  BT [2:0]: Устанавливает фактор, используемый в схемах повышения.
Выберите оптимальный фактор повышения для рабочего напряжения. Чтобы уменьшить
потребляемую мощность, установите меньший фактор.
BT [2:0]  = 000  DDVDH=VCIx2    VGH=VCIx7    VGL=-VCIx4   

Примечание
1: Удостоверьтесь что DDVDH урегулирование ограничения: DDVDH ? 5.8 В.
2: Удостоверьтесь что VGH и VGL урегулирование ограничения: VGH-VGL ? 28 В

EXTC должен быть высоким, чтобы включить эту команду
  */
 
 
 
  SPI_CMD_otpravit(0xC5); //VCOM Control 1(C5h)
//EXTC должен быть высоким, чтобы включить эту команду
  //VMH [6:0] : Установите напряжение VCOMH.
  SPI_DATA_otpravit(0x3E); //0 VMH[6:0]  = 00111110 = 4.250V(VCOMH)
  //VML [6:0] : Установите напряжение VCOML.
  SPI_DATA_otpravit(0x28); //0 VML[6:0]  = 00101000 = -1.500V(VCOML)
 
  SPI_CMD_otpravit(0xC7); //VCOM Control 2(C7h)
  SPI_DATA_otpravit(0x86); //0b10000110  (nVM[7] VMF[6:0])
/*
nVM: nVM равняется “0” после включают сброс и VCOM смещение равняется значению MTP программы.
Когда набор nVM к “1”, урегулирование VMF [6:0] становится допустимым и VCOMH/VCOML может быть скорректирован.
VMF [6:0]: Установите Напряжение смещения VCOM.

VMF=0000110  VCOMH=VMH -58    VCOML = VML -58
*/ 
 
  SPI_CMD_otpravit(0x36);//Memory Access Control (36h)
  /*Эта команда определяет направление сканирования чтения-записи памяти фрейма.
Эта команда не вносит изменения на другом состоянии драйвера..*/
  SPI_DATA_otpravit(0x48); //0b01001000

/*  Эти 3 бита управления MCU на к памяти записи-чтения направления.
7 MY Row Address Order 
6 MX Column Address Order
5 MV Row / Column Exchange (обрезка экрана выкл)
4 ML Vertical Refresh Order  LCD вертикаль обновляет управление направлением. (сверху вниз вкл)
3 BGR RGB-BGR Order  Цветное управление селектором (0=RGB панель цветового фильтра, 1=BGR панель цветового фильтра) (RGB вкл)
2 MH Horizontal Refresh ORDER  LCD горизонталь освежающее управление направлением.(слево на право вкл.)
[1:0]=00

Примечание: то, Когда BGR бит, изменено, новое урегулирование сразу активно без
обновления содержание в Памяти Фрейма снова.
X = Не заботиться.

*/

  SPI_CMD_otpravit(0x3A);// COLMOD: Pixel Format Set (3Ah)
 
  /*
  Это наборы команд пиксельный формат для RGB отображает данные, используемые
интерфейсом. DPI [2:0] является пиксельным выбором формата RGB
интерфейс и DBI [2:0] являются пиксельным форматом интерфейса MCU.
Если определенный интерфейс, или интерфейс RGB или интерфейс MCU,
не используемый тогда соответствующие биты в параметре проигнорированы.
Пиксельный формат показан в таблице ниже.

Если использование Интерфейса RGB должно последовательный интерфейс выбора.
X = Не заботиться
  */
  SPI_DATA_otpravit(0x55); //0b01010101   0b0(101)0(101)   0b0(DPI[2:0])0(DBI[2:0])
/*
DPI 16 bits / pixel 
DBI 16 bits / pixel 
*/ 


  SPI_CMD_otpravit(0xB1); //Frame Rate Control (In Normal Mode/Full Colors) (B1h)
  /* их 3 вида
  Frame Rate Control (In Normal Mode/Full Colors) (B1h)
  Frame Rate Control (In Idle Mode/8 colors) (B2h)
  Frame Rate control (In Partial Mode/Full Colors) (B3h)
 
 Формула, чтобы вычислить кадровую частоту:
Frame Rate= ( fosc )/(Clocks per line x Division ratio x (Lines + VBP + VFP) )
Устанавливает отношение подразделения для внутренних часов Normal режима в
интерфейсе MCU.
fosc: внутренняя частота осциллятора
Часы за строку:RTNA настройки
Отношение подразделения: DIVA настройки.
Строки: общий ведущий номер строки
VBP: номер строки задней porch
VFP: передний номер строки porch

 */
 
  SPI_DATA_otpravit(0x00); // 0b00000000  0b000000(00) 0b000000(DIVA[1:0])  = fosc (без предделителя)
  SPI_DATA_otpravit(0x18); //0b00011000     0b000(11000)  000(RTNA[0:4])  установл 79Hz 
  //  70Hz Default = 0b00011011
 
 
  SPI_CMD_otpravit(0xB6);//Display Function Control (B6h)
  //EXTC должен быть высоким, чтобы включить эту команду.
  SPI_DATA_otpravit(0x08);  //0b00001000   0b0000(10)(00)    0b0000(PTG[1:0])(PT[1:0])
  /*
  PTG [1:0]: Установите режим сканирования в области недисплея.
  Выводы логического элемента в области недисплея = Сканирование интервала
  Исходные выводы в области недисплея = Набор с PT [2:0] биты
  Вывод VCOM пусто.
  PT [1:0]: Определите вывод источник /VCOM в области недисплея в partial режиме отображения.
  Источник Вывод на области недисплея Положительная полярность = V63 
  Источник Вывод на области недисплея Отрицательная полярность = V0 
  Вывод VCOM на область недисплея Положительная полярность = VCOML
  Вывод VCOM на область недисплея Отрицательная полярность =VCOMH
  */
  SPI_DATA_otpravit(0x82);  //0b10000010   0b(1)(0)(0)(0)(0010)    0b(REV)(GS)(SS)(SM)(ISC[3:0])
 
  /*
 
  REV: Выберите, является ли жидкокристаллический тип обычно белым типом или
Нормальный черный тип .
Жидкокристаллический тип
= 0 Нормальный белый
= 1 Нормальный черный

GS: Устанавливает направление сканирования драйвером логического элемента в
диапазоне, определенном SCN [4:0] и NL [4:0].
Направление сканирования определяется GS = 0 может быть отменено установкой GS = 1.
Gate Output Scan Direction
Пропустите выходное направление сканирования
=0 это G1 -> G320
=1 это G320 -> G1

  SS: Выберите направление сдвига выводов от исходного драйвера.
SS Исходное выходное направление сканирования =0 т.е S1 -> S720
В дополнение к направлению сдвига параметры настройки и для SS и для битов BGR
требуются, чтобы изменять присвоение R, G, и точки B к исходным контактам драйвера.
Чтобы присвоить R, G, B точки к исходным контактам драйвера от S1 до S720,
устанавливают SS = 0.
Чтобы присвоить R, G, B точки к исходным контактам драйвера от S720 до S1,
устанавливают SS = 1.


SM: Устанавливает расположение контакта драйвера логического элемента в сочетании с
битом GS выбирать оптимальный режим сканирования для модуля.

SM=0 GS=0
Scan Direction
Направление сканирования
сверху вниз
G2 to G320
G1 to G318

Gate Output Sequence
Пропустите выходную
последовательность
G1 -> G2 -> G3 -> G4 ………………… G317 -> G318 -> G319 -> G320

ISC [3:0]: Определите интервал цикла сканирования драйвера логического элемента в
области недисплея когда PTG [1:0] =” 10”, чтобы выбрать сканирование интервала.
Тогда цикл сканирования установлен как нечетное число с 0~29 периодов фрейма.
Полярность инвертирована каждый цикл сканирования.

0010 (ISC [3:0]  )
5frame (Цикл сканирования )
85 ms(fFLM = 60Hz)

  */
 
 
  SPI_DATA_otpravit(0x27);  //0b00100111   0b00(100111)    0b00(NL[5:0])
 
  /*
  NL [5:0]: Определяет номер строк, чтобы управлять жидкокристаллическим дисплеем в
интервале 8 строк. Отображение GRAM адресов не затронуто числом строк,
установленных NL [5:0]. Число строк должно быть тем же или больше, чем число
необходимых строк для размера жидкокристаллической панели.

NL [5:0] = 100111 это 320 строк


  */
 
  /*PCDIV [5:0]: Которого нет  external fosc= (DOTCLK) /(2x (PCDIV+1))*/
 
  SPI_CMD_otpravit(0xF2);//Enable 3G (F2h)
  /*
  1 st Parameter: Enable 3 гамма управления
3G_enb high для 3 гамма управления enable
Ограничение EXTC должен быть высоким, чтобы включить эту команду
  */
  SPI_DATA_otpravit(0x00); // 3GAMMA_EN выкл.
 
 
 
  SPI_CMD_otpravit(0x2A); //Column Address Set (2Ah)
  /*
  Эта команда используется, чтобы определить область столбца памяти фрейма Frame
Memory , где MCU может получить доступ.
Эта команда не вносит изменения на другом состоянии драйвера.
Значения SC [15:0] и EC [15:0] отнесены, когда команда RAMWR прибывает.
Каждое значение представляет строку на один столбец в Памяти Фрейма
 
 
  SC [15:0] всегда должен быть равен или меньше, чем EC [15:0].
Отметьте 1: Когда SC [15:0] или EC [15:0] будет больше, чем 00EFh (Когда MADCTL's B5
= 0) или 013Fh (Когда MADCTL's B5 = 1), данные из диапазона будут проигнорированы.

*/
  SPI_DATA_otpravit(0x00);//(SC15 SC14 SC13 SC12 SC11 SC10 SC9 SC8)
  SPI_DATA_otpravit(0x00);//(SC7 SC6 SC5 SC4 SC3 SC2 SC1 SC0)
  SPI_DATA_otpravit(0x00);//(EC15 EC14 EC13 EC12 EC11 EC10 EC9 EC8)
  SPI_DATA_otpravit(0xEF);// 0b11101111 (EC7 EC6 EC5 EC4 EC3 EC2 EC1 EC0)
 
  SPI_CMD_otpravit(0x2B);//Page Address Set (2Bh)
  /*
  Эта команда используется для определения области строк Frame Memory памяти кадров,
где MCU может получить доступ. Эта команда не делает никаких изменений на другой
статус драйвера. Значения SP [15: 0] и EP [15: 0] называются, когда команда RAMWR
приходит. Каждое значение представляет собой одну строку страницы в памяти кадров.

SP [15:0] всегда должен быть равен или меньше, чем EP [15:0]
Отметьте 1: Когда SP [15:0] или EP [15:0] больше, чем 013Fh (Когда MADCTL's B5 = 0)
или 00EFh (Когда MADCTL's B5 = 1), данные из диапазона будут проигнорированы.

  */
  SPI_DATA_otpravit(0x00); //(SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 )
  SPI_DATA_otpravit(0x00); //(SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0)
  SPI_DATA_otpravit(0x01); //(EP15 EP14 EP13 EP12 EP11 EP10 EP9 EP8)
  SPI_DATA_otpravit(0x3F); // 0b00111111 (EP7 EP6 EP5 EP4 EP3 EP2 EP1 EP0)
 
  SPI_CMD_otpravit(0x26);//Gamma Set (26h)
  SPI_DATA_otpravit(0x01); // По умолчанию. других вариантов нет
 
  SPI_CMD_otpravit(0xE0);// Positive Gamma Correction (E0h)
  //Установите полутоновое напряжение корректировать гамма характеристики панели TFT.  EXTC должен быть высоким, чтобы включить эту команду
  SPI_DATA_otpravit(0x0F); // 0b00001111  0b0000(1111) 0b0000(VP63[3:0])
  SPI_DATA_otpravit(0x31); // 0b00110001  0b00(110001) 0b00(VP62 [5:0])
  SPI_DATA_otpravit(0x2B); // 0b00101011  0b00(101011) 0b00(VP61 [5:0])
  SPI_DATA_otpravit(0x0C); // 0b00001100  0b0000(1100) 0b0000(VP59 [3:0])
  SPI_DATA_otpravit(0x0E); // 0b00001110 0b000(01110) 0b000(VP57 [4:0])
  SPI_DATA_otpravit(0x08); // 0b00001000 0b0000(1000) 0b0000(VP50 [3:0])
  SPI_DATA_otpravit(0x4E); // 0b01001110 0b0(1001110) 0b0(VP43 [6:0])
  SPI_DATA_otpravit(0xF1); // 0b11110001 0b(1111)(0001) 0b(VP27 [3:0])(VP36 [3:0])
  SPI_DATA_otpravit(0x37); // 0b00110111 0b0(0110111) 0b0(VP20 [6:0])
  SPI_DATA_otpravit(0x07); // 0b00000111 0b0000(0111) 0b0000(VP13 [3:0])
  SPI_DATA_otpravit(0x10); // 0b00010000 0b000(10000) 0b000(VP6 [4:0])
  SPI_DATA_otpravit(0x03); // 0b00000011 0b0000(0011) 0b0000(VP4 [3:0])
  SPI_DATA_otpravit(0x0E); // 0b00001110 0b00(001110) 0b00(VP2 [5:0])
  SPI_DATA_otpravit(0x09); // 0b00001001 0b00(001001) 0b00(VP1 [5:0])
  SPI_DATA_otpravit(0x00); // 0b00000000 0b0000(0000) 0b0000(VP0 [3:0])
 
  SPI_CMD_otpravit(0xE1);//Negative Gamma Correction (E1h)
 //Установите шкалы серого напряжения для регулировки гамма-характеристики панели TFT. EXTC должен быть высоким, чтобы включить эту команду
  SPI_DATA_otpravit(0x00); //0b00000000 0b0000(0000) 0b0000(VN63 [3:0])
  SPI_DATA_otpravit(0x0E); //0b00001110 0b00(001110) 0b00(VN62 [5:0])
  SPI_DATA_otpravit(0x14); //0b00010100 0b00(010100) 0b00(VN61 [5:0])
  SPI_DATA_otpravit(0x03); //0b00000011 0b0000(0011) 0b0000(VN59 [3:0])
  SPI_DATA_otpravit(0x11); //0b00010001 0b000(10001) 0b000(VN57 [4:0])
  SPI_DATA_otpravit(0x07); //0b00000111 0b0000(0111) 0b0000(VN50 [3:0])
  SPI_DATA_otpravit(0x31); //0b00110001 0b0(0110001) 0b0(VN43 [6:0])
  SPI_DATA_otpravit(0xC1); //0b11000001 0b(1100)(0001) 0b(VN27 [3:0])(VN36 [3:0])
  SPI_DATA_otpravit(0x48); //0b01001000 0b0(1001000) 0b0(VN20 [6:0])
  SPI_DATA_otpravit(0x08); //0b00001000 0b0000(1000) 0b0000(10VN13 [3:0]  00)
  SPI_DATA_otpravit(0x0F); //0b00001111 0b000(01111) 0b000(VN6 [4:0])
  SPI_DATA_otpravit(0x0C); //0b00001100 0b0000(1100) 0b0000(VN4 [3:0])
  SPI_DATA_otpravit(0x31); //0b00110001 0b00(110001) 0b00(VN2 [5:0])
  SPI_DATA_otpravit(0x36); //0b00110110 0b00(110110) 0b00(VN1 [5:0])
  SPI_DATA_otpravit(0x0F); //0b00001111 0b0000(1111) 0b0000(VN0 [3:0])
 
  SPI_CMD_otpravit(0x11);//Sleep Out (11h)
  /*
  Эта команда заставляет LCD модуль вводить минимальный режим потребляемой
мощности. В этом режиме, например, преобразователе DC/DC остановлен, Внутренний
осциллятор остановлен, и сканирование панели остановлено.
Интерфейс MCU и память все еще работают, и память сохраняет свое содержание.
X = Не заботиться
Ограничение Эта команда не имеет никакого эффекта, когда модуль уже находится в режиме Sleep In.
Sleep In режим может только оставить сон (Sleep Out) команда (11h) . Будет необходимо
ожидать 5msec прежде, чем отправить следующий за командой, это должно позволить
время для поставки напряжения и схемы часов, чтобы стабилизироваться.
Будет необходимо ожидать 120msec после передающей команды Sleep Out (когда во Sleep
In режиме), прежде чем команда Sleep In может быть отправлена.
  */
   
   _delay_ms(100);
  SPI_CMD_otpravit(0x29);//Display ON (29h)
  /*
  Эта команда используется, чтобы восстановиться с режима DISPLAY OFF. Вывод от
Frame Memory включена.
Эта команда не вносит изменения содержания памяти фрейма.
Эта команда не изменяет никакое другое состояние
  */


  SPI_CMD_otpravit(0x2C); //Memory Write (2Ch)
  //ILI9341_GRAM - это команда Memory Write (2Ch)
}   
   
void LCD_SetCursorPosition(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
    SPI_CMD_otpravit(0x2A); //Column Address Set (2Ah)
    SPI_DATA_otpravit(x1 >> 8);
    SPI_DATA_otpravit(x1 & 0xFF);
    SPI_DATA_otpravit(x2 >> 8);
    SPI_DATA_otpravit(x2 & 0xFF);
 
    SPI_CMD_otpravit(0x2B); //Page Address Set (2Bh)
    SPI_DATA_otpravit(y1 >> 8);
    SPI_DATA_otpravit(y1 & 0xFF);
    SPI_DATA_otpravit(y2 >> 8);
    SPI_DATA_otpravit(y2 & 0xFF);
}

void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
    LCD_SetCursorPosition(x, y, x, y);
    SPI_CMD_otpravit(0x2C); //Memory Write (2Ch)
    SPI_DATA_otpravit(color >> 8);
    SPI_DATA_otpravit(color & 0xFF);
}

void LCD_Fill(uint16_t color) {
unsigned int n, i, j;
i = color >> 8;
j = color & 0xFF;
LCD_SetCursorPosition(0, 0, 240 - 1, 320 - 1);

SPI_CMD_otpravit(0x2C);

for (n = 0; n < 38400; n++) {
SPI_DATA_otpravit(i);
SPI_DATA_otpravit(j);
}
}


/*void LCD_Image(unsigned char const *img) {
        uint32_t n;
         
    LCD_SetCursorPosition(0, 0, LCD_WIDTH - 1, LCD_HEIGHT - 1);
 
    SPI_CMD_otpravit(ILI9341_GRAM);
 
    for (n = 0; n < LCD_PIXEL_COUNT; n++) {
                u8 color = *img;
                img++;
        SPI_DATA_otpravit(*img);
        SPI_DATA_otpravit(color);
                img++;
    }
}*/






Вложения
схема ili9341 atmega16.jpg
(90.12 KiB) Скачиваний: 2151
main.c
Файл для Atmega16 на C#
(24.97 KiB) Скачиваний: 746

Re: ili9341 к AtMega 16

Вт апр 26, 2016 09:28:07

mas123 писал(а):Давай почитаем даташит вместе. Первый попавшийся, https://cdn-shop.adafruit.com/datasheets/ILI9341.pdf
Страница 38, смотрим внимательно на графики...
Прекрасно видно, что старший бит передается первым.
Легко читается, что полярность тактового сигнала "генерируются импульсы положительной полярности",


спс, сам бы не догадался что по картинкам можно определить.
Для Atmega16 + ili9341 в SPI должен быть.

CPOL = 0,
CPHA = 0

Leading Edge
Sample (Rising)

Trailing Edge SPI Mode
Setup (Falling)

SPI Mode
0

Значит в коде он правильный.
Последний раз редактировалось cgw Вт апр 26, 2016 09:29:49, всего редактировалось 1 раз.

Re: ili9341 к AtMega 16

Вт апр 26, 2016 09:28:41

cgw писал(а):может кто что увидит что неправильно.
Ты не поверишь...

Зачем вход RESET у AVR соединен с RESET ILI?
Даташит внимательно читался? Там указаны временные параметры формирования сигнала сброс.

Тот же даташит насколько внимательно изучался?! Раздел "19.2.1. General DC Characteristics"
Код:
Logic Operating Voltage           VDDI   ...  MIN=1.65         Typ=2.8    MAX=3.3V
Logic High Level Input Voltage    VIH         MIN=0.7*VDDI                MAX=VDDI
Logic Low Level Input Voltage     VIL         MIN=VSS                     MAX=0.3*VDDI
На плате экрана есть линейный преобразователь питания, так что из 5 вольт получаются нужные 3.3 для питания.
А вот по входу радостно прибегают все 5 вольт, что по даташиту не полагается.
Я не помню, насколько ILI защищена от перенапряжения по входу, так что шанс есть, что экран ещё живой...

Управление подсветкой прямо с вывода AVR? И какой ток потребляет подсветка? Не перегружаешь выход AVR?
У меня для достаточно яркой подсветки при питании 3.3 всё равно потребовался гасящий резистор.
cgw писал(а):#define PIN_DC_0_cmd PORTB^=(1<<PORTB3); //PA3 // выбор комманды0 или данные1.
#define PIN_CS_0 PORTB^=(1<<PORTB4); //PA4 // выбор чипа.
Напомни, какое действие выполняет оператор "^"?
cgw писал(а): SPCR^=(1<<SPIE);// SPIE=0;
SPCR|=(1<<SPE);// SPE=1;
SPCR^=(1<<DORD);// DORD=0;
SPCR^=(1<<MSTR);//MSTR=0;
SPCR^=(1<<CPOL);// CPOL=0;
SPCR^=(1<<CPHA);// CPHA=0;
SPCR^=(1<<SPR1);// SPR1=0
SPCR^=(1<<SPR0);// SPR0=0
В результате выполнения этого кода в регистре управления SPI будет:
SPIE=1
SPE=1
DORD=1
MSTR=1
CPOL=1
CPHA=1
SPR1=1
SPR0=1
Подтверди что именно ЭТИ настройки тебе нужны для работы с ILI. И расскажи, как ты обрабатываешь прерывание от SPI?
cgw писал(а)://Отправить комманду.
void SPI_CMD_otpravit(char data0) // ЭТО ОТПРАВИТЬ ВЕРХНЮЮ КОММАНДУ 1 БИТ(8байт).
{
PIN_DC_0_cmd;
PIN_CS_0;
spi_SPDR_otpravit(data0);
PIN_CS_1;
//if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;}
}
//Отправить данные
void SPI_DATA_otpravit(char data1) // "ЭТО ОТПРАВКА ПАРАМЕТРОВ из может быть несколько"
//Также ты можешь и передавать после отправки комманды.
{
PIN_DC_1_data;
PIN_CS_0;
spi_SPDR_otpravit(data1);
PIN_CS_1;
//if (spi_SPDR_otpravit(data) > 0b00000000) {return 0b11111111;} else {return 0b00000000;}
}
Угу: сигнал CS становится активным (лог."0") перед передачей каждого байта, и становится неактивным (лог."1") после окончания передачи.
В то время как в даташите несколько раз приведены диаграммы SPI-передачи команды с параметрами.
И там видно, как сигнал CS становится активным перед передачей первого байта (т.е. команды), и остаётся на низком уровне до окончания передачи последнего байта параметров.
Почитай в даташите раздел "7.1.11. Data Transfer Break and Recovery"
cgw писал(а):// Инициализация
void ili9341_init(void)
{
PIN_CS_1;
// сброс дисплея
PIN_RST_1;
Э-э-э, какой такой сброс?

Re: ili9341 к AtMega 16

Вт апр 26, 2016 10:24:07

mas123 писал(а):Зачем вход RESET у AVR соединен с RESET ILI?
Не знал куда его, я переключил на ногу PB1 тоже самое.

mas123 писал(а):На плате экрана есть линейный преобразователь питания, так что из 5 вольт получаются нужные 3.3 для питания.
А вот по входу радостно прибегают все 5 вольт, что по даташиту не полагается.
А я считал 5в так 5в куда угодно.

mas123 писал(а):Управление подсветкой прямо с вывода AVR? И какой ток потребляет подсветка?
Не перегружаешь выход AVR?

ток на проводе 80mA при включенной подсветке.

mas123 писал(а):Напомни, какое действие выполняет оператор "^"?

У меня так
#define PIN_LED_1 PORTB=PORTB|(1<<PORTB2); //Подсветка горит 80mА 4,7v
#define PIN_LED_0 PORTB^=(1<<PORTB2); //Подсветка не горит 0mА 0v
Это работает на подсветке дисплея на практике,
на счет SPI не знаю надо проверить.

Может это SPCR|=(1<<SPE);// SPE=??? а надо так SPCR=SPCR|(1<<SPE);// SPE=1
mas123 писал(а):И расскажи, как ты обрабатываешь прерывание от SPI?

void spi_SPDR_otpravit(char idat)
{ SPDR = idat; // Начало передачи
while(!(SPSR & (1<<SPIF))) ; // Ожидание окончания передачи
}

А тут понял с CS неправильно.
SPI_CMD_otpravit
SPI_DATA_otpravit



mas123 писал(а):// Инициализация
void ili9341_init(void)
{
PIN_CS_1;
// сброс дисплея
PIN_RST_1;

Э-э-э, какой такой сброс?


Как тут ссылкаиз приемера инициализации строка 9.





Интересно какой в SPI для дисплея DORD должен быть 1 или 0?

Re: ili9341 к AtMega 16

Вт апр 26, 2016 11:55:51

cgw писал(а):Не знал куда его, я переключил на ногу PB1 тоже самое.
Разумеется. Толку от переключения, если ты сигнал сброс не формируешь.
cgw писал(а):А я считал 5в так 5в куда угодно.
В этом мире уже давно и часто применяется напряжение питания 3.3, а в особо запущенных случаях 1.8В.
А ещё низковольтовые м/с бывают как толерантны к высокому напряжению на входе, так и нет.
cgw писал(а):ток на проводе 80mA при включенной подсветке.
Прекрасно. Давай теперь заглянем в даташит на Атмегу и посмотрим - а какой же ток допустимо снимать с выхода?
cgw писал(а):У меня так
#define PIN_LED_1 PORTB=PORTB|(1<<PORTB2); //Подсветка горит 80mА 4,7v
#define PIN_LED_0 PORTB^=(1<<PORTB2); //Подсветка не горит 0mА 0v
Это работает на подсветке дисплея на практике,
Я повторяю свой вопрос: какое действие в языке Си выполняет оператор "^"?
Попробуй дважды вызвать "PIN_LED_0" и расскажи что случилось и почему.
cgw писал(а):
mas123 писал(а):И расскажи, как ты обрабатываешь прерывание от SPI?
void spi_SPDR_otpravit(char idat)
Я спросил не про передачу байта.
В момент окончания передачи у тебя формируется прерывание SPI. Обработчика прерывания нет.
Тебя спасает лишь то, что глобальные прерывания у тебя запрещены.
cgw писал(а):
mas123 писал(а):Э-э-э, какой такой сброс?
Как тут
Ты хочешь сказать, что сигналом "сброс" является переход пина из "1" и "1". Причем пина, настроенного как вход?
cgw писал(а):Интересно какой в SPI для дисплея DORD должен быть 1 или 0?
Интересно, когда же ты просто откроешь даташит на ILI и на Atmega и почитаешь их?

Re: ili9341 к AtMega 16

Вт апр 26, 2016 15:15:28

mas123 писал(а):Разумеется. Толку от переключения, если ты сигнал сброс не формируешь.
Ты хочешь сказать, что сигналом "сброс" является переход пина из "1" и "1".
Причем пина, настроенного как вход?

Формирую при начале инициализации, только не знаю зачем.
Чета я не пойму,что сброс не нужен так? Или он не правильно настроен?

mas123 писал(а):Прекрасно. Давай теперь заглянем в даташит на Атмегу и посмотрим - а какой же ток допустимо снимать с выхода?


27.1 Абсолютные максимальные рейтинги *
DC Current per I/O Pin 40.0mA у меня 80mA
DC Current V CC and GND Pins 200.0mA PDIP у меня 0,9A
Output Low Voltage(Ports A,B,C,D) IOL = 20mA, VCC = 5V
Входной ток утечки I / O Pin Vcc = 5.5V, pin low (absolute value) Max 1µA

Странно но оно еще работает, значит не совсем максимальные.
Я думал на эту тему искал по форумам и понял
Что чем больше ампер тем лучше(лишь бы не меньше),
главное чтобы вольт было точно, разве не так?

mas123 писал(а):Я повторяю свой вопрос: какое действие в языке Си выполняет оператор "^"?
Попробуй дважды вызвать "PIN_LED_0" и расскажи что случилось и почему.

исключающее ИЛИ
11110000 XOR 10101010 = 01011010
11=0
00=0
10=1
01=1
Подбирал, подбирал заработало, ура. Вот так они выставлялись особо та и не понимая что это такое.
Как по другому выставлять биты в регистре не нащёл.

Запускаю два раза PIN_LED_0 (PORTB^=(1<<PORTB2))
МК выполняет 2 раза и 2 раза включает и выключает 2й бит. порта B.
on off
on off

При отладки вижу, у меня весь код не рабочий.
define не правильные вместо 1, шлю 0;
SPI не правильно. Вместо 0, шлю 1;



mas123 писал(а):Я спросил не про передачу байта.
В момент окончания передачи у тебя формируется прерывание SPI.
Обработчика прерывания нет.
Тебя спасает лишь то, что глобальные прерывания у тебя запрещены.

Прерывания запрещены, по умолчанию нули, туда не лазил еще.
А когда вызываю
PIN_LED_0;
PIN_LED_0;
5й бит GIFR почему-то включается.


mas123 писал(а):Интересно, когда же ты просто откроешь даташит на ILI и на Atmega и почитаешь их?

Нет его в даташите дисплея. Поиском искал DORD нету.
В меге есть, так мне надо знать какой он для дисплея нужен.
Ааа на графике 7й бит передается первым.
MSB first (DORD = 0) т.е. как на стр 38
по даташиту Atmel при DORD = 0 передаем так. 7 6 5 4 3 2 1 0

Re: ili9341 к AtMega 16

Вт апр 26, 2016 16:38:17

cgw писал(а):DC Current per I/O Pin 40.0mA у меня 80mA
Странно но оно еще работает, значит не совсем максимальные.
Мдя-я-я-я.
А ты дорогу переходишь на красный свет, да? "Странно, но я ещё живой и меня не сбили - значит не совсем запрещено". :)))
cgw писал(а):Что чем больше ампер тем лучше(лишь бы не меньше),
главное чтобы вольт было точно, разве не так?
Если через светодиод подсветки пустить бОльший ток, чем положено - он сгорит. Про связь тока и напряжение - см. закон Ома.
cgw писал(а):Подбирал, подбирал заработало, ура. Вот так они выставлялись особо та и не понимая что это такое.
Жесть... и прочий аллюминий... :facepalm:
cgw писал(а):Как по другому выставлять биты в регистре не нащёл.
Гм, может тебе вначале выучить язык Си?
Ибо методом подбора ты ничего не сделаешь.
Я тебе даже подскажу - в районе описания "^" есть описания и других логических операторов "~", "!", "|" и "&"
cgw писал(а):Запускаю два раза PIN_LED_0 (PORTB^=(1<<PORTB2))
МК выполняет 2 раза и 2 раза включает и выключает 2й бит. порта B.
Тебе это не кажется несколько странным?
Ты даёшь команду "выключить", а он выполняет "переключить"...

Re: ili9341 к AtMega 16

Вт май 31, 2016 07:29:13

Изображение

When DCX = ’1’, data is selected.
When DCX = ’0’, command is selected.

Кто знает как это понимать
это означает переключить : с 1 в 0 или с 0 в 1
или
это означает включить и выключить : 1 в 0 в 1 или 0 в 1 в 0

Нарисовано одно, а написано другое.
Вложения
dcx.gif
(15.82 KiB) Скачиваний: 4271

Re: ili9341 к AtMega 16

Вт май 31, 2016 08:46:54

Думаю что так правильно.

void TFT::sendCMD(INT8U index)
{
TFT_DC_LOW;
TFT_CS_LOW;
SPI.transfer(index); // отправить комманду

}

void TFT::sendData(INT16U data)
{
INT8U data1 = data>>8;
INT8U data2 = data&0xff;
TFT_DC_HIGH;
SPI.transfer(data1); //отправить данные
SPI.transfer(data2); //отправить данные
TFT_CS_HIGH;
}

данные взяты с https://github.com/gmtii/ili9341-arduino
Ответить