Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ТВ выход на bascom avr


ТВ выход на bascom avr

Сообщений 61 страница 90 из 357

61

Хахаха... :D ...мне почему-то кажется что вся проблема: http://www.allmbs.ru/pin-contact-VGA.html
В "ключе", может по этому не активируется?

0

62

Ev3658 написал(а):

http://www.tinyvga.com/vga-timing

По ссылке написано с какой частотой нужно передавать видеосигнал. При 640x350@70 Hz частота 25.175 MHz. AVR не потянет!

0

63

Пётр написал(а):

По ссылке написано с какой частотой нужно передавать видеосигнал. При 640x350@70 Hz частота 25.175 MHz. AVR не потянет!

Вообще не понятно.
Частота горизонтального импульса с видео карты 60 герц, частота вертикальной синхронизации около 31,5 килогерц. Если учесть, что пиксель может быть равен нулю, то он вообще может не появляться, да и в границе кадра, где пустота, между 480 и 525 - вообще нет видео сигнала, это показывает осциллограмма.
Я не знаю, откуда 27 мегагерц.

0

64

640*350*60 = 13.4 МГц.

0

65

Пётр написал(а):

640*350*60 = 13.4 МГц.

Не, ну 350 выводится с частотой 60 герц, то-есть 350 пикселей по вертикале выводим с частотой 60 герц, как только вывели 350, дальше делаем бордюр и начинаем новую строчку, новая строчка выводится с частотой 60 герц.

Может быть запутался уже, что не статья, то на самом деле тёмный лес, каждый пишет по разному.

К примеру, алгоритм вывода пикселя:

Gsyn=1.....пауза.....Gsyn=0..... пауза......уровень сигнала цветности.....пауза.... | 31,5кГц

Из чего состоит строка:

.....до  480 пикселя видео данные......Vsyn=1..пауза.... Vsyn=0..... до 525 пикселя тишина| - 60герц


VGA Signal 640 x 480 @ 60 Hz Industry standard timing

Interested in easy to use VGA solution for embedded applications? Click here!
General timing

Screen refresh rate 60 Hz
Vertical refresh 31.46875 kHz
Pixel freq. 25.175 MHz
Horizontal timing (line)

Polarity of horizontal sync pulse is negative.
Scanline part Pixels Time [µs]
Visible area 640 25.422045680238
Front porch 16 0.63555114200596
Sync pulse 96 3.8133068520357
Back porch 48 1.9066534260179
Whole line 800 31.777557100298

Vertical timing (frame)

Polarity of vertical sync pulse is negative.
Frame part Lines Time [ms]
Visible area 480 15.253227408143
Front porch 10 0.31777557100298
Sync pulse 2 0.063555114200596
Back porch 33 1.0486593843098
Whole frame 525 16.683217477656


Так-то контроллер без проблем может вывести 525 пикселей с частотой 60 герц, может и больше. Я уже окопался разными мониторами, под ногами LG Flatron T710PH, на столе китайский LCD 9 дюймов, за кучей хлама Acer 19 дюймовый - и из этого всего все провода около контроллера... Моргают, пишут, что сигнал есть, но не выводят цветность, вырубаю контроллер, на мониторах "Нет сиганала", получается, он как бы есть, но чёрный. Что только не пробовал, всё бесполезно  :tired:

0

66

Смотрите. При разрешении 640x350 на экране будет 640 умножить на 350 = 224000 пикселей. Обновлять картинку нужно 60 раз в секунду (60 кадров в секунду), умножаем число пикселей на число кадров в секунду. Сколько получим? Результат примено в два раз меньше чем должен. Видимо я что-то не учитываю.
Но в любом случае, 25.175 MHz для AVR это много.

0

67

Ev3658 написал(а):

О нет, VGA, ..... VGA везде, VGA уже туту

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

+2

68

Пётр написал(а):

Смотрите. При разрешении 640x350 на экране будет 640 умножить на 350 = 224000 пикселей. Обновлять картинку нужно 60 раз в секунду (60 кадров в секунду)......

