Хочу разобраться как автор этого исходника строит изображение на VGA мониторе.
Для примера возьмем кусок кода, который отвечает за вывод картинки 640*480*60 Гц
Спойлер
Код:
;*************************************
R640x480x60Hz: /* For VGA 640x480:60Hz the synchro signals are negative polarised */
cbi DEO_u8SyncOut,DEO_biSyncV
//PWM
ldi acc,((1<<WGM13)|(1<<WGM12)|(1<<CS10)) // clk/1
out TCCR1B,acc
ldi acc,((1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)) //mode14, set on compare match clear at TOP
out TCCR1A,acc
/* 20MHz / 31469Hz = 635.54 = 0x027B*/
/* Hsync pulse = 3.77us, at 50ns/instr cycle = 75.4 = 0x004B */
ldi acc,0x02
out ICR1H,acc
ldi acc,0x7B
out ICR1L,acc
ldi acc,0x00
out OCR1BH,acc
ldi acc,0x4A
out OCR1BL,acc
//38 = 0x0025
ldi BC,0x1D
ldi D,20
ldi E,3
//2 lines
ldi DEO_u8CounterPH,0x00
ldi DEO_u8CounterPL,0x02
mov P,DEO_u8CounterPL
//32 lines = 0x0020h
ldi DEO_u8CounterPQH, 0x00
ldi DEO_u8CounterPQL, 0x22
mov PQ,DEO_u8CounterPQL
//513 lines = 0x0201h
ldi DEO_u8CounterPQRH, 0x02
ldi DEO_u8CounterPQRL, 0x01
mov PQRH, DEO_u8CounterPQRH
mov PQRL, DEO_u8CounterPQRL
//524 lines = 0x020Ch
ldi DEO_u8CounterPQRSH,0x02
ldi DEO_u8CounterPQRSL,0x0C
mov PQRSH,DEO_u8CounterPQRSH
mov PQRSL,DEO_u8CounterPQRSL
ret
;*************************************
Судя по fuse bits микроконтроллер работает на частоте 4,8 МГц. Итого время исполнения одного машинного кода 1/4,8 МГц = 0,21 мкс.
С кодом PWM, то есть настройкой прерывания таймера на частоту 31469 Гц тут все понятно и вопросов не вызывает. Это строчная развертка и ее длительность 31,78 мкс с импульсом синхронизации 3,77 мкс. И это время 1 lines по коду.
Кадровая развертка равна 525 линиям и это число задается в последнем блоке кода записью значения 0х020С в регистры
DEO_u8CounterPQRSH / DEO_u8CounterPQRSL.
Это тот участок кода с которым я разобрался. Но, к сожалению, автор не прокомментировал расчеты значений для других регистров:
BC
D
E
DEO_u8CounterPH / DEO_u8CounterPL
DEO_u8CounterPQH / DEO_u8CounterPQL
DEO_u8CounterPQRH / DEO_u8CounterPQRL
Вот в этом вопросе я и прошу помощи у участников форума!
В сети есть несколько источников, я приведу два из них, в которых я пытался найти ответ на свои вопросы:
1)
https://www.epanorama.net/documents/pc/vga_timing.html2)
https://vsblogs.wordpress.com/2012/10/1 ... ls-part-1/В первом источнике указан так называемый
"VGA industry standard" 640x480 pixel mode
Спойлер
General characteristics
Clock frequency 25.175 MHz
Line frequency 31469 Hz
Field frequency 59.94 Hz
One line
8 pixels front porch
96 pixels horizontal sync
40 pixels back porch
8 pixels left border
640 pixels video
8 pixels right border
---
800 pixels total per line
One field
2 lines front porch
2 lines vertical sync
25 lines back porch
8 lines top border
480 lines video
8 lines bottom border
---
525 lines total per field
если еще блоки кода 2 lines и 32(хотя скорее всего 33) lines Еще как-то совпадают со значениями 2 lines front porch и (2 lines vertical sync + 25 lines back porch) = 33, то откуда взялись следующие 513 lines?
Да и значения регистров [b]BC, D, E вообще выше моего понимания, хотя на приведенных в источниках диаграммах сигналов есть такие временные значения импульсов. Но, то ли я не так считаю, только не совпадает у меня значение времени для них