; filename: "tv_sync_gen.asm" ; title: PIC CCIR TV Sync Generator ; An attempt to generate standards compliant TV sync signal. Uses external 8 MHz crystal. ; 230708 v0.1 First daft ; 230711 v0.2 VSYNC complete pulse train ; GPL Copyleft 2023 pic@polonai.se LIST P=12F683, F=INHX8M #include __CONFIG _XT_OSC & _WDT_OFF & _MCLRE_ON & _CP_OFF & _BOREN_OFF ERRORLEVEL -302 ; sod compiler message about using proper bank ; Equates RESET_V EQU 0x00 ; Address of RESET Vector ; Registers FLAGS EQU 0x20 ; Register containing flags DELAY EQU 0x21 ; Counter for delays #define SYNC GPIO,0 ; COmposite sync signal (active LOW) #define HS GPIO,1 ; Horizontal sync (active LOW) #define VS GPIO,2 ; Vertical sync (active LOW) #define FIELD FLAGS,0 ; needed to synchronize V- and HSYNC ORG 0x00 GOTO START ORG 0x04 ; Interrupts BTFSC PIR1,TMR1IF ; Test Timer1 interrupt flag (every 20 ms) GOTO VSYNC BCF INTCON,TMR0IF ; Clear TMR0 interrupt (every 64 us) MOVLW 0x89 MOVWF TMR0 ; Preload TMR0 for 64 us BCF SYNC ; 4.5 us CALL p45 BSF SYNC RETFIE VSYNC BCF INTCON,TMR0IE ; Disable TMR0 interrupt BCF PIR1,TMR1IF ; Clear Timer1 interrupt flag (every 20 ms) MOVLW 0x63 ; Preload Timer1 for 20000 µs MOVWF TMR1H MOVLW 0xCD MOVWF TMR1L BCF VS BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL SERRATION BSF SYNC CALL p45 BCF SYNC CALL SERRATION BSF SYNC CALL p45 BCF SYNC CALL SERRATION BSF SYNC CALL p45 BCF SYNC CALL SERRATION BSF SYNC CALL p45 BCF SYNC CALL SERRATION BSF SYNC CALL p45 BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC CALL EQUALIZING BCF SYNC CALL p25 BSF SYNC BSF VS BTFSS FIELD GOTO ODD BCF FIELD MOVLW 0x95 MOVWF TMR0 ; Preload TMR0 for 62.0 us GOTO ENDVSYNC ODD BSF FIELD MOVLW 0xD6 MOVWF TMR0 ; Preload TMR0 for 30.0 us ENDVSYNC BSF INTCON,TMR0IE ; Re-enable TMR0 interrupt BCF INTCON,TMR0IF ; Clear TMR0 interrupt (just in case) RETFIE ; End interrupt routines ; Subroutines EQUALIZING MOVLW 0x11 ; 29.5 us equalizing pulse interval MOVWF DELAY DECFSZ DELAY GOTO $-1 NOP NOP RETURN SERRATION MOVLW 0x10 ; 27.5 us serration pulse interval MOVWF DELAY DECFSZ DELAY GOTO $-1 NOP RETURN p25 ; Equalizing pulse duration (2.5 us) RETURN p45 ; Sync/serration pulse duration (4.5 us) NOP NOP NOP NOP RETURN ; End subroutines START ; Init stuff CLRF STATUS ; Do initialization, select Bank 0 CLRF INTCON ; Clear flags, disable interrupts CLRF PCLATH ; Keep in lower 2KByte BSF STATUS,RP0 ; Select Bank 1 CLRF OPTION_REG BSF OPTION_REG,PSA ; Prescaler assigned to WDT, TMR0 1:1 (0.5 us) CLRF TRISIO ; All ports output CLRF ANSEL ; All inputs digital CLRF OSCCON ; External 8 MHz XTAL CLRF PIE1 BSF PIE1,TMR1IE ; Enable Timer1 interrupt BCF STATUS,RP0 ; Select Bank 0 MOVLW 0x07 MOVWF CMCON0 ; All inputs digital CLRF T1CON BSF T1CON,TMR1ON ; Enable Timer1 CLRF GPIO CLRF FLAGS BSF HS BSF VS BSF SYNC BSF INTCON,TMR0IE ; Enable TMR0 BSF INTCON,PEIE ; Enable Peripheral (Timer1) interrupt BSF INTCON,GIE ; Enable global interrupts GOTO $ END