1.PICキット周辺モジュールを用意し、システム設計を行う

(1)NO-25 フルカラーLEDモジュールを製作する
   これは「周辺モジュールB群その2」に画像と回路図がありますので、製作の参考にして下さい。
 1)用意する部品
  ① 16ホール基板2連(秋月電子)
  ② LED「OSTA5131A」
  ③ ピンソケット 4連1つ、単独1つ
  ④ 抵抗、120Ω×2、220Ω×1
  ⑤ 配線コード少々
  ⑥ 散光キャップ
  プロジェクト名は前回作成した「PIC_START_PRG01」、ソースファイル名も全く同じ、「PIC_START_PRG01.asm」です。

(2)プログラムの設計
 0)フルカラーLEDモジュールのCPUジュールへの差込ピン
   RC3にLEDのREDで、PORT=1でLEDがON(発光)となる
   RC4にLEDのGREEN、PORT=1でLEDがON(発光)となる
   RC5にLEDのBLUE、PORT=1でLEDがON(発光)となる

 1)PICシステムの設定
   システムクロックは内部発振8MHZ、4xPLLで32MHZとする
   タイマ0をインタバルタイマとして使用
   割込み処理ルーチン(ISR)内でRGB3色のLEDを制御(タイマ割込み、ISRを使用しなくとも実現可能です)

 2)タイマ0(Timer0)の設定
   ここでは、タイマ0、Timer0とはタイマ0モジュールを指し、TMR0とはTMR0レジスタの事を指す
   ①TMR0:0~255まですべてカウント(0からのスタートと言う事になる)
     プリスケーラは使用しない
     オーバーフローで割込みを掛ける、約32us間隔
     ISR終了時にTMR0=0にセット

 3)LED駆動ルーチンの設計
   ①周期分解能および発色設定値
     メイン周期変数:M_PER 1周期の長さ(時間)を決める、この長さが1周期の100%となる(00H~FFH固定値)
     RED周期変数:R_PER 赤光度の設定値で、光度=R_PER/M_PER
     GREEN周期変数:G_PER 緑光度の設定値で、光度=G_PER/M_PER
     BLUE周期変数:B_PER青光度の設定値で、光度=B_PER/M_PER
     R_PER、G_PER、B_PER、それぞれを変えてやる事で、発色が決定する
     以上の光度3変数を発色データ生成サブルーチンで設定してやれば良い事になる

   ②1周期処理実行
     M_CYC: 1周期設定時間の減算カウンタ
     R_CYC: 1周期内RED発光時間用1周期内減算カウンタ
     G_CYC: 1周期内GRN発光時間用1周期内減算カウンタ
     B_CYC: 1周期内BLU発光時間用1周期内減算カウンタ
     以上の1周期内3変数を用いて、ISR内で処理すれば良い事になる(ISRを使用しなくとも処理可能です)

 4)メインループの流れ(自由に適当でOK)
   ①R,G,Bと1秒づつ発光、最初だけ
   ②発色変化ループ
     50ミリ秒づつ発色変化
     発色変化は約12秒で、往復で約25秒

(3)システム設定詳細
 1)コンフィギュレーションワード
   例として記載した設定でOKです。
    _ _CONFIG _CONFIG1, B’0000100110000100’
    _ _CONFIG _CONFIG2, B’0001000011111011’

 2)I/Oポートの初期設定
   今回はRC3~RC5までデジタル出力として使用します。
   残りポートは念のため、デジタル入力としておきます
    TRISA=3FH
    TRISC=07H
    ANSELA=00H(すべてデジタル)
    ANSELC=00H(すべてデジタル)

 3)OSCCONレジスタ
   4xPLL=ON、内部発振は8MHZの設定です。
    OSCCON=FOH

 4)INTCONレジスタ
    INTCON=20H
     bit7 GIE=0: 割込み全体制御は、まだOFF
     bit6 PEIE=0: 周辺割込み使用しない
     bit5 TMR0IE=1: タイマ0割込み、使用する
     bit4 INTE=0: 外部割込み、使用しない
     bit3 IOCIE=0: 状態変化割込み、使用しない
     bit2 TMR0IF=0: タイマ0割込みフラグ、リセットしておく(個々のフラグはISRで、
                   その度ごとにリセットします)

     bit1 INTF=0: 使用しない
     bit0 IOCIF=0: 使用しない

 5)OPTION_REG オプションレジスタ
    OPTION_REG=88H
     bit7   /WPUEN=1: プルアップOFF
     bit6   INTEG=0: 立下り↓
     bit5   TMR0CS=0: タイマ0クロックソースはインストラクションクロック
     bit4   TMR0SE=0: タイマ0ソースエッジ 立下り↓
     bit3   PSA=1: プリスケーラ割り当て、WDT(TMR0に割り当てない)
     bit2-0 PS=000: プリスケーラ比、使用しないので、どうでもよい


