/* ;------------------------------------------------------------------- ; sw3ch.c - PIC12F629 3ch スイッチ ; 2011/04/11 http://www.koji27.com/ ; ; ※参考URL1 http://www.izu.to/rc_plaza/pic/3ch.html ; ※参考URL2 http://www.oyajin.jp/~toko/datasheet/pulse-width.html ; ※参考URL3 http://homepage3.nifty.com/mitt/pic/picc/picc675_02.html ; ; ニュートラル(us) パルス幅(us) ; Sanwa 1500 ±400 ; --------------------------------------- ; HI 1900us (1890us) ; LOW 1100us ;------------------------------------------------------------------- ; [仕様] ; GP3 からで受信機のパルス信号を入力 ; 1600us 以上のパルスを認識したら GP2 をオン(以下ならオフ) ;------------------------------------------------------------------- */ #include // pic.h にある __delay 関数を使うために周波数をセットする(4MHz) #ifndef _XTAL_FREQ #define _XTAL_FREQ 4000000 #endif /* * ※CONFIG * UNPROTECT プログラムメモリー保護オフ * MCLRDIS 外部リセット端子オフ(3番ピン) * WDTDIS ワッチドッグタイマーオフ * PWRTEN パワーアップタイマーオン * INTIO 内部クロックを使う(約4MHz) GP4 = IO; GP5 = IO; */ __CONFIG(UNPROTECT & MCLRDIS & WDTDIS & PWRTEN & INTIO); /** * 関数ヘッダ */ // 初期化 static void init(); // 100us 以上の LO を待つ static void wait_lo(); // パルスの立ち上がりを待つ static void wait_hi(); /** * main コード */ main () { // PIC 初期化 init(); // ループ開始 while (1) { // 100us 以上の LO を待つ wait_lo(); // パルスの立ち上がりを待つ wait_hi(); // 1600us ウエイト (100usウエイト x 16回 unsigned char i; for (i = 0; i < 16; i++) { __delay_us(100); } // パルスが立ち上がってから 1600us if (GPIO3 == 1) { // スイッチオン GPIO2 = 1; } else { // スイッチオフ GPIO2 = 0; } } } /** * 関数コード */ // 初期化 static void init() { // GPIO 初期化 GPIO = 0; CMCON = 0x07; // PIC12F675用 // ANSEL = 0x00; // AN無効 /** * GPIO 設定 3入力 それ以外は出力 * * GPIO = xx54 3210 * 0x08 = 0000 1000 */ TRISIO = 0x08; } // 100us 以上の LO を待つ static void wait_lo() { // ループ開始 while (1) { if (GPIO3 == 0) { // GPIO3 に入力がなかったら 100us ウエイト __delay_us(100); if (GPIO3 == 0) { // 100ms 経過しても GPIO3 に入力がなかったらループ終了 break; } } } } // パルスの立ち上がりを待つ static void wait_hi() { // ループ開始 while (1) { if (GPIO == 1) { // ループ終了 break; } } }