О видео сигнале. | Если Вы не знаете как выглядит видеосигнал, Вы не сможете получить его программным способом. | |
Создание видеосигнала программным способом. | Как эффективно создать видеосигнал с помощью PIC, если Вы знаете как этот сигнал должен выглядить. | |
Наложение видео на существующий сигнал. | Краткое описание того, как с помощью PIC программным способом наложить графику. | |
Цветной видеосигнал и почему PIC16F84 не может его создать. | Краткое описание того, как программным способом генерируется цветной видеосигнал и почему в этом случае следует использовать SX-контроллер. |
. | ||
Электронный луч рисует изображение. | Две части изображения образуют одно сплошное. |
Осциллограмма строки видеосигнала. |
DIGITA.ru: Телевизоры, DVD-плееры, видеомагнитофоны, видео-плееры. Аппаратура Hi-End класса. |
dnop MACRO LOCAL label label goto label+1 ENDMDELAY – макрос паузы, длительность которой в три раза больше числа, записанного в регистр W.
Delay MACRO LOCAL label movwf delaycnt label decfsz delaycnt goto label ENDM
При соединении обоих выходов D0 и D1 с землей, напряжение на видеовходе телевизора будит равно 0, что соответствует синхроуровню. |
Выход D1 соединен с землей, а выход D0 - с +5В. В этом случае резистор 450 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 900 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,33В, что очень близко к уровню черного. (Истинный уровень черного 0,3В.) |
Выход D0 соединен с землей, а выход D1 - с +5В. В этом случае резистор 900 Ом включен параллельно 75 Ом-ному сопротивлению видеовхода телевизора, а резистор 450 Ом подключен к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 0,67В. Это уровень серого. |
Оба выхода D0 и D1 соединены с +5В. В этом случае резисторы 900 Ом и 450 Ом включены параллельно, а 75 Ом-ное сопротивление видеовхода телевизора, подключено к этой цепи последовательно. Этот делитель напряжения позволяет получить на видеовходе уровень 1В. Это уровень белого. |
Осциллограмма сигнала, генерируемого кодом, который приведен ниже. Низкие импульсы - это серые полосы, высокий импульс в середине - белая полоса. | Так выглядит видеосигнал на экране телевизора. Две серых и одна белая полосы. |
main: movlw COLOR_SYNC ;get sync level (1) ;**** 4us sync **** movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) ;**** 8us delay **** ; movwf VIDEO_PORT ;set port value (1) movlw 7 ;setup delay time (1) DELAY ;delay for 7us (21) movlw COLOR_GRAY ;get gray color (1) ;*** 52us image data *** movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) movwf VIDEO_PORT ;set port value (1) movlw 19 ;setup delay time (1) DELAY ;delay for 19us (57) movlw COLOR_WHITE ;get white color (1) movwf VIDEO_PORT ;set port value (1) movlw 3 ;setup delay time (1) DELAY ;delay for 3us (9) movlw COLOR_BLACK ;get black color (1) movwf VIDEO_PORT ;set port value (1) movlw 19 ;setup delay time (1) DELAY ;delay for 19us (57) movlw COLOR_GRAY ;get gray color (1) movwf VIDEO_PORT ;set port value (1) movlw 2 ;setup delay time (1) DELAY ;delay for 2us (6) DNOP ;delay for two clocks goto main ;once again (2) | Этот код позволяет генерировать на черном фоне две серых и одну белую полосы. ( Внимание! Этот код написан мной по памяти и не тестировался, поэтому нет гарантии что он рабочий. ) |
movlw 8 ;number of pixels is 8 (1) movwf counter ;set counter to number of pixels (1) shiftloop: movlw COLOR_BLACK ;set default color to black (1) rrf thedata,f ;rotate data right, make put bit in carry (1) skpnc ;check if carry, if not pixel remains black (1 or 2) movlw COLOR_WITE ;carry was set, set color to white (1) movwf VIDEO_PORT ;set color to DA (1) decfsz counter ;decrease counter, check for zero (1 or 2) goto shiftloop ;if more pixels, keep looping (2) | Этот код выводит биты одного байта в видеопорт. Таким образом на экран можно вывести различые изображения. |
movfw thedata ;set up the byte to be shifted out movwf PORTB,f ;now the first bit becomes visible (1 clock) rrf PORTB,f ;second bit is shifted out (1 clock) rrf PORTB,f ;third bit is shifted out (1 clock) rrf PORTB,f ;fourth bit is shifted out (1 clock) rrf PORTB,f ;fifth bit is shifted out (1 clock) rrf PORTB,f ;sixth bit is shifted out (1 clock) rrf PORTB,f ;sevenths bit is shifted out (1 clock) rrf PORTB,f ;eighth bit is shifted out (1 clock) | Этот код выводит биты одного байта в видеопорт, как в предыдущем примере, но делает это на много быстрее. При этом программа использует все восемь бит выходного порта. |
Как было сказано выше, символ рисуется только каждую вторую строку. |
shortsync: ; label "Shortsync", entry for short sync generator movwf counter1 ; set counter1 to number of shortsyncs shortsync_l0: ; label "Shortsync_l0", short sync count loop entry bcf porta,0 ; set level to synclevel (bit 1) bcf portb,0 ; set level to synclevel (bit 0) dnop ; movlw 0x1D ; set counter2 to "30us" movwf counter2 ; nop ; bsf porta,0 ; set level to black shortsync_l1: ; label "Shortsync_l1", short sync delay loop decfsz counter2 ; do delay counting goto shortsync_l1 ; loop if not finished with delay decfsz counter1 ; count number of shortsyncs goto shortsync_l0 ; if more shortsyncs, keep looping retlw 5 ; return and set w to number of longsyncs (5 longsyncs) vertsync: ; label "vertsync", this is the label to call from main movlw 5 ; set number of shortsyncs to 5 btfss videostuff,0 ; check if first field movlw 6 ; yes, change number of short syncs to 6 call shortsync ; do those short syncs incf videostuff ; update field for the new frame longsync: ; label "longsync", just to make it easy to understand movwf counter1 ; set synccounter to number of longsyncs longsync_l0 ; label "longsync_l0", long sync count loop entr movlw 0x1D ; set counter to 30us movwf counter2 ; set level to sync (bit 1) bcf porta,0 ; set level to sync (bit 0) bcf portb,0 ; label "Shortsync_l1", long sync delay loop longsync_l1 ; do delay counting decfsz counter2 ; loop if not finished with delay goto longsync_l1 ; nop ; set level to black bsf portb,0 ; nop ; count number of shortsyncs decfsz counter1 ; if more shortsyncs, keep looping goto longsync_l0 ; set number of shortsyncs to 5 movlw 5 ; check if second field btfss videostuff,0 ; yes, do 4 shortsyncs instead movlw 4 ; do those short syncs goto shortsync |
Этот код генерирует вертикальные синхроимпульсы, как было описано выше. Код состоит из участков, которые выполняются по нескольку раз. Сначала вызывается подпрограмма коротких импульсов, затем подпрограмма длинных импульсов, потом в последней строке кода снова вызывается подпрограмма коротких импульсов. Программа кажется запутанной, но это позволяет сократить ее длинну и сэкономить память программ. |
. | ||
Игра Pong в действии. | Экран меню. |
Игра Tetris в действии. |
Осциллограмма строки цветного сигнала. Сначала передается синхроимпульс длительностью 4мкс, затем в течении 8мкс задержки передается несущая цвета. В оставшиеся 52 мкс передается информация об изображении. |