// カラーバービデオ信号ジェネレータ(Fck=14.32MHz) // 2007.1.9 koyama@cc.hirosaki-u.ac.jp #include #include #include #define Fck 14.32 #define VS 156 #define HS 12 #define SYN 0x00 #define BLK 0x02 #define WHT 0x07 #define SCl 0x01 #define SCh 0x03 #define YEl 0x04 #define YEh 0x07 #define CYl 0x03 #define CYh 0x07 #define GRl 0x02 #define GRh 0x06 #define MAl 0x02 #define MAh 0x05 #define REl 0x01 #define REh 0x05 #define BLl 0x01 #define BLh 0x04 #define nop() asm volatile("nop"::) #define sc(a,b) {PORTB=a;PORTB=a; PORTB=b;PORTB=b;} #define sc8(a,b) {sc(a,b);sc(a,b);sc(a,b);sc(a,b);sc(a,b);sc(a,b);sc(a,b);sc(a,b);} #define sc10(a,b) {sc8(a,b);sc(a,b);sc(a,b);} #define sc30(a,b) {sc10(a,b);sc10(a,b);sc10(a,b);} void colorline(){ // カラー 1 line uint8_t i; for(i=0;i<24;i++) PORTB=WHT; // WHITE nop();nop(); sc30(CYh,CYl); // CYAN nop(); sc30(BLh,BLl); // BLUE nop();nop(); sc30(REh,REl); // RED nop(); sc30(GRh,GRl); // GREEN } void grayline(){ // gray 1 line uint8_t i; for(i=0;i<30;i++) PORTB=6; // GRAY for(i=0;i<30;i++) PORTB=5; // GRAY for(i=0;i<30;i++) PORTB=4; // GRAY for(i=0;i<30;i++) PORTB=3; // GRAY } ISR(TIM1_COMPA_vect){} // 63.5us int main (void){ uint8_t line=0; // 走査線カウンタで63.5us毎にカウントアップ uint8_t i; PORTB =0x00; DDRB=0x07; // xxxxxooo OCR1A=OCR1C=63.5*Fck/4-1;TCCR1 =0x83; // CTC on OCR1C=226(63.5us), CK/4 TIMSK=(1<30&&line<=200) colorline(); // 31〜200 はcolor else if(line>200) grayline(); // 201〜255 はgray PORTB=BLK; } } }