Вот тут-то и непонятки.
Осциллографом посмотрел видео сигнал с VGA видео карты, там частота 60 герц и 31,5кГц.

Я написал(а):

Я тут замер сделал VGA сигнала:
Видео сигнал одного цвета:
http://s9.uploads.ru/t/BCZNi.png
Горизонтальная синхронизация:
http://s9.uploads.ru/t/pYRUV.png
Вертикальная синхронизация:
http://s9.uploads.ru/t/pdOcn.png
Видео сигнал по отношению к горизонтальной синхронизации:
http://s4.uploads.ru/t/00b3t.png
Горизонтальная и вертикальная синхронизация:
http://s1.uploads.ru/t/MCw1z.png

Так-то контроллер сможет рисовать одну строку даже из 1024 пиксела с частотой 31,5кГц  - с частотой 60 герц. Мониторы только помаргивают, сигнал видят, но экран тёмный.

0

69

Не, не может AtXmega вывести с выводов 27 мегагерц. Даже простой код на осциллографе показывает не более 2х мегагерц при 32 мегагерцах кристалла:

Код:
Do
Vsyn = 1
Vsyn = 0
Vout = 1
Vout = 0

Loop

0

70

Попробуй использовать Vport.
Вообще, если представить реальную картину, что на вывод в порт уходит 1 такт, то чтобы ты это вообще мог увидеть на осцилле, надо два такта (1/0 чтобы пролетел), то при этом ты получишь 32/2 = 16МГц, Карл!!! И это при условии прямой адресаии (полного заполнения памяти программ) без всяких лупов, которые производят сбивку цикла.

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

0

71

Вот исходник известногоVGA адаптера:
http://www.vga-avr.narod.ru/main_rus.files/image004.jpg

Код:
//Simplest universal VGA(20x20)/PAL(38x20) terminal
//For sync used Timer0 Timer1
//To avoid flickering while receive UART data,
//recommend to send UART data after VSYNC during
//10-20 VGA lines timing (around 300-600 mks)..

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/sleep.h>
#include <avr/pgmspace.h>
#include <string.h>
#include "symbol_tbl.h"

#define true 1
#define false 0
#define NOP asm("nop")

//Global definitions for VGA render
#define vga_field_line_count 525 //standart VGA quantity lines
#define vga_symbols_per_row 20   //symbols quantity per horizontal
#define vga_row_count 20         //symbols quantity per vertical
#define vga_symbol_height 24	 //rendered symbol height

//Global defenitions for render PAL
#define pal_field_line_count 312 //standart PAL/SECAM quantity lines (interlaced 625~312*2)
#define pal_symbol_height 12	 //rendered symbol height
#define pal_symbols_per_row 38   //symbols quantity per horizontal
#define pal_row_count 20         //symbols quantity per vertical

//Makro for video handle
//Video
#define video_off  DDRB=0x90
#define video_on  DDRB=0xB0
//HSYNC
#define hsync_off  sbi(PORTD,3)
#define hsync_on  cbi(PORTD,3)
//VSYNC
#define vsync_off  PORTD=0x04
#define vsync_on   PORTD=0x00

#define check_PAL_jumper bit_is_clear(PINC,1)

//Global variables
volatile unsigned char str_array[pal_symbols_per_row*pal_row_count+1]; //Chars array for display buffer
volatile unsigned int current_symbol; //Current symbol number at terminal

volatile unsigned char video_enable_flg;//flag for enable render
volatile unsigned char raw_render;//Current row at display buffer for render
volatile unsigned int linecount;// current line for render
volatile unsigned char y_line_render;	//Current Y-line at symbol for render 

//Store strings data at Program Space, to avoid RAM leakage
const char str1[] PROGMEM =   "Simple PAL terminal v1.2 UART-19200bps";
const char str2[] PROGMEM =   "Simple VGA terminal";
const char str3[] PROGMEM =   "v1.2 UART-19200 bps";

