Например TDA7294

Форум РадиоКот • Просмотр темы - Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 07:04:59

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3100 ]     ... , , , 20, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 20:40:28 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
Да я согласен и не против. А можно вопрос, вы уже делали эти функции или пока в теории?) Просто зачем изобретать велосипед, когда один приличный форумчанин может поделиться такой библиотекой? :wink: А то мы сейчас 3 разные версии сделаем, наизобретаем велосипедов.

Fusion уже показал как текст выводить, там просто нужно окно под символ задать и потом шлешь данные сплошным блоком.
С линиями сложнее. У меня есть код для S6d0129 + FSMC, без кубов и на C++, а у S6d0129 набор команд отличается, потому придется вникать и переделывать.

Спойлер
Код:
void drawLine(int x1, int y1, int x2, int y2, uint16_t color)
{
   int dx = abs(x2 - x1);
   int dy = abs(y2 - y1);
   position(x1, y1);

   if (dx > dy)
   {
      (x1 > x2) ? direction(LcdDir::LeftDown) : direction(LcdDir::RightDown);
      int sum = dx / 2;
      beginWriteData();
      int add = (y2 > y1) ? 1 : -1;
      int dx_ = dx;
      while (dx-- >= 0)
      {
         if (sum >= dx_)
         {
            sum -= dx_;
            setY(y1 += add);
            beginWriteData();
         }
         writeData(color);
         sum += dy;
      }
   }
   else
   {
      (y1 > y2) ? direction(LcdDir::UpLeft) : direction(LcdDir::DownLeft);
      int sum = dy / 2;
      beginWriteData();
      int add = (x2 > x1) ? 1 : -1;
      int dy_ = dy;
      while (dy-- >= 0)
      {
         if (sum >= dy_)
         {
            sum -= dy_;
            setX(x1 += add);
            beginWriteData();
         }
         writeData(color);
         sum += dx;
      }
   }
}
Direction одно из 8-ми направлений вывода и задает, остальные функции вроде тоже понятно что делают...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 21:00:58 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Reflector писал(а):
Fusion уже показал как текст выводить, там просто нужно окно под символ задать и потом шлешь данные сплошным блоком.
С линиями сложнее.
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 21:15:07 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.

Тот вариант, что я предлагал, в принципе позволяет не реализовывать отдельно отрисовку строго вертикальных и горизонтальных линий, т.к. разница будет не такая большая.


Последний раз редактировалось Reflector Пт ноя 25, 2016 22:41:08, всего редактировалось 1 раз.

Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 21:31:39 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Reflector писал(а):
GFX писал(а):
Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.

Тот вариант, что я предлагал, в принципе позволяет не реализовывать отдельно отрисовку строго вертикальных и горизонтальных линий, т.к. разница будет не такая небольшая.
Может быть, но я пока не просек:
beginWriteData(); - ну может задание координаты относительно position(x1, y1), но не уверен. В ILI можно задать Х1, Х2, и отдельно Y1, Y2, каким образом beginWriteData понимает что задает?

setY, setХ- что это? Могу предположить что перед beginWriteData как раз и обновляет новый Х или Y, но вначале то их нет..
int sum = dx / 2;
beginWriteData();

Можно еще вот эти функции setY, setХ, beginWriteData?

И еще S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Последний раз редактировалось GFX Пт ноя 25, 2016 22:45:27, всего редактировалось 1 раз.

Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 22:22:28 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
Можно еще вот эти функции setY, setХ, beginWriteData?