2.アッセンブラ・ソースコードを書く
  前述のシステム設計のイメージにより、ソースコードを記述していくのですが・・・
  下手な説明で大変恐縮ですが、プログラムイメージが湧きましたでしょうか?
  プログラムは人それぞれでOKなのですが、例として当局版を画像で示します
  該当LEDの発色データの事前実験をしていないです。(「PICEYE」での使用LEDで無い)
  よって発色変化を単純化しており、所々に発色の切れ目が見えてしまいます。
  「PICEYE」で使用した角形LEDより、発色のメリハリが無い感じがします
  ここでは、何をしているのか分かり易い事が重要なので、このままとします。

 ←(画像01) 動作中


← (画像02)

(1)CPU定義、インクルードファイル指定


←(画像03)

(2)コンフィギュレーションワード1記述



←(画像04)

コンフィギュレーションワード2記述


(画像05)

(3)データRAMレジスタ定義(変数アドレス等の定義)


(画像06)


データRAMレジスタ定義続き

(4)リセットベクタ、割込みベクタ記述


←(画像07)

(5)割込みルーチン


← (画像08)

 割り込みルーチン続き

← (画像09)

 割り込みルーチン続き

← (画像10)

 割り込みルーチン 最後

(画像11)

(6)レジスタ初期設定記述


(画像12)

(7)メインプログラム記述

(画像13)

(8)メインループ記述

  ADC_DATAと言う変数を、O~FFHまでインクリメント
  オーバーフローしたら、今度はFFH~0Hまででクレメント
  このADC_DATAの値を発色データ生成サブルーチンに渡す

(画面14)

 メインループ続き













(画像15) 下左側(画像16)、下中央(画像17)、下右側(画像18)

(9)発色データ生成サブルーチン

  Wregによる引値で、0~FFHを入力
  それにより、256種類の発色データを生成
  生成データを変数R_PER、G_PER、B_PERにロード


(画像19)

発色データ生成サブルーチンの続き





























(画像20) ~ (画像26)

(10)32MHZ用ウエイトサブルーチン

(画像27)

ウエイトサブルーチンの続き最終
そして、「END」疑似命令で締めくくります
アッセンブラ版ソースファイル

 PIC_START_PRG01.asm



画像ここまで

以上で、フルカラーLEDを駆動するアッセンブラソースファイルの一例画像です。
一応、ソースファイルは左記にもあります。
アセンブルするには「Source Files」にファイルを登録する必要があります。

初めてのアッセンブラ・プログラミングとしては、重かったでしょうか?  <(_ _)>
当局HP内の「はじめてのPIC」を読み返してみても、いきなり割込み処理はしていません。
しかし、PICF1ファミリは割込み記述が以前より安易になったのも特徴の1つです。
また、デジタルI/O処理は7セグLEDやLCDの制御等、応用は広範囲です。
それとタイマ0による割込み処理はPICを遊ぶ上で避けて通れない基本処理です。
当局もまだまだ素人ですが、今回の基本技術は解ってしまえば、「なぁ~んだ」、で済む事と思いますし、まだまだ面白そうな内蔵モジュールがいっぱいあるじゃん! と気が付くと思います。

ちなみに、フルカラーLEDをPWM変調するには割込みを使用しなくとも可能です。
割込みルーチンの処理をメインループに持ってくるだけでも結果は概ね同じです。
もちろん、多少の変更は必要ですが。
しかし、この割込みを使用した方法の方が、さらに応用が広がると思います。

次回は今回のと同じ処理をXC8で記述していきます。
戻る  実験・製作の記録TOPへ戻る