static void avr_init(void);

//All VGA sincronize made here..
SIGNAL(SIG_OVERFLOW0)
{
 TCNT0 = 0xC3; //reload counter value
//******Syncronization Handler********

	//Count number of lines
	if (++linecount == vga_field_line_count)
	{
	linecount = 0;
	
	//clear pointers for render display buffer
	raw_render = 0; 
	y_line_render = 0;
	}

	//Make Vsync length 2 VGA lines 
	if ((linecount == 10 )||(linecount == 11 ))
	{
//Make here vertical syncronization & HSYNC syncro level on
vsync_on;
	}
	else
	{
//.. & HSYNC syncro level on
vsync_off;
	}


	video_enable_flg = true;


	if (linecount < 45)
	{
video_enable_flg = false;
	//Add to avoid flickering at top display
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	
	}
	else
	{
 //Forming current string for rendering
 if (++y_line_render == vga_symbol_height)
 {
  raw_render++;
  y_line_render = 0;
 }
 else
 {
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
 }

	}

	hsync_off; //HSYNC syncro level off

//******Syncronization Handler********

}

//All PAL sincronize made here..
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
	
	//Count number of lines
	
	if (++linecount == pal_field_line_count)
	{
linecount = 0;
//clear pointers for render display buffer
raw_render = 0; 
y_line_render = 0;
	}
	
	//Invert HSYNC for VSYNC
	
	if (linecount > 305 && linecount < 309)
	{
//Make here vertical syncronization

sbi(PORTC,0); //inverted syncro level on
char i = 15;
while (--i)
{ NOP;}
//And "black" = 8 mksk;
cbi(PORTC,0); //inverted syncro level off
	    }
	else
	{
//Make HSYHC = 4 mksk;
cbi(PORTC,0); //syncro level on
char i = 30;
while (--i)
{ NOP;}

//And "black" = 8 mksk;
sbi(PORTC,0); //syncro level off
	}
	video_enable_flg = true;
	if ((linecount < 40) || (linecount > 278))
	{
video_enable_flg = false;
	
	//Add to avoid flickering at top display
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	}
	else
	{
 //Forming current string for rendering
 if (++y_line_render == pal_symbol_height)
 {
  raw_render++;
  y_line_render = 0;
 }
 else
 {
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
	NOP;
 }

	}

}

void spi_init (void)
{
    //Set SPI PORT DDR bits
	sbi(DDRB, 7); //SCK
	cbi(DDRB, 6); //MISO
	sbi(DDRB, 5); //MOSI
	sbi(DDRB, 4); //SS
	SPSR = 1 << SPI2X;
	SPCR = (1 << SPE) | (1 << MSTR); //SPI enable as master ,FREQ = fclk/2
	//That's a great pity, that we can't work with SPI with FREQ = fclk,
	//because may be possible build terminal up 40 symbol per row!!!
}

static void uart_init(void)
{
	 UCSRB = 0x00; //disable while setting baud rate
	 UCSRA = 0x00;
	 UCSRC = 0x86;	//8 bits data & 2 stop bits
	//UART SPEED 19200 bs
	UBRRL = 0x33; //set baud rate lo
	UBRRH = 0x00; //set baud rate hi
	//UART SPEED 38400 bs
	//UBRRL = 0x19; //set baud rate lo
	//UBRRH = 0x00; //set baud rate hi
	//UART SPEED 76800 bs
	//UBRRL = 0x0C; //set baud rate lo
	//UBRRH = 0x00; //set baud rate hi
	//UART SPEED 115200 bs
	//UBRRL = 0x08; //set baud rate lo
	//UBRRH = 0x00; //set baud rate hi
	//UART RX Enable
	UCSRB = (1 << RXEN);
}