BeginWriteData - это команда дающая индикатору понять, что после нее будут идти непосредственно данные цветов. Для S6d0129 и Ili9328 она называется "Write data to GRAM", код 0x22. Она всегда идет перед первой writeData, если до этого выполнялись другие команды, такие как изменение координат.
А setX и setY - это команды GRAM Horizontal/Vertical Address(0x20, 0x21), position вызывает их же, только вместе. Все координаты абсолютные.


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

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 22:46:59 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Reflector писал(а):
BeginWriteData - это команда дающая индикатору понять, что после нее будут идти непосредственно данные цветов. Для S6d0129 и Ili9328 она называется "Write data to GRAM", код 0x22. Она всегда идет перед первой writeData, если до этого выполнялись другие команды, такие как изменение координат.
А setX и setY - это команды GRAM Horizontal/Vertical Address(0x20, 0x21), position вызывает их же, только вместе. Все координаты абсолютные.
ну я так и понял, сделал, только вот затык: S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 23:04:34 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
ну я так и понял, сделал, только вот затык: S6d0129 умеет инструментировать сразу обе координаты что-ли? Слева-вниз, справа-вниз, сверху-налево, снизу-налево. ILI9341 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)

ILI9341 более продвинутый, а по диагонали и S6d0129 не умеет. Фактически тот же RightDown отличается от RightUp только тем, что если, допустим, задать окно для символа и заполнить одну линию, то следующая будет ниже или выше, но для рисования линий этот режим не используется, т.к. предполагается, что за пределы окна мы не выходим. Другими словами LeftDown и RightDown - это просто Left и Right.


Вернуться наверх
 
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 23:17:56 
Вопрос с выводом точки.
На моём индикаторе (от S5230, S6D041) имеются команды CASET и RASET, определяют поле вывода.
Сначала отправляю координаты Xstart, Xend, затем Ystart, Yend... Для точки я должен отправить текущую координату (start) и инкремент (end) по X и Y?
Я правильно понял принцип вывода точки? Или достаточно задать только Xstart, Ystart?
Спасибо.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 23:48:01 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Reflector писал(а):
ILI9341 более продвинутый, а по диагонали и S6d0129 не умеет. Фактически тот же RightDown отличается от RightUp только тем, что если, допустим, задать окно для символа и заполнить одну линию, то следующая будет ниже или выше, но для рисования линий этот режим не используется, т.к. предполагается, что за пределы окна мы не выходим. Другими словами LeftDown и RightDown - это просто Left и Right.
Задумку я понял, но при смене одной из координат, текущее положение курсора сбрасывается. И получается вместо линий квадратики, прямоугольники. Т.е. Линия идет по Х, затем должен быть излом на 1 пиксель по Y, и все бы ничего, только вместе с Y пиксели начинают сначала по X, получается прямоугольник, в котором количество пикселей равно количеству в линии. Пока борюсь безуспешно, сбрасывается и все, CS я не трогаю, видимо такая у него логика работы, если окно сменили, начинает сначала. X подвинуть туда где он был можно, но тогда и прикола нет то.

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пт ноя 25, 2016 23:52:19 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
X подвинуть туда где он был можно, но тогда и прикола нет то.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Сб ноя 26, 2016 12:09:45 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 0
Reflector писал(а):
GFX писал(а):
X подвинуть туда где он был можно, но тогда и прикола нет то.

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

Победил, сбрасывать он сбрасывает, но мы сэкономили на другом, записываю только начало X и Y. Итого 634 ФПС против 271 ( средний на 2х линиях. просто для сравнения)

Спрятал под спойлер, а то нас попрут уже скоро отсюда с этим экраном, оно давно и пора :)
Спойлер
Код:
//ILI9341_DrawFastLine(0, 00 , 320, 20, RED );   
ILI9341_DrawLine(0, 10 , 320, 30, GREEN );   
   
FPS_temp++;   
   
//ILI9341_DrawFastLine(10, 0 , 290, 240, RED );   
ILI9341_DrawLine(20, 0 , 300, 240, GREEN );   

FPS_temp++;   


