// // ir-led.c // Ir-remote controled LED illuminator // // 2002.7.28 by M.INOUE, Setsunan University // #include "pic.h" // ヘッダ・ファイル __CONFIG(0xFFF6); // コンフィギュレーション・ビットの設定 // コード・プロテクト=OFF, // パワーアップ・タイマ=ON // ウォッチドッグ・タイマ=ON, // HS発振 ///////////////////////////////////////////////////////////////////////// ///////////////////// 設定パラメータ //////////////////////////////////// unsigned char REPETATION=10, // スピードを決める T_RG1=0, T_RG2=0, // Red --> Green 最初と最後のカット時間 T_GB1=0, T_GB2=0, // Green --> Blue 最初と最後のカット時間 T_RB1=0, T_RB2=0; // Blue --> Red 最初と最後のカット時間 ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// unsigned char i2, j2, cnt2=1; unsigned char i, j=0, k=0, WIDTH=64, cnt=0, cnt_bit=0; unsigned char FST, FIRST_SENSE=24; //24以下 unsigned char PRE_LEARN=0, PRE_LEARN2=0, LEARN=0, STOP=0, EEPRM=0; unsigned char DATA, TMP[5], TMP_REF; unsigned char PULSE_H, PULSE_L, PULSE=0; unsigned char HL=0, ADR_BASE, POWER=0, RST=0; unsigned char porta_out=0xFF, portb_out=0xFF; // ポートAとBの出力バッファ unsigned char RGB=2, FALL, RISE, SONY, A_FLAG, RR=1, GG=1, BB=1; void ioport(void); // I/Oポート設定関数のプロトタイプ main() // メイン関数 { TRISA = 0xFF; // ポートA0-4を入力用に設定 TRISB = 0x00; // ポートB0-7を出力用に設定 OPTION = 0xd0; // タイマ0のクロックは内部クロック、1:1プリスケーラ TMR0 = 0; // タイマ0に0を書き込む T0IF = 0; // タイマ0割り込みフラグを0にする T0IE = 1; // タイマ0割り込みを使う GIE = 1; // 割り込みを使う // 各変数の初期化 for(i=0; i<5; i++) TMP[i]=0x00; RISE = T_RG1; FALL = T_RG2; i2 = 1 + RISE; j2 = REPETATION; A_FLAG=RA3; if(!RA3) { SONY=(0x01-RA2&0x01); EEPROM_WRITE(0x0F,SONY&0xFF); TRISA=0xFF; } if(A_FLAG){ TRISA=0xF0; POWER=1; } SONY=EEPROM_READ(0x0F); FST=24;FST=28-SONY*4;//28, SONYは24 while(1) { if(RST==0)CLRWDT(); // ウォッチドッグ・タイマを0にする ioport(); } } void ioport(void) // I/Oポート設定関数 { PORTA=porta_out; // ポートAに0を書き込む PORTB=portb_out; // portb_outの内容をポートBに書き込む } void interrupt isr(void) // 割り込み関数 { if(T0IF){ // タイマ0割り込み? T0IF=0; // タイマ0割り込みフラグを0にする if(!LEARN){ // 学習モードスタートパルス検出ルーチン FIRST_SENSE=FIRST_SENSE-j; PULSE=PULSE+k; if(!RA4 && !PRE_LEARN)j=1; if(RA4 && !PRE_LEARN){ j=0; FIRST_SENSE=FST;//24 } if(RA4 && PRE_LEARN){ k=1; PRE_LEARN2=1; } if(!RA4 && PRE_LEARN2) { k=0; j=0; PULSE=0; LEARN=1; HL=1; porta_out=0x0F; portb_out=0xF0; } if(!FIRST_SENSE && !PRE_LEARN){ FIRST_SENSE=FST; //24 if(!RA4 && !PRE_LEARN){ PRE_LEARN=1; j=0; } } } if(LEARN && !STOP){ // 信号解析ルーチン PULSE=PULSE+1; if(PULSE > 23+SONY*12){//23 sony は24以上松下は23以上 if(cnt<=1){ j=0; k=0; PULSE=0; HL=0; PRE_LEARN=0; PRE_LEARN2=0; LEARN=0; } if(cnt>1) STOP=1; } if(HL && RA4){ PULSE_H=PULSE; PULSE=0; HL=0; } if(!HL && !RA4){ PULSE_L=PULSE; PULSE=0; HL=1; if(!SONY) if(PULSE_H >= PULSE_L) DATA=0x01<= PULSE_H) DATA=0x01<4)STOP=1; } if(!A_FLAG && STOP && !EEPRM){ ADR_BASE=0x00+((1-RA3)<<4)+((1-RA2)<<5); for(i=0; i<5;i++){ EEPROM_WRITE(ADR_BASE + (i&0xFF), (TMP[i])&0xFF); } EEPRM=1; } if(!A_FLAG && EEPRM){ porta_out=0x0F; portb_out=0x0F; } if(A_FLAG && STOP){ EEPRM=1; for(j=0; j<4 ; j++){ DATA=0x00; for(i=0;i<5;i++){ TMP_REF=EEPROM_READ((j*0x10) + (i&0xFF)); DATA=DATA+(TMP[i]^TMP_REF)&0xFF; } if(!DATA){ if(j==0)POWER=1-POWER; if(j==1){ if(REPETATION > 2)REPETATION=REPETATION-1; } if(j==2){ if(REPETATION < 50)REPETATION=REPETATION+1; } if(j==3) RST=1; } } for(i=0; i<5; i++) TMP[i]=0x00; } if(A_FLAG && EEPRM){ k=0; j=0; EEPRM=0; PRE_LEARN=0; PRE_LEARN2=0; LEARN=0; PULSE=0; STOP=0; HL=0; cnt=0; cnt_bit=0; FIRST_SENSE=FST; //24 } if(!POWER && A_FLAG){ porta_out=0xFF; portb_out=0xFF; } if(POWER){ // 点灯モード cnt2=cnt2-1; if(!cnt2){ if(i2==WIDTH - FALL){ if(!RGB) RGB=3; RGB = RGB -1; if(RGB==2){ RISE=T_RG1; FALL=T_RG2; } if(RGB==1){ RISE=T_GB1; FALL=T_GB2; } if(RGB==0){ RISE=T_RB1; FALL=T_RB2; } i2=1+RISE; } if(RGB==2){ RR=0; GG=1; BB=1; } if(RGB==1){ RR=1; GG=0; BB=1; } if(RGB==0){ RR=1; GG=1; BB=0; } cnt2=WIDTH; } if(cnt2==i2){ j2=j2-1; if(j2==0){ j2=REPETATION; i2=i2+1; } if(RGB==2){ RR=1; GG=0; BB=1; } if(RGB==1){ RR=1; GG=1; BB=0; } if(RGB==0){ RR=0; GG=1; BB=1; } } porta_out=0xF0+RR*0x0F; portb_out=0xF0*GG+0x0F*BB; } } }