static void pal_terminal_handle(void)
{
	// Parser received symbols from UART
	while(UCSRA & (1<<RXC))
	{
unsigned char current_line, received_symbol;
received_symbol = UDR;
//Check for overflow display buffer
if(current_symbol == (pal_row_count*pal_symbols_per_row))
{
	
	//Clear display buffer

	unsigned char i = pal_row_count;
	char * ptr;
	//Set pointers for clear string array
	ptr = &str_array[0];
	while(i--)
	{
//Don't use here loop, to fastest clear display buffer
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
	};
	current_symbol = 0x0;
}
	switch ( received_symbol )
	{
	  //BackSpace
	  case  0x08: 
	  if(current_symbol)
	    {
	str_array[current_symbol] = 0x0;
	str_array[--current_symbol] = 0x0;
}
	  break;
	  
	  //TAB
	  case  0x09: 
	  if((current_symbol + 5) < (pal_row_count*pal_symbols_per_row))
	    {
	//Add 5 Space
	str_array[current_symbol] = 0x0;
	current_symbol += 5;
}
	  break;

	  //RETURN
	  case  0x0D: 
	  current_line = current_symbol / pal_symbols_per_row;
	  if((current_line) < 19)
	    {
	str_array[current_symbol] = 0x0;
	current_symbol = current_line*pal_symbols_per_row + pal_symbols_per_row;
}
	  break;
	  default: str_array[current_symbol++] = received_symbol;
	}
	}
}

void pal_render(void)
{
	unsigned char i;
	char * _ptr;
	const char * _ptr1;
	//Initialize display buffer with StartUp strings
	strcpy_P(&str_array[pal_symbols_per_row*(pal_row_count-1)],&str1[0]); 	
	
	//Enable global interrupt
	asm ("sei");

	for(;;)
    {

//Wait compare interrupt signal from Timer1
sleep_mode();

//Check symbol on UART
if (UCSRA & (1<<RXC))
{
	//Parse received symbol
	pal_terminal_handle();
	//Can easealy add here RX polling buffer
	//to avoid display flickering
	continue;
}
//To make horizontal shift rendered image
i=14;
while(i--) NOP;
//Check visible field
if(video_enable_flg)
{
//OK, visible
//Main render routine
//Set pointer for render line (display bufffer)
_ptr = &str_array[raw_render * pal_symbols_per_row];

//Set pointer for render line (character generator)
_ptr1 = &symbol[0][y_line_render];
	
//Cycle for render line 
i = pal_symbols_per_row;
video_on;
while(i--)
{
	SPDR = PRG_RDB(_ptr1 + (* _ptr++)*pal_symbol_height);
	//That's a great pity can't shift data faster (8Mhz at FOSC=16Mhz)!!
	NOP;
	NOP;
	NOP;
}
//Delay for draw last symbol
i=6;
while(i--) NOP;

video_off;

}
else
{
//Not visible
//Can do something else..	
	//******Cursor handle
	//Count frame
	static unsigned int framecount;
	framecount++;
	//Here draw cursor
if (framecount&0x800)
{
	str_array[current_symbol] = ' ';
}
else
{
	str_array[current_symbol] = 0x7F;
}
	//******Cursor handle
//You can add here your own handlers..	
}

    }//for(;;)

}

static void vga_terminal_handle(void)
{
	// Parser received symbols from UART
	while(UCSRA & (1<<RXC))
	{
unsigned char current_line, received_symbol;
received_symbol = UDR;
//Check for overflow display buffer
if(current_symbol == (vga_row_count*vga_symbols_per_row))
{
	
	//Clear display buffer

	unsigned char i = vga_row_count;
	char * ptr;
	//Set pointers for clear string array
	ptr = &str_array[0];
	while(i--)
	{
//Don't use here loop, to fastest clear display buffer
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
*ptr++ = 0x0;
	};
	current_symbol = 0x0;
}
	switch ( received_symbol )
	{
	  //BackSpace
	  case  0x08: 
	  if(current_symbol)
	    {
	str_array[current_symbol] = 0x0;
	str_array[--current_symbol] = 0x0;
}
	  break;
	  
	  //TAB
	  case  0x09: 
	  if((current_symbol + 5) < (vga_row_count*vga_symbols_per_row))
	    {
	//Add 5 Space
	str_array[current_symbol] = 0x0;
	current_symbol += 5;
}
	  break;

	  //RETURN
	  case  0x0D: 
	  current_line = current_symbol / vga_symbols_per_row;
	  if((current_line) < 19)
	    {
	str_array[current_symbol] = 0x0;
	current_symbol = current_line*vga_symbols_per_row + vga_symbols_per_row;
}
	  break;
	  default: str_array[current_symbol++] = received_symbol;
	}
	}
}