Код:
void ILI9341_DrawFastLine(int x1, int y1, int x2, int y2, uint16_t color)
{
   int dx = abs(x2 - x1);
   int dy = abs(y2 - y1);   
      
   if (dx > dy)
   {
        TFT_CS_RESET;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_RESET;
      SPI_SendData8(SPI1, ILI9341_MAC);         
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_SET;
       SPI_SendData8(SPI1,  0xE8);      
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_CS_SET;       
                  
      spi16();       
        ILI9341_SetCursorPosition ( (uint16_t)x1, (uint16_t)y1, (uint16_t)x2, (uint16_t)y2);
      int sum = dx / 2;
      int add = (y2 > y1) ? 1 : -1;
      int dx_ = dx;
      while (dx-- >= 0)
      { 
         if (sum >= dx_)
         {
            sum -= dx_;
            y1 += add; //setY                
                 ILI9341_SetStartCursorPosition(x1, y1);
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color);
             x1++;
         sum += dy;
      }
   }
   else
   {
        TFT_CS_RESET;
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_RESET;
      SPI_SendData8(SPI1, ILI9341_MAC);         
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_SET;
       SPI_SendData8(SPI1,  0x88);      
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_CS_SET;
      
      spi16();       
        ILI9341_SetCursorPosition ( (uint16_t)y1, (uint16_t)x1, (uint16_t)y2, (uint16_t)x2);
      int sum = dy / 2;
      int add = (x2 > x1) ? 1 : -1;
      int dy_ = dy;
      while (dy-- >= 0)
      {
         if (sum >= dy_)
         {
            sum -= dy_;
            x1 += add; //setX
            ILI9341_SetStartCursorPosition(y1, x1);
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color);   
         y1++;            
         sum += dx;
      }
   }   
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));
  TFT_CS_SET;   
  spi8();   
   TFT_CS_RESET;
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_DC_RESET;
  SPI_SendData8(SPI1, ILI9341_MAC);         
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_DC_SET;
   SPI_SendData8(SPI1,  0xE8);      
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_CS_SET;    
}
Может код стоит чуть подправить, но 2 часа ночи уже. Прирост скорости меня радует, всем спасибо.

Добавлено after 8 hours 1 minute 54 seconds:
Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
Все-таки лучше использовать проверку и 16 бит. чем 8бит без проверок, иначе при делителях больших чем 2 и 4, проц успевает напихать в SPI кучу всего. По крайней мере нужно понимать это.
[spoiler]
Код:
 //SPI_SendData8(SPI1, (color>>8));
      //SPI_SendData8(SPI1, color);
       while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
           SPI_I2S_SendData16(SPI1,  color);   // только 2 байта цвета


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

Код:
void ILI9341_SetMAC(uint8_t data){      
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_RESET;
      SPI_SendData8(SPI1, ILI9341_MAC);         
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
      TFT_DC_SET;
      SPI_SendData8(SPI1,  data);      
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));        
}

void ILI9341_DrawFastLine(int x1, int y1, int x2, int y2, uint16_t color)
{
   int dx = abs(x2 - x1);
   int dy = abs(y2 - y1);   
   TFT_CS_RESET;    
   if (dx > dy)
   {      
     //ILI9341_SetMAC(0xE8);   не делаем, итак такое значение   
      spi16();       
      ILI9341_SetCursorPosition ( x1, y1, x2, y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд
      int sum = dx / 2;
      int add = (y2 > y1) ? 1 : -1;
      int dx_ = dx;
      while (dx-- > 0)
      { 
         if (sum >= dx_)
         {
            sum -= dx_;
            y1 += add;             
       ILI9341_SetStartCursorPosition(x1, y1);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд
         }
    while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color); // только 2 байта цвета
    x1++;
         sum += dy;
      }
   }
   else
   {
      ILI9341_SetMAC(0x88); // меняем направление вывода      
      spi16();       
      ILI9341_SetCursorPosition ( y1, x1, y2, x2); // задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд
      int sum = dy / 2;
      int add = (x2 > x1) ? 1 : -1;
      int dy_ = dy;
      while (dy-- > 0)
      {
         if (sum >= dy_)
         {
            sum -= dy_;
            x1 += add;
       ILI9341_SetStartCursorPosition(y1, x1); // задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд
         }
    while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color);   // только 2 байта цвета
         y1++;            
         sum += dx;
      }         
    ILI9341_SetMAC(0xE8); // возвращаем направление вывода
   }   
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));
  TFT_CS_SET;   
  spi8();   
}


