PICキット スタートマニュアル5
デジタルI/O制御の基本プログラミング その1
FullColorLEDを制御してみる(アッセンブラ)編
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: プリスケーラ比、使用しないので、どうでもよい
(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) 動作中
前述のシステム設計のイメージにより、ソースコードを記述していくのですが・・・
下手な説明で大変恐縮ですが、プログラムイメージが湧きましたでしょうか?
プログラムは人それぞれでOKなのですが、例として当局版を画像で示します
該当LEDの発色データの事前実験をしていないです。(「PICEYE」での使用LEDで無い)
よって発色変化を単純化しており、所々に発色の切れ目が見えてしまいます。
「PICEYE」で使用した角形LEDより、発色のメリハリが無い感じがします
ここでは、何をしているのか分かり易い事が重要なので、このままとします。
←(画像01) 動作中
(画像13)
(8)メインループ記述
ADC_DATAと言う変数を、O~FFHまでインクリメント
オーバーフローしたら、今度はFFH~0Hまででクレメント
このADC_DATAの値を発色データ生成サブルーチンに渡す
(8)メインループ記述
ADC_DATAと言う変数を、O~FFHまでインクリメント
オーバーフローしたら、今度はFFH~0Hまででクレメント
このADC_DATAの値を発色データ生成サブルーチンに渡す
(画像15) 下左側(画像16)、下中央(画像17)、下右側(画像18)
(9)発色データ生成サブルーチン
Wregによる引値で、0~FFHを入力
それにより、256種類の発色データを生成
生成データを変数R_PER、G_PER、B_PERにロード
(9)発色データ生成サブルーチン
Wregによる引値で、0~FFHを入力
それにより、256種類の発色データを生成
生成データを変数R_PER、G_PER、B_PERにロード
画像ここまで
以上で、フルカラーLEDを駆動するアッセンブラソースファイルの一例画像です。
一応、ソースファイルは左記にもあります。
アセンブルするには「Source Files」にファイルを登録する必要があります。
初めてのアッセンブラ・プログラミングとしては、重かったでしょうか? <(_ _)>
当局HP内の「はじめてのPIC」を読み返してみても、いきなり割込み処理はしていません。
しかし、PICF1ファミリは割込み記述が以前より安易になったのも特徴の1つです。
また、デジタルI/O処理は7セグLEDやLCDの制御等、応用は広範囲です。
それとタイマ0による割込み処理はPICを遊ぶ上で避けて通れない基本処理です。
当局もまだまだ素人ですが、今回の基本技術は解ってしまえば、「なぁ~んだ」、で済む事と思いますし、まだまだ面白そうな内蔵モジュールがいっぱいあるじゃん! と気が付くと思います。
ちなみに、フルカラーLEDをPWM変調するには割込みを使用しなくとも可能です。
割込みルーチンの処理をメインループに持ってくるだけでも結果は概ね同じです。
もちろん、多少の変更は必要ですが。
しかし、この割込みを使用した方法の方が、さらに応用が広がると思います。
次回は今回のと同じ処理をXC8で記述していきます。
以上で、フルカラーLEDを駆動するアッセンブラソースファイルの一例画像です。
一応、ソースファイルは左記にもあります。
アセンブルするには「Source Files」にファイルを登録する必要があります。
初めてのアッセンブラ・プログラミングとしては、重かったでしょうか? <(_ _)>
当局HP内の「はじめてのPIC」を読み返してみても、いきなり割込み処理はしていません。
しかし、PICF1ファミリは割込み記述が以前より安易になったのも特徴の1つです。
また、デジタルI/O処理は7セグLEDやLCDの制御等、応用は広範囲です。
それとタイマ0による割込み処理はPICを遊ぶ上で避けて通れない基本処理です。
当局もまだまだ素人ですが、今回の基本技術は解ってしまえば、「なぁ~んだ」、で済む事と思いますし、まだまだ面白そうな内蔵モジュールがいっぱいあるじゃん! と気が付くと思います。
ちなみに、フルカラーLEDをPWM変調するには割込みを使用しなくとも可能です。
割込みルーチンの処理をメインループに持ってくるだけでも結果は概ね同じです。
もちろん、多少の変更は必要ですが。
しかし、この割込みを使用した方法の方が、さらに応用が広がると思います。
次回は今回のと同じ処理をXC8で記述していきます。