void vga_render()
{
	unsigned char i;
	char * _ptr;
	const char * _ptr1;

	//Initialize display buffer with StartUp strings
	strcpy_P(&str_array[vga_symbols_per_row*(vga_row_count-2)],&str2[0]); 	
	strcpy_P(&str_array[vga_symbols_per_row*(vga_row_count-1)],&str3[0]); 	

	//Enable global interrupt
	asm ("sei");

	for(;;)
    {

//Wait compare interrupt signal from Timer1
sleep_mode();

//Check symbol on UART
if (UCSRA & (1<<RXC))
{
	//Parse received symbol
	vga_terminal_handle();
	continue;
}

//Check visible field
if(video_enable_flg)
{
//OK, visible
//Main render routine
//Set pointer for render line (display bufffer)
_ptr = &str_array[raw_render * vga_symbols_per_row];

//Set pointer for render line (character generator)
_ptr1 = &symbol[0][y_line_render >> 1];
	
//Cycle for render line 
i = vga_symbols_per_row;
while(i--)
{
	SPDR = PRG_RDB(_ptr1 + (* _ptr++)*vga_symbol_height/2);
    video_on;
	//That's a great pity can't shift data faster (8Mhz at FOSC=16Mhz)!!
	NOP;
	NOP;
}
//Delay for draw last symbol
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
video_off;

}
else
{
//Not visible
//Can do something else..	
	//******Cursor handle
	//Count frame
	static unsigned int framecount;
	framecount++;
	//Here draw cursor
if (framecount&0x800)
{
	str_array[current_symbol] = ' ';
}
else
{
	str_array[current_symbol] = 0x7F;
}
	//******Cursor handle
//You can add here your own handlers..	
}

    }//for(;;)
}

int main(void)
{
    avr_init();
	  //Check pin VGA/PAL
	if(check_PAL_jumper)
	pal_render();
	else
	vga_render();
	
    return(0);
}



static void avr_init(void)
{

  //Set pin jumper VGA/PAL
  cbi(DDRC,1);
  sbi(PORTC,1);
  
  //Enable SPI
  spi_init();

  //init uart
  uart_init();

  //Set power mode
  set_sleep_mode(SLEEP_MODE_IDLE); 	

  //Check pin mode VGA/PAL
  if(check_PAL_jumper)
  {
	  //init PAL SYNC port
	  sbi(DDRC,0);
	  //C.0 is sync:1000 ohm + diode to 75 ohm resistor
	  //MOSI is video:330 ohm + diode to 75 ohm resistor
	  
	  // Initialize Sync for PAL
	  OCR1A = 1024; 	 //One PAL line 64us
	  TCCR1B = (1<<WGM12)|(1<<CS10);//full speed; clear-on-match
	  TCCR1A = 0x00;	//turn off pwm and oc lines
	  TIMSK = 1<<OCIE1A;//enable interrupt from Timer1 CompareA
  }	
  else
  {
	  //init VGA SYNC ports
	  //HSYNC
	  sbi(PORTD,3);
	  sbi(DDRD,3);
	  //VSYNC
	  sbi(PORTD,2);
	  sbi(DDRD,2);
	
	  // Initialize Sync for VGA
	 TCCR0 = 0x00; //stop
	 TCNT0 = 0xC3; //set count, One VGA line 31.77us
	 TCCR0 = 1<<CS01; //start timer with prescaler select 1/8
	 TIMSK = 1<<TOV0; //enable interrupt from Timer0 overflow
  }

  return;
}