Добавлено after 9 minutes 11 seconds:
Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
Но для полного задротства по скорости все-таки для горизонтальных и вертикальных нужно свои функции юзать:
ILI9341_DrawFastLine(0, 10 , 320, 10, RED );= 3720 ФПС
ILI9341_DrawFastHLine(0, 10 , 320, RED ); = 4956 ФПС
ILI9341_DrawLine(0, 10 , 320, 10, GREEN ); = 403 ФПС

Диагональная линия, наименьший эффект
ILI9341_DrawFastLine(0, 0 , 320, 240, RED ); = 560 ФПС
ILI9341_DrawLine(0, 0 , 320, 240, GREEN ); = 384 ФПС

Добавлено after 18 minutes 21 second:
Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
Добавил защиту от дурака чтобы линия не выходила за экран.

Код:
void ILI9341_DrawLine(int x1, int y1, int x2, int y2, uint16_t color)
{   uint16_t tmp;
      
      /* Check for overflow */
   if (x1 >= ILI9341_Opts.Width) {
      x1 = ILI9341_Opts.Width - 1;
   }
   if (x2 >= ILI9341_Opts.Width) {
      x2 = ILI9341_Opts.Width - 1;
   }
   if (y1 >= ILI9341_Opts.Height) {
      y1 = ILI9341_Opts.Height - 1;
   }
   if (y2 >= ILI9341_Opts.Height) {
      y2 = ILI9341_Opts.Height - 1;
   }
   
   /* Check correction */
   if (x1 > x2) {
      tmp = x1;
      x1 = x2;
      x2 = tmp;
   }
   if (y1 > y2) {
      tmp = y1;
      y1 = y2;
      y2 = tmp;
   }
      
   int dx = abs(x2 - x1);
   int dy = abs(y2 - y1);   
    TFT_CS_RESET;    
   if (dx > dy)
   {      
       //ILI9341_SetMAC(0xE8);   не делаем, итак такое значение   
      spi16();       
        ILI9341_SetCursorPosition ( x1, y1, x2, y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд
      int sum = dx / 2;
      int add = (y2 > y1) ? 1 : -1;
      int dx_ = dx;
      while (dx-- > 0)
      { 
         if (sum >= dx_)
         {
            sum -= dx_;
            y1 += add;             
                 ILI9341_SetStartCursorPosition(x1, y1);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color); // только 2 байта цвета
             x1++;
         sum += dy;
      }
   }
   else
   {
        ILI9341_SetMAC(0x88); // меняем направление вывода      
      spi16();       
        ILI9341_SetCursorPosition ( y1, x1, y2, x2); // задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд
      int sum = dy / 2;
      int add = (x2 > x1) ? 1 : -1;
      int dy_ = dy;
      while (dy-- > 0)
      {
         if (sum >= dy_)
         {
            sum -= dy_;
            x1 += add;
                ILI9341_SetStartCursorPosition(y1, x1); // задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color);   // только 2 байта цвета
         y1++;            
         sum += dx;
      }         
         ILI9341_SetMAC(0xE8); // возвращаем направление вывода
   }   
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));
  TFT_CS_SET;   
  spi8();   
}


Добавлено after 3 hours 1 minute 8 seconds:
Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект
Рано обрадовался, вставил рисовалку линий в осцил и оказалась что там горбатый закрался :))) Рисует только слева на право и сверху вниз, не зря там проверки были. Нужно дорабатывать.

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Сб ноя 26, 2016 12:20:23 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
GFX писал(а):
Рано обрадовался, вставил рисовалку линий в осцил и оказалась что там горбатый закрался :))) Рисует только слева на право и сверху вниз, не зря там проверки были. Нужно дорабатывать.

