; filename: "video_50hz_bounce.asm" ; title: PIC CCIR Video 50 Hz Bounce Generator ; An attempt to generate standards compliant TV sync signal with 50 Hz bounce. Uses external 8 MHz crystal. ; 231011 v0.1 First daft, copied from tv_sync_gen.asm ; 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 LINES EQU 0x22 ; Lines counter for letterbox, 1-99 black, 100-255 white, 256-vsync black #define SYNC GPIO,0 ; Composite sync signal (active LOW) via 1.0k resistor #define WHT GPIO,1 ; White signal (50 Hz bounce) via 470R resistor #define VS GPIO,2 ; Vertical sync (active LOW) #define FIELD FLAGS,0 ; needed to synchronize V- and HSYNC #define LBOX FLAGS,1 ; Letterbox active flag 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 WHT NOP ; Generate front porch (1.5 us) NOP NOP BCF SYNC ; 4.5 us CALL p45 BSF SYNC CALL P45 ; Generate back porch (4.5 us) BTFSC LBOX ; Letterbox? BSF WHT ; Yes DECFSZ LINES,F ; Decrement lines counter RETFIE BTFSC LBOX ; Letterbox active? GOTO BLACK ; Yes BSF LBOX MOVLW 0x9C ; 156 white lines MOVWF LINES RETFIE BLACK BCF LBOX 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) MOVLW 0x60 MOVWF LINES ; 96 black lines (letterbox) 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 VS BSF SYNC BSF INTCON,TMR0IE ; Enable TMR0 BSF INTCON,PEIE ; Enable Peripheral (Timer1) interrupt BSF INTCON,GIE ; Enable global interrupts GOTO $ END