В чём-же собака зарыта? Он на 32й меге 640х480 выводит уже с шрифтом.

0

72

В бордюрах обязательно выдерживать паузу/тишину сигнала? Можно, что будет, если на весь размах выдавать информацию?

0

73

RDW написал(а):

В бордюрах обязательно выдерживать паузу/тишину сигнала? Можно, что будет, если на весь размах выдавать информацию?

Вот, красивые картинки - http://www.gammon.com.au/forum/?id=11608

Куча красивых картинок

http://www.gammon.com.au/images/Arduino/VGA_Output_2.png
http://www.gammon.com.au/images/Arduino/VGA_Output_6.png
http://www.gammon.com.au/images/Arduino/VGA_Output_5.png
http://www.gammon.com.au/images/Arduino/VGA_Output_7.png
http://www.gammon.com.au/images/Arduino/VGA_Output_8.png
http://www.gammon.com.au/images/Arduino/VGA_Output_9.png
http://www.gammon.com.au/images/Arduino/VGA_Output_10.png

Непонятки с пикселем, почему там много всякого мусора в один такт синхроимпульса?
http://www.gammon.com.au/images/Arduino/VGA_Output_9.png

Отредактировано Ev3658 (2016-10-20 14:55:31)

0

74

Эти картинки я видел, они на мой вопрос не дают ответа.)
Подключения делал как на картинках (к разъёму)?

0

75

Угу, совсем невозможно) https://www.youtube.com/watch?v=q6NhnOiSLk4

Нашел ещё один документик: http://lslwww.epfl.ch/pages/teaching/co … es/VGA.pdf

Отредактировано RDW (2016-10-20 15:15:45)

+1

76

Есть ещё очень интересный проект: https://github.com/dqydj/VGAtonic но тут нужны некоторые доп.железки, зато потом "летать" можно на слабых МК.
Немного циферок: http://www.epanorama.net/documents/pc/vga_timing.html
Ещё немного простых решений (для понимания): http://tinyvga.com/pic-vga

+1

77

А вот ещё угощение, вроде уже истина рядом  - http://4a4ik.blogspot.ru/2015/07/vga.html

0

78

Кажись я понял, что мешает мне понять то, что не могу понять  %-)
http://www.pvsm.ru/images/2016/05/13/vyvedenie-izobrajeniya-s-kamery-OV7670-na-VGA-monitor-s-ispolzovaniem-FPGA.png

Всё гораздо быстрей, AVR еле синхроимпульсы успевает выводить, о видео сигнале речи не может быть. Частота импульса 31 кГц и в каждый импульс нужно ещё 640 вывести импульсов, как-же в жизни всё не так, как хочется  :'(

0

79

Ev3658 написал(а):

Частота импульса 31 кГц и в каждый импульс нужно ещё 640 вывести импульсов, как-же в жизни всё не так, как хочется  :'(

Ну тебя никто не заставляет все 640 импульсов выводить, можешь вывести сколько можешь (для начала), потом оптимизируешь на большее, уменьшай просто разрешение, монитор сам как бы отрисует промежутки лучем, только задержки на запуск ставишь и всё.

0

80

Чтобы проще было понять:
Пусть строчная частота = 31,5 кГц. То есть вывод одной строки пикселей длится 1 (сек) /31500 (Гц) = ~3,1746 мкс.
Пусть в строке 640 пикселей, без бордюров. Один пиксель выводится (длится) 3,174 мкс / 640 = ~ 0,0496 мкс, что в МГц составляет 20,16 (частота следования пикселей в строке).
Иными словами, если настроить прерывание по таймеру, пусть внешнему, с частотой 20,16 МГц (частота вывода пикселей), то при каждом входе в прерывание, контроллер должен иметь данные о пикселе, который он должен выдать на выход. Это как минимум. Плюс учесть стандартную длительность строчного импульса.
Либо, прерывание каждые 31500 Гц. Но тогда нужно иметь всю строку пикселей. И последовательно вывести все эти пиксели с точным интервалом (0,0496 мкс на пиксель).