Я для проверки восьмиугольник рисовал, там как раз разные направления задействованы.
ps. У тебя в первой ветке x1++, а направление по X может быть разным... То же самое для y++ во второй.
Стоп, так в первой ветке направление вывода не меняется, а нужно ведь не просто менять с горизонтального на вертикальный, а с одного из 2х горизонтальных направлений, на одно из двух вертикальных.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Сб ноя 26, 2016 20:58:20 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 1
Reflector писал(а):
Я для проверки восьмиугольник рисовал, там как раз разные направления задействованы.
ps. У тебя в первой ветке x1++, а направление по X может быть разным... То же самое для y++ во второй.
Стоп, так в первой ветке направление вывода не меняется, а нужно ведь не просто менять с горизонтального на вертикальный, а с одного из 2х горизонтальных направлений, на одно из двух вертикальных.

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

Спойлер
Код:
void ILI9341_SetMAC(uint8_t data){   
   TFT_CS_RESET;
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_DC_RESET;
  SPI_SendData8(SPI1, ILI9341_MAC);         
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_DC_SET;
   SPI_SendData8(SPI1,  data);      
   
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));
  TFT_DC_RESET; 
  SPI_SendData8(SPI1,  ILI9341_GRAM);      

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));   
  TFT_DC_SET;      
  TFT_CS_SET;
}

