PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
赤外線信号送信器

18F14K50のBootLoader基本ボードを使い、赤外線リモコンの送信機を作成しました。

基本PIC基板に、赤外線LEDと電流制限抵抗を半田付けした簡単なモジュールを作成し取り付けてあります。 基本PIC基板に、PushSWが1つしかないので、単純な信号しか送れませんが、PushSWさえ追加すれば、いくらでも拡張できます。

現在は、PushSWを押すたびにテレビリモコンの

     チャンネル「1」 ⇒ チャンネル「2」 ⇒ チャンネル「3」 ⇒ チャンネル「4」

と4つのコマンドを順に送出しています。 赤外線受信機との連携を意識したものです。 赤外線受信機と2台でお互いの機能確認ができます。 プログラムの定数さえ書き直せば、既存リモコンのON/OFFなど単機能の実用リモコンとなります。現状は赤外線LEDに流す電力が少ないため、TRを追加して光量を増やす必要がありますが、抵抗とTR各1つの追加で可能です。

プログラム

//------------------------------------------------
//  PIC   13_Ir_Tx
//  赤外線送信機
//  PushSWを押すごとに  NEC方式で0x01-0x04までの
//  コマンドを順に送信する。
//  Notes:  12MhzXtal 48MHzシステムクロック
//        PwmOut  RC4 赤外線LED
//        LED     RC0 インディケーション用
//        PushSW  RB7
//    Language: MPLAB xc8
//    Target: PIC18F14K50
//------------------------------------------------
#include <p18f14k50.h>
#include <delays.h>
#include <timers.h>
#include <pwm.h>

#define  PwmOut  TRISCbits.TRISC4
#define  LED     LATCbits.LATC0
#define  outON   0
#define  outOFF  1
#define  PushSW  PORTAbits.RA3
//
//------------ リセット  ベクトルの移動--------------------
#define REMAPPED_RESET_VECTOR_ADDRESS    0x1000
extern void _startup (void);
#pragma code reset_vect = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void){_asm goto _startup _endasm}
//---------------------------------------------------------

void irCmd(unsigned int,char);
void dataOut(char);

#pragma code
void main(void){
    char cmdCode;
        PORTC = 0;
    TRISC  = 0b11011111;   // RC4出力、RC5 は後で設定
    ANSEL  = 0b00000000;   // すべてデジタル
    ANSELH = 0b00000000;
// --------------- CCPの 設定 --------------------
// クロック(48Mhe/4)をカウントし、38KHzを出力する
//     48M/4/4/(78+1)=37.97KHz
// ---------------------------------------------
    SetDCPWM1(0x9C);        // Duty 78x4x50%=156(0x9C)
    SetOutputPWM1(
            SINGLE_OUT,
            PWM_MODE_1);
    PwmOut = outOFF;         // PWM出力を停止
    PSTRCON = 0b00000010;    // PWM出力がP1B(RC4) ピン
    OpenTimer2(              // Timer2
        TIMER_INT_OFF &      //  インタラプトOFF
        T2_PS_1_4 &          //  プリスケラ   1/4
        T2_POST_1_1 );       //  ポストスケラ 1/1
    OpenPWM1(0x4E);          // PRに78をセット
    PIR1bits.TMR2IF = 0;

    cmdCode=1;
    while(1){
        while(PushSW);           // PushSwを待つ
        while(!PushSW);
        irCmd(0x0055,cmdCode);   // コマンド出力
        Delay10KTCYx(240);       // 200mSec
        irCmd(0x0055,cmdCode);   // コマンド再出力
        Delay10KTCYx(240);       // 200mSec
        if(cmdCode++ >= 5)cmdCode = 1;
    }
}
// --------------- 赤外線信号出力 --------------------
// 16ビットのカスタムコード(ctm)と
//   8ビットのコマンドコード(cmd)をNEC方式で出力する
// --------------- Data出力 --------------------
void irCmd(unsigned int ctm,char cmd){
    char i;
    // ---- リーダー出力 ----
        LED = 1;              // LED  ON
    PwmOut = outON;       // ON出力
    Delay1KTCYx(108);     // 9mSec
    PwmOut = outOFF;      // OFF出力
    Delay1KTCYx(54);      // 4.5mSec
    // ---- カスタムコードの出力 ----
    dataOut(ctm >> 8);    // 上位8ビット出力
    dataOut(ctm & 0xFF);  // 下位8ビット出力
    // ---- コマンドドの出力 ----
    dataOut(cmd);         // コマンド出力
    dataOut(~cmd);        // 反転コマンド出力
    // ---- Stop bitの出力 ----
    PwmOut = outON;
    Delay100TCYx(67);
    PwmOut = outOFF;
    LED = 0;              // LED  OFF
}
// --------------- Data出力 --------------------
// data を下位から出力する
// --------------- Data出力 --------------------
void dataOut(char data){
    char i;
    for(i=1;i<=8;i++){
        PwmOut = outON;          // ON出力
        Delay100TCYx(67);        //   560μSec
        PwmOut = outOFF;         // OFF出力
        if(data & 1)             //
             Delay100TCYx(202);  //   1680μSec
        else Delay100TCYx(67);   //   560μSec
        data >>=1;               // 右に1ビットシフト
    }
}