#include #define sync PIN_A0 //TV Synchronism Output #use fast_io(A) int image_block=0; int line_count=0; int field=1; int interlace=1; #INT_TIMER0 void TIMER0_isr(void) { set_timer0(13); //Since the timer overflows at 64.0 us, this offset output_low(sync); //creates a 63.5 us overflow (horizontal period: H). switch (image_block){ case 0: line_count++; //Pre-equalizing pulses: 2.3 us, spaced 1/2 delay_cycles(11); //horizontal period. Total: 6 pulses (3H). output_high(sync); delay_us(29); delay_cycles(2); output_low(sync); delay_cycles(18); output_high(sync); if(line_count==3){ line_count=0; image_block=1; } break; case 1: line_count++; //Vertical synchronism, including 6 serrated delay_us(24); //pulses, spaced 1/2H. Total duration: 3H. delay_cycles(3); output_high(sync); delay_cycles(47); output_low(sync); delay_us(25); delay_cycles(5); output_high(sync); if(line_count==3){ line_count=0; image_block=2; } break; case 2: line_count++; //Post-equalizing pulses: 2.3 us, spaced 1/2 delay_cycles(5); //horizontal period. Total: 6 pulses (3H). output_high(sync); delay_us(29); delay_cycles(2); output_low(sync); delay_cycles(18); output_high(sync); if(line_count==3){ line_count=0; //Next horizontal synchronism pulse will arrive image_block=3; //at 1/2H if on Field 1. Otherwise (Field 2) if(field==2){ //it will arrive at 1H (interlaced scanning). set_timer0(31); line_count=1; } } break; case 3: line_count++; //Horizontal synchronism pulses: 4.7 us, spaced delay_cycles(20); //1 H. output_high(sync); if(line_count==254){ line_count=0; //Last horizontal line of Field 1 (line 263) image_block=0; //is just 1/2H (interlaced scanning). if(interlace==1){ if(field==1){ set_timer0(171); } field=3-field; } else field=1; } break; default: break; } } void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_BIT); //64.0 us overflow SET_TRIS_A(0x00); output_low(sync); enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); while(TRUE); }