void ILI9341_DrawLine(int x1, int y1, int x2, int y2, uint16_t color)
{         
      /* Check for overflow */
   if (x1 >= ILI9341_Opts.Width) {
      x1 = ILI9341_Opts.Width - 1;
   }
   if (x2 >= ILI9341_Opts.Width) {
      x2 = ILI9341_Opts.Width - 1;
   }
   if (y1 >= ILI9341_Opts.Height) {
      y1 = ILI9341_Opts.Height - 1;
   }
   if (y2 >= ILI9341_Opts.Height) {
      y2 = ILI9341_Opts.Height - 1;
   }
      
   int dx = (x2 - x1);
    if (dx<0) dx=-dx;
   int dy = (y2 - y1);
    if (dy<0) dy=-dy;   
    int x0, y0;
         
   if (dx >= dy)
   {   int addY;
      
      if (x1 > x2) {
        x0=320-x1;
          if (y1 > y2){
              ILI9341_SetMAC(0x08|(0<<7)|(0<<6)|(1<<5)|(0<<4)); // меняем направление вывода
          spi16();
            TFT_CS_RESET;                  
              y0=240-y1;
               addY = 1;
              ILI9341_SetCursorPosition ( 320-x1, 240-y1, 320-x2, 240-y2);// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд   
            }   
        else {
              ILI9341_SetMAC(0x08|(0<<7)|(1<<6)|(1<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;                  
               addY =  1;
              y0=y1;
              ILI9341_SetCursorPosition ( 320-x1, y1, 320-x2, y2);
            }//            
         }
        else {
            x0=x1;             
          if (y1 > y2){            
              ILI9341_SetMAC(0x08|(1<<7)|(0<<6)|(1<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;         
              y0=240-y1;
               addY = 1;
              ILI9341_SetCursorPosition ( x1, 240-y1, x2, 240-y2);}// задаем прямоугольник для работы 2 байта X1 + 2 байта Y1 + 2 байта X2 + 2 байта Y2 + 6 байт 3х команд      
        else{
              ILI9341_SetMAC (0x08|(1<<7)|(1<<6)|(1<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;                     
              y0=y1;
               addY = 1;
              ILI9341_SetCursorPosition ( x1, y1, x2, y2);
            }
         }         
      int sum = dx / 2;          
      int dx_ = dx;
      while (dx-- > 0)
      { 
         if (sum >= dx_)
         {
            sum -= dx_;
                 y0 += addY;               
                 ILI9341_SetStartCursorPosition(x0, y0);// задаем только начало прямоугольника 2 байта X + 2 байта Y + 6 байт 3х команд               
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color); // только 2 байта цвета
             //_delay_ms(10);
             x0++;
         sum += dy;
      }
   }   
   
   else   
    {  int addX;
      
      if (y1 > y2) {
        y0=240-y1;
          if (x1 > x2){
              ILI9341_SetMAC(0x08|(0<<7)|(0<<6)|(0<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;                  
              x0=320-x1;
               addX = 1;
              ILI9341_SetCursorPosition ( 240-y1, 320-x1, 240-y2, 320-x2);
            }   
        else {
              ILI9341_SetMAC(0x08|(1<<7)|(0<<6)|(0<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;   
              x0=x1;
               addX = 1;               
              ILI9341_SetCursorPosition ( 240-y1, x1, 240-y2, x2);
            }         
         }
         
        else {
            y0=y1;             
          if (x1 > x2){            
              ILI9341_SetMAC(0x08|(0<<7)|(1<<6)|(0<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;         
              x0=320-x1;
               addX = 1;
              ILI9341_SetCursorPosition ( y1, 320-x1, y2, 320-x2);
               }   
        else{
              ILI9341_SetMAC (0x08|(1<<7)|(1<<6)|(0<<5)|(0<<4));
          spi16();
            TFT_CS_RESET;                     
              x0=x1;
               addX = 1;
              ILI9341_SetCursorPosition ( y1, x1, y2, x2);
            }
         }   

      int sum = dy / 2;
      int dy_ = dy;
      while (dy-- > 0)
      {
         if (sum >= dy_)
         {
            sum -= dy_;
            x0 += addX;               
                 ILI9341_SetStartCursorPosition(y0, x0);                 
         }
             while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
         SPI_I2S_SendData16(SPI1,  color);   
             //_delay_ms(10);
         y0++;            
         sum += dx;
      }   
   }   
      while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY));
     spi8();
       ILI9341_SetMAC(0xE8);
}

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Чт дек 01, 2016 21:46:57 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 31
Рейтинг сообщений: 281
Зарегистрирован: Вт окт 23, 2012 18:36:14
Сообщений: 2040
Откуда: Ростов-на-Дону
Рейтинг сообщения: 7
Я извиняюсь, ну раз тут вели разговор о рисовании шрифтов.

Было
Спойлер
Код:
void ILI9341_Putc(uint16_t x, uint16_t y, char c, FontDef_t *font, uint16_t foreground, uint16_t background) {
   uint32_t i, b, j;

   /* Set coordinates */
   ILI9341_x = x;
   ILI9341_y = y;
   if ((ILI9341_x + font->FontWidth) > ILI9341_Opts.Width) {
      //If at the end of a line of display, go to new line and set x to 0 position
      ILI9341_y += font->FontHeight;
      ILI9341_x = 0;
   }
   for (i = 0; i < font->FontHeight; i++) {
      b = font->data[(c - 32) * font->FontHeight + i];
      for (j = 0; j < font->FontWidth; j++) {
         if ((b << j) & 0x8000) {
            ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), foreground);
         } else {
            ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), background);
         }
      }
   }
   ILI9341_x += font->FontWidth;
   
}


Чуть вкурил и изменил 3 строчки
Спойлер
Код:
void ILI9341_Putc(uint16_t x, uint16_t y, char c, FontDef_t *font, uint16_t foreground, uint16_t background) {
   uint32_t i, b, j;

   /* Set coordinates */
   ILI9341_x = x;
   ILI9341_y = y;
   if ((ILI9341_x + font->FontWidth) > ILI9341_Opts.Width) {
      //If at the end of a line of display, go to new line and set x to 0 position
      ILI9341_y += font->FontHeight;
      ILI9341_x = 0;
   }      
   ILI9341_SetCursorPosition(ILI9341_x, ILI9341_y, (ILI9341_x + font->FontWidth-1), (ILI9341_y + font->FontHeight-1));
   
   for (i = 0; i < font->FontHeight; i++) {
      b = font->data[(c - 32) * font->FontHeight + i];         
      for (j = 0; j < font->FontWidth; j++) {
         if ((b << j) & 0x8000) {
            //ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), foreground);
        while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));      
         SPI_I2S_SendData16(SPI1,  foreground);            
         } else {
            //ILI9341_DrawPixel(ILI9341_x + j, (ILI9341_y + i), background);
        while (!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));      
         SPI_I2S_SendData16(SPI1,  background);   
         }
      }
   }   
   ILI9341_x += font->FontWidth;
}

Итого было на строчке
Код:
ILI9341_Puts(0, 0,  "12345678901234567890" , &Font_16x26, RED, FON_GRID);   
ILI9341_Puts(0, 0,  "12345678901234567890" , &Font_16x26, GREEN, FON_GRID);   
FPS_temp++;      
5 ФПС, стало 66 :kill:
Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки :)

_________________
GFXscope :roll: uRLC :roll: nRLC :roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Чт дек 01, 2016 22:09:33 
Грызет канифоль
Аватар пользователя

Карма: 3
Рейтинг сообщений: 54
Зарегистрирован: Вс мар 04, 2012 12:05:24
Сообщений: 255
Откуда: Riga
Рейтинг сообщения: 0
Ну так, наверное, Спасибо за прогресс в делах наших графических! :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Вс дек 04, 2016 11:40:38 
Вымогатель припоя
Аватар пользователя

Карма: 3
Рейтинг сообщений: 253
Зарегистрирован: Вт июн 25, 2013 18:45:07
Сообщений: 606
Рейтинг сообщения: 0
GFX писал(а):

Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки :)


А это прописная истина, которую многие почему-то ещё и оспаривают - стандартные либы в большинстве своём не фонтан. Никто не сделает лучше, чем мы сами. :solder:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Чт дек 08, 2016 09:44:17 
Грызет канифоль
Аватар пользователя

Карма: 3
Рейтинг сообщений: 54
Зарегистрирован: Вс мар 04, 2012 12:05:24
Сообщений: 255
Откуда: Riga
Рейтинг сообщения: 4
Сам я не программирую, но случайно набрёл на ресурс одного мужика, который, кроме прочего, энтузиаст разрабатывать оптимизированные библиотеки работы с дисплеями. Решил сдесь такой частично "off-topic" залинковать, может сведующим интересно. На мой взгляд не-программиста у него там всё хорошо документировано и свободно доступно.
Извините, если уже известно и/или не нужно.
Вот:
http://andybrown.me.uk/
https://github.com/andysworkshop?tab=repositories
http://andybrown.me.uk/category/stm32plus/page/2/
http://andybrown.me.uk/category/arduino/
... и так далее.


Вернуться наверх
 
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Пн дек 26, 2016 15:25:33 
Делал вывод через точки - было 30 fps, переделал на алгоритм брезенхема - упало до 9 fps. Печалька. Киньтесь кто-нибудь алгоритмом на асемблере для STM32 для изучения?
Спасибо.


Вернуться наверх
   
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Вт дек 27, 2016 16:50:36 
Электрический кот
Аватар пользователя

Карма: 4
Рейтинг сообщений: 135
Зарегистрирован: Сб мар 09, 2013 11:29:22
Сообщений: 1020
Откуда: 40RUS, Жуков
Рейтинг сообщения: 1
Я тут потихоньку ковыряю...
Добавил Синхронизацию по фронту и по спаду и установку уровня синхронизации .


Вложения:
OSC_V1_S0+Sync.rar [29.75 KiB]
Скачиваний: 403

_________________
IVL ex UA6PJ OSC_F303
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр
СообщениеДобавлено: Вт дек 27, 2016 17:02:07 
Грызет канифоль
Аватар пользователя

Карма: 3
Рейтинг сообщений: 54
Зарегистрирован: Вс мар 04, 2012 12:05:24
Сообщений: 255
Откуда: Riga
Рейтинг сообщения: 0
240265 писал(а):
Я тут потихоньку ковыряю...
Добавил Синхронизацию по фронту и по спаду и установку уровня синхронизации .

Спасибо! :-)
И особое Спасибо за приложение схем в архив, чтоб не фантазировать, по какой это теперь, и кнопки куда.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3100 ]     ... , , , 20, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y