С кадровой заморачиваться особо не стОит. Она значительно ниже строчной. И лишь дает команду устройству вывода о том, что последняя строка закончилась, и следующая строка будет в новом кадре. Программно, можно просто считать строки до величины вертикального разрешения кадра, и по его достижении формировать кадровый импульс.

0

81

SIvan написал(а):

если настроить прерывание по таймеру, пусть внешнему, с частотой 20,16 МГц

Да вот тут-то и проблема, выводы щупал контроллера, не могут они вывести 20мГц.
Можно взять регистр и сдвигать его и бит выводить на порт или весь регистр в порт.
Atmega справляется с синхронизацией без проблем, можно приправить Xmega только под выводы видео данных, кидая ей информацию с памяти. Это 40 штук 16 битных регистров.
Пробовал общаться в Bascom с регистрами на прямую R0 - R10, словил кучу глюков, просто жесть, они сами по себе живут.

0

82

Складывается такое впечатление, что вообще нереально это сделать, но у народа как-то на мегах всё работает же. ;)
Значит делаем проще, ненужно гнаться за пикселем, если не можем это организовать (я уже на это всю тему намекаю, пора понять), просто делаем Vsync и Hsync (по времянкам), там далее тупо при отрисовки линии пытаемся в одно и тоже время выплюнуть данные (хотя бы тот же пиксель, дернуть данные по RGB) и смотрим результат.
Прошло столько времени, а у тебя всё ещё нет вообще никакого вывода на экран, надо срочно включать фантазию и перепробовать кучу алгоритмов и нечего лазать в регистры, там всё ок. :Р

0

83

А может ещё проще всё сделать, по типу магнитофона )))
Берём увесистую память + ещё одна, делаем генератор адреса и такта и тупо прям с выводов ячейки выводим:
DB0 - горизонтальынй
DB1 - вертикальный
DB2 - красный
DB3 - синий
DB4 - зелёный
DB6 - конец вывода кадра (для контроллера, чтоб знал, когда можно переключиться на другую память)
DB6 по DB7 или по DB15 в расход  :D

Записываем в самом начале биты синхронизации, далее другую память забиваем и даём команду переключиться на готовую память.

Получается, нужно менять адрес с более, чем частотой 20 мегагерц.

Отредактировано Ev3658 (2016-10-25 12:58:32)

0

84

Блин, я тебе об этом тоже говорил несколько страниц назад. :)
Ещё раз:

- берем ОЗУ статик приличного объёма и с несколькими выходами (в дальнейшем их можно обвязать резисторами делителями и рисовать полутона цвета);
- делаем счетчик адреса на МК (тупо перебор его), по ходу дела генерим V/Hsync (дергаем только в нужный момент времени);
- данные с МК о V/Hsync выводим на VGA, а цвет тупо с ОЗУ;
- далее нужно просто придумать как данные с МК загружать в ОЗУ...
- ВСЁ!

Для экспериментов, нам ОЗУ пока нафиг нужна, ибо надо подобрать только правильные тайминги на V/Hsync, для понимания происходящего, просто один из цветов делаем статикой (подаем какое-то значение напряжения).
В итоге надо добиться того, чтобы монитор стал выдавать стабильную синхронизацию кадров и отображать бланк-скрин с каким-то цветом.
Как только этот период ты пройдёшь, дальше уже всё можно потихоньку усложнять.

0

85

Ev3658 написал(а):

DB0 - горизонтальынй
DB1 - вертикальный

