;************************************************************* ; program testsync.asm ; 061223 m-oreglia@uchicago.edu ; ; NTSC interlaced sync with equalizer pulses ; ... works with framegrabbers and fussy video monitors ; ; Based on the programs of Bruce Land (Cornell) and ; Alberto Ricci Bitti ; ; For 16 MHz Atmel ATtiny2313, but should work with most AVR ;Outputs on PortD: ; 0 = Sync, feeds 1000 Ohm resistor ; 1 (or 1+0) = Video, feeds 330 Ohm resistor ; ... both meet 75 ohms to ground ; ;************************************************************** .LISTMAC .MACRO hsync ;horizontal sync pulse clr R16 out PortD, R16 ldi R16, 22 ;4.7us __HS1: dec R16 brne __HS1 ldi R16, 1 out PortD, R16 .ENDM .MACRO heq ;equalizing pulse pair clr R16 out PortD, R16 ldi R16, 10 ;2.3us __HE1: dec R16 brne __HE1 ldi R16, 1 out PortD, R16 ldi R16, 153 __HE2: dec R16 brne __HE2 clr R16 out PortD, R16 ldi R16, 10 __HE3: dec R16 brne __HE3 ldi R16, 1 out PortD, R16 .ENDM .MACRO vser ;vertical sync serration pair (4.7us) clr R16 out PortD, R16 ldi R16, 143 ;27us __VS1: dec R16 brne __VS1 ldi R16, 1 out PortD, R16 ldi R16, 22 __VS2: dec R16 brne __VS2 clr R16 out PortD, R16 ldi R16, 143 __VS3: dec R16 brne __VS3 ldi R16, 1 out PortD, R16 .ENDM .MACRO half ;wait half a line and reset timer __H1: in R18, TCNT1L in R18, TCNT1H cpi R18,1 brlo __H1 __H2: in R18, TCNT1L cpi R18, LOW(504) ;1018/2, less a few instr brlo __H2 sei ldi R18, HIGH(1017) ;set timer to compare-1 out TCNT1H, R18 ldi R18, LOW(1017) out TCNT1L, R18 reti .ENDM .include "tn2313def.inc" ;*************************************************************************** ;* VARIABLE ASSIGNEMENTS ;*************************************************************************** .CSEG .def SaveStatus = r0 ;status buffer during interrupts .def Pout = r16 ;byte written to PortD .def Arg1 = r17 .def Arg2 = r18 ;also used by HALF macro .def Pari = r19 ;*************************************************************************** ;* Constants ;*************************************************************************** ; .equ LineTime = 1018 ;instructions per line ;set video level to white when high, black when low .equ Sync = 0b00000000 ;HS on .equ Shelf = 0b00000001 .equ Video = 0b00000011 ;write pixel ;*************************************************************************** ;* VECTORS ;*************************************************************************** ;--------------------------------- ;interrupt service vectors .org $0000 rjmp RESET ;reset vector .org OC1Aaddr rjmp NEWLINE ;TIMER1_OCA vector ;*************************************************************************** ;* ;* MAIN PROGRAM ;* ;*************************************************************************** ;* INITAILIZATION ;*************************************************************************** RESET: ldi Arg1, low(RAMEND) out SPL, Arg1 ldi Arg1, 0b01111111 ;set port D bits to outputs out DDRD, Arg1 ldi Arg1, 0b00000001 ;preset output state out PortD, Arg1 ldi Pout, Sync ;Timer1A: ldi Arg1, 9 out TCCR1B, Arg1 ;full speed, clear on match ldi Arg1, 0 out TCCR1A, Arg1 ;no pwm, oc ldi Arg1, HIGH(1018) ;1018 for 63.6us line out OCR1AH, Arg1 ; write H before L ldi Arg1, LOW(1018) out OCR1AL, Arg1 ;Interrupt: ldi Arg1, (1<