Народный осциллограф "Мурзик" на базе STM32F303VCT6 - проект

Кто любит RISC в жизни, заходим, не стесняемся.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

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-ми направлений вывода и задает, остальные функции вроде тоже понятно что делают...
Реклама
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

GFX писал(а):Да по буквам я понял, что квадратиками задается, а не каждая точка, но как я говорил мне не критично, выводятся у меня они редко. Линии спасибо, попробую убыстрить. Сделал вертикальные и горизонтальные отдельно быстрыми, в 20 раз быстрее работают, но оно и понятно, для рамки и FFT пригодятся.
Тот вариант, что я предлагал, в принципе позволяет не реализовывать отдельно отрисовку строго вертикальных и горизонтальных линий, т.к. разница будет не такая большая.
Последний раз редактировалось Reflector Пт ноя 25, 2016 22:41:08, всего редактировалось 1 раз.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

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 может только слева на право, с права налево, снизу вверх и сверху вниз. по диагонали не может вроде. И получается что эта функция рисует только горизонтальные и вертикальные проекции)
Последний раз редактировалось GFX Пт ноя 25, 2016 22:45:27, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Chettuser »

Вопрос с выводом точки.
На моём индикаторе (от S5230, S6D041) имеются команды CASET и RASET, определяют поле вывода.
Сначала отправляю координаты Xstart, Xend, затем Ystart, Yend... Для точки я должен отправить текущую координату (start) и инкремент (end) по X и Y?
Я правильно понял принцип вывода точки? Или достаточно задать только Xstart, Ystart?
Спасибо.
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

Reflector писал(а):ILI9341 более продвинутый, а по диагонали и S6d0129 не умеет. Фактически тот же RightDown отличается от RightUp только тем, что если, допустим, задать окно для символа и заполнить одну линию, то следующая будет ниже или выше, но для рисования линий этот режим не используется, т.к. предполагается, что за пределы окна мы не выходим. Другими словами LeftDown и RightDown - это просто Left и Right.
Задумку я понял, но при смене одной из координат, текущее положение курсора сбрасывается. И получается вместо линий квадратики, прямоугольники. Т.е. Линия идет по Х, затем должен быть излом на 1 пиксель по Y, и все бы ничего, только вместе с Y пиксели начинают сначала по X, получается прямоугольник, в котором количество пикселей равно количеству в линии. Пока борюсь безуспешно, сбрасывается и все, CS я не трогаю, видимо такая у него логика работы, если окно сменили, начинает сначала. X подвинуть туда где он был можно, но тогда и прикола нет то.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

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 кучу всего. По крайней мере нужно понимать это.
Спойлер

Код: Выделить всё

 //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 - проект
Рано обрадовался, вставил рисовалку линий в осцил и оказалась что там горбатый закрался :))) Рисует только слева на право и сверху вниз, не зря там проверки были. Нужно дорабатывать.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Reflector »

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

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

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); 
}
Аватара пользователя
GFX
Поставщик валерьянки для Кота
Сообщения: 2040
Зарегистрирован: Вт окт 23, 2012 18:36:14
Откуда: Ростов-на-Дону

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение GFX »

Я извиняюсь, ну раз тут вели разговор о рисовании шрифтов.

Было
Спойлер

Код: Выделить всё

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:
Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки :)
Аватара пользователя
Juris
Грызет канифоль
Сообщения: 255
Зарегистрирован: Вс мар 04, 2012 12:05:24
Откуда: Riga

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Juris »

Ну так, наверное, Спасибо за прогресс в делах наших графических! :)
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Andrew Martin »

GFX писал(а):
Я в шоке, вот неужели сразу нельзя сделать по-человечески и таких же библиотек большинство, где все через точку в тупую рисуется. Теперь шпарит и текст как из пушки :)
А это прописная истина, которую многие почему-то ещё и оспаривают - стандартные либы в большинстве своём не фонтан. Никто не сделает лучше, чем мы сами. :solder:
Аватара пользователя
Juris
Грызет канифоль
Сообщения: 255
Зарегистрирован: Вс мар 04, 2012 12:05:24
Откуда: Riga

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Juris »

Сам я не программирую, но случайно набрёл на ресурс одного мужика, который, кроме прочего, энтузиаст разрабатывать оптимизированные библиотеки работы с дисплеями. Решил сдесь такой частично "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/
... и так далее.
Chettuser

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Chettuser »

Делал вывод через точки - было 30 fps, переделал на алгоритм брезенхема - упало до 9 fps. Печалька. Киньтесь кто-нибудь алгоритмом на асемблере для STM32 для изучения?
Спасибо.
Аватара пользователя
240265
Электрический кот
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение 240265 »

Я тут потихоньку ковыряю...
Добавил Синхронизацию по фронту и по спаду и установку уровня синхронизации .
Вложения
OSC_V1_S0+Sync.rar
(29.75 КБ) 441 скачивание
IVL ex UA6PJ
Аватара пользователя
Juris
Грызет канифоль
Сообщения: 255
Зарегистрирован: Вс мар 04, 2012 12:05:24
Откуда: Riga

Re: Народный осциллограф "Мурзик" на базе STM32F303VCT6 - пр

Сообщение Juris »

240265 писал(а):Я тут потихоньку ковыряю...
Добавил Синхронизацию по фронту и по спаду и установку уровня синхронизации .
Спасибо! :-)
И особое Спасибо за приложение схем в архив, чтоб не фантазировать, по какой это теперь, и кнопки куда.
Ответить

Вернуться в «ARM»