Такой подход утопичный, ибо: тебе придется по хорошему (и правильному) рисовать всю картину от начала до конца в ОЗУ, потом её гонять по кругу, НО, при изменении данных, у тебя будет всё прерываться (пока ты пишешь в ОЗУ), синхронизация V/Hsync не будет идти, картинка будет дергаться всегда при смене информации... + объём информации...а наша задача, разгрузить МК ещё для возможно других манипуляций.
Ну и вообще, зачем синхронизацию V/Hsync вообще тратить место/время, оно должно аппаратно (как бы) постоянно работать.

0

86

И главное, т.к. VGA стандарт построчный (не ТВ через строку), то чтобы картинка не дергалась, надо выводить минимум 50Гц. Даже на LCD статике ты эту смену кадров начнешь глазом ощущать как дискомфорт.

0

87

RDW написал(а):

....НО, при изменении данных, у тебя будет всё прерываться (пока ты пишешь в ОЗУ), синхронизация V/Hsync не будет идти, картинка будет дергаться всегда при смене информации... + объём информации...а наша задача, разгрузить МК ещё для возможно других манипуляций......


Да, но если использовать два МК!
К примеру, Xmega32 будет генерировать только адрес для ОЗУ, она будет генератором. Так, как адрес будет 16 битный, то тут есть загвоздка в такте после переполнения первой 8 битной переменной адреса.
Xmega перебирает адрес от 0 до 639, дальше до 800 (сигнал горизонт.синхронизации) не перебирает, а меняет ячейку адреса, которая выбирается пару тактов ОЗУ. Тем самым мы просто делаем генератор адресного пространства и всё, тупо магнитофон, в котором конец строки служит записанный байт в одной из ячеек ОЗУ.
То-есть Xmega перебирает адресное пространство ОЗУ, а из ОЗУ сразу всё валит на экран.
Момент переключения ОЗУ будет обозначаться одним битом. То-есть отрисовали экран, если есть сигнал на переключение, то дождавшись бита, мы переключаем ОЗУ в момент вертикальной синхронизации.
Паузы момента горизонтальной синхронизации используем для переключения второй части 20 битного адреса ОЗУ из видео карты HY514400A, а момент вертикальной синхронизации используем для переключения ОЗУ.
ОЗУ уже сможем не спеша подготавливать отдельным контроллером или просто уже основным контроллером, если выводов не жалко. Как-то так.
Проблема тут есть схематичная, как-то надо шину данных переключать с одной ОЗУ на другую, да и скорость переборки адреса 20 мегагерц - жесть.

0

88

Ev3658 написал(а):

Xmega32 будет генерировать только адрес для ОЗУ, она будет генератором

Практически счетчиком.
Но надо не забывать, что скорость перебора нужна в районе 20МГц (а лучше и быстрее), как я понял, у тебя дергать одной ногой даже не получилось, т.ч. МК в такой конфигурации уже не подходит для операций (не справится).

Ev3658 написал(а):

Так, как адрес будет 16 битный

Вообще там адрес от 18 бит (640х480=307200 = 19 бит) - это 3 порта МК.

У меня где-то валялась XC9572XL и программатор для неё, я как-то на ней делал аппаратный UART на логике и даже всё получилось, так вот, можно на ней сделать этот чертов счетчик адреса со всеми синхроимпульсами и возможно даже управление с загрузкой ОЗУ, проблема только в том, что Я НЕ ХОТЕЛ ЭТИМ ЗАНИМАТЬСЯ!  :D Мне просто некуда ставить второй монитор, который под столом в ногах валяется...а подключать всё на месте...ммм...темно и пыльно.))) Зато эта штука могет работать до 178 MHz.
Один чел даже готовые проект забацал под эту штуку: http://www.ulrichradig.de/home/index.ph … it_c_graka
Правда всего лишь 256х256 разрешение.)

Отредактировано RDW (2016-10-25 15:14:33)

0

89

Интересная статья для понятия принципов работы и сами тайминги на разрешения.

0

90

RDW написал(а):

но у народа как-то на мегах всё работает же

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

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » ТВ выход на bascom avr