最初に
水槽の照明をLEDに変更してから水草の育ちが思わしくないことは以前報告しましたが、調べてゆくと様々な要因がありそうです。
LEDの色や点灯方法等有り、確認のため「コケ」の問題の無い陸生植物から始めてみることにしました。
カミさんが「多肉植物」を台所・トイレ・洗面所等に置いていますが、光量が足りないため色も薄くなり、姿も悪くなっていくのが解ります。照明器具も小さくて済みそうですので、手始めに「多肉植物用LED照明」を作ってみます。
LED光の照射はPWM 2,500Hz・Duty33%が良いようなので、まずはPWM信号を作るところから始めることにしました。
PWM信号の作り方ですが、タイマーICの555を使う方法が簡単ですが、部品点数も多くアナログ回路が元ですので、周波数・Duty共に温度や経年変化の影響を受けやすいと思われますので、一念発起し今を去ること10数年前にかじったことのある1チップICのPICを利用することにしました。
せっかくですからPICの動作を勉強し直すため、プログラミング言語はアッセンブラでやってみたいと思います。
昔と違い、内部発振・PWMモジュール等の機能を持ったPICが数多くあり、PWM発振だけを考えると8PinのPICとパスコンだけで構成できてしまいます。
使用するPICはPIC12F683の情報が多いようですが、ここは新しいPIC12F1822かPIC12F1501で情報を探し、PIC12F1501より若干高価ですがPIC12F1822を選びました。
PICの書き込みは昔作った「PICKit2互換機」がありますが、PIC12F1822等に対応させるのも面倒なことですし「PICKit4」が出回り始めて「PICKit3」が買いやすくなっていたため、「PICKit3」を購入しました。海外からの購入で最安値ではないですが、送料込み$10程度で購入できました。書き込みアダプターはありませんが、しばらくはブレッドボードで代用し、ZIFソケット(発注済み)を使って自作するつもりです。
※ 2019.01.26追加
書き込み器「MPLAB Snap」を入手しましたが、PIC12F1822に使えます。価格も秋月さんで\1,740と安価ですので、これから始めようとされている方は選択肢に入れてみてはいかがでしょうか。こちらに使用した記事を載せていますので、参考にしてください。
この歳で10年以上前に触った程度の経験しかありませんので、まったくの初心者ですので、躓いたところ等書きながら進めてゆきますので、初めての方には参考程度にはなるのではないかと思います。
もし間違ったところが有ったり解らないところが有ったりした時には、遠慮なく「お問合せ」から連絡ください。ご指摘された間違いやご質問に関しては、記事に追記してゆきたいと思いますので、開示可能かどうかも連絡してください。
よろしくお願いします。
まずはPWM信号を作ります。
LEDのPWM駆動する場合、PWM信号の作り方として思い浮かべるのはタイマーIC555でアナログ的に発生させたり、ワンチップCPU(PIC・AVR・PSoc等)でデジタル的に発生させる等があります。
各々メリット・デメリットはありますが、継時変化・設定の確実性及び使用部品点数等を考え合わせ、ワンチップCPUを使うことにしました。
使用するのはとりあえず触ったことのあるPICとし、それほど複雑なことはしない予定(出来ない)ですので、アッセンブラでPICの復習を兼ねてプログラムしてみます。
使用するPICはPIC12F1822かPIC12F1501と迷いましたが、比較的情報の多いPIC12F1822にしました。PWMモジュール使用に関しての情報はPIC12F683の情報が多いのですが、これから始めるのであれば出来るだけ新しいPICの方が良いでしょうし、PIC12F1822のDataSheetには日本語版があります。
最初はPICも書き込み器も必要ありません。MicroChipのサイトで無料配布されている“MPLAB X IDE”をお使いのPCにインストールしてください。プログラミング・デバッグ・シュミレーションまでこのソフトで行えます。もし必要であればC言語まで無料で使えます。
シュミレーションでロジックアナライザーも使えますので、発生するであろう信号まで目で確認できてしまうという優れものです。
まずは使っているPCに“MPLAB X IDE”をインストールして、プログラムを考えている間に、PIC・書き込み器等部品を発注しておけばよいのではないかと思います。
インストール方法や使い方は以下のサイトが解り易く思いました。
インストール方法
「サヌキテックネット」の“2-3.MPLAB X IDEのインストール”
「phantaoラボ」の“MPLAB X IDEのセットアップ”
使い方
「サヌキテックネット」の“第3章 はじめてのMPLAB X IDE”
シュミレーション
「MIBC備忘録」の“MPLAB X IDE V4.15でアセンブラをシミュレート”
「きむ茶工房ガレージハウス」“MPLAB X のシミュレータを動かして見る”
ロジックアナライザー
「マイコン漬け」の“MPLABX Logic Analyzerの使い方 デバッガの設定方法”
以上ですが、そのほか多くのサイトが紹介していますので、各々で解り易いサイトをを調べてみてください。
アッセンブラでPICのプログラムを作る。
アッセンブラでPICをプログラムするときに、私の様な初心者が戸惑うのは、色々な記述方法があることではないでしょうか。
今回PIC12F1822のPWM機能を用いて、LED照明用のPWM信号を作ります。仕様は2.5kHz・Duty33%と100Hz・Duty50%の二種を内部クロック4MHzで作ることを目標にします。
PWM信号は単純に設定した周波数とDuty比をRA2(5Pin)に出力する物です。
1. CONFIGの記述方法(疑似命令)
CONFIGの記述に関して私の知っている限りでは2種類あります。
a. __CONFIG = _CDP_OFF , & _CP_OFF , _BODEN_ON , & _MCLRE_OFF , & _PWRTE_ON , & _WDT_OFF , & _EXTRC_OSC_CLKOUT
b. CONFIG1 = _CPD_OFF
CONFIG1 &= _CP_OFF
CONFIG1 &= _BODEN_ON
CONFIG1 &= _MCLRE_OFF
CONFIG1 &= _PWRTE_ON
CONFIG1 &= _WDT_OFF
CONFIG1 &= _EXTRC_OSC_CLKOUT
__CONFIG _CONFIG1
※2019.01.26修正 この記述では書き込みが出来ませんでした。書き込めるようになった記述例は以下のようにしましたが、CBxの前にスペースを入れると書き込めませんでしたので、注意が必要です。
CBx = _CPD_OFF
CBx &= _CP_OFF
|
|
__CONFIG _CONFIGx, CBx
このうち良く使用されている方法はa.の記述方法ですが、各bitの説明を書き込むにはb.の方が覚え易いと思います。
2. BANK切替の記述方法(リテラル命令)
BANKの記述に関して私の知っている限りでは4+1種類あります。例としてBANK 1にあるPORTAへの切替を書いてみます。
a. BANKSEL 1
b. BANKSEL PORTA
c. MOVLB 1
d. BSF STATUS,PR0
e. MOVLW 1
MOVWF BSR
a.とb.の違いはBANKを直接指定するか、書き換える命令のある番地に移動するかの違いですが、使用する命令がどのBANKにあるかわかるようにa.を使用した方が良いのではないかと思います。
今回程度のプログラムではあまり関係ありませんが、同じBANKであれば、BANK切替の必要が無く、プログラムを小さくできるためです。
上記のように、同じ動作をさせるにも何種類もやり方があり、このことが初心者には難しいのだと思います。
それでは、実際にプログラムを書いてゆきます。動作は全て確認してありますので、コピペで大丈夫だとは思いますが、半角・全角の違いが有ったりするため、プログラムは自分自身で打ち込んでみることをお勧めします。
各々のプログラムは記載している物と同時にXXX.asmとXXX.hexファイルとして格納してありますので、確認に使用してみてください。
プログラムを書いてゆくうえで、対象PICの最新Data Sheetをダウンロードしておきますが、Data Sheetは数百ページになりますので、全て印刷しておくことは大変ですし、そのままのファイルを使用して該当するページを探すことも大変です。必要と思われるところをピックアップしてファイルにするなりプリントするなりしておくと、便利に使えます。
今回使用する命令等、最低限必要な情報はPIC12F1822の最新Data Sheet(41413c_jp.pdf)の内以下のページになります。
ピン構成 5
メモリー構成 26-29
コンフィグレーション 50-52
OSCCON 69
TRISA&PORTA 126
ANSELA 127
WPUA 128
APFCON 123
T2CON 193
CCP1CON 228
CCPR1 206
PWMの設定方法 211-212
上記以外に、下記の命令セットもあった方が良いと思います。
命令セットのまとめ 327-340
また全般的な説明としてメーカーサイトから
MPLAB® X IDE ユーザガイド;users_guide_of_MPLAB
MPLAB® REAL ICE™ MPLAB X IDE 用 インサーキット エミュレーター ユーザーガイド
;50002085E_JP
MPLAB® PM3 デバイス プログラマ ユーザガイド (MPLAB X IDE 向け)
;0002462C_JP
もダウンロードしておけば安心です。
※2019.01.26追記
アッセンブラの解り易い説明が書いてあるサイトを見つけました。
朝日大学の佐納ゼミさんのH.P.にある“ゼミ作品(主に電子工作)”の中の“PIC を使った、LED 点灯回路の実験”にある“アセンブラー命令について”です。
この中に書いてあるCONFIGの書き方をPIC12F1822に使ってみましたが、うまく書き込めませんでした。いろいろと試してみていると、CB = _XXX_XXの前にスペースをいれない,CONFIGに代入するときに __CONFIG _CONFIGx, CBとカンマを入れるとうまく書き込めるようになりました。
解り易く解説されていますし、簡単なプログラムですので移植も容易ですので、初めての方は試してみる価値があると思います。そういう私もこのH.P.である程度理解できるようになりました。
3. PWMの設定
PWMモジュールのPWM Singleモードを使って、PWM信号を発生させるには、CCP1CONとTimer2を使い設定します。
まずはPWM信号の周波数を設定します。2,500Hzの信号を作る場合、PICのクロックとの関係がありますので、以下の式を使い発信周波数とプリスケーラーを組み合わせることになります。またDutyもかかわってきますので、よく理解して決めてください。
この辺りについては様々なサイトに書かれていますが、私は【きむ茶工房ガレージハウス】の「PICの動かせ方」が解り易いと思いました。
周波数の設定値
PWMの計算式は以下の2式で決まります。
周期=λ(uSec)=(PR2+1) x (4xTosc) x (TMR2のポストスケールxプリスケール) ← 2019.01.09修正
=(PR2+1) x (4xTosc) x (TMR2のプリスケール)
デューティーサイクル=Duty(uSec)
=(CCPRL1:CCP1CON<5:4>) x Tosc x (TMR2のポストスケールxプリスケール) ← 2019.01.09修正
=(CCPRL1:CCP1CON<5:4>) x Tosc x (TMR2のプリスケール)
上記2式より
fPWM=1/λ=1/{(PR2+1) x (4 x Tosc ) x (TMR2のポストスケールxプリスケール)} ← 2019.01.09修正
=1/{(PR2+1) x (4 x Tosc ) x (TMR2のプリスケール)}
PR2={1 / 「fPWM x [(4 x Tosc) x (TMR2のポストスケールxプリスケール)]」}-1 ← 2019.01.09修正
={1 / 「fPWM x [(4 x Tosc) x (TMR2のプリスケール)]」}-1
デューティー比=Duty/λ=(CCPRL1:CCP1CON<5:4>)/{(PR2+1) x 4}
(CCPRL1:CCP1CON<5:4>)={[ Duty/λ] x [(PR2+1) x 4]}
ここで{[ Duty/λ] x [(PR2+1) x 4]}にあるx 4は二進数で表すと左に2bit移動するのと同意ですので、CCP1CON<5:4>は必ずB’00’になります。よって
CCPRL1=[ Duty/λ] x [(PR2+1)
となります。[ Duty/λ]は一般的には%で語られることが多い為、50%は0.5であることに注意が必要です。
それではさっそくPR2とCCPRL1を求めてみましょう。
PR2={1/2500 x [(4 x1/4,000,000) x (1 x 4)]}-1=99 ← 2019.01.09修正
={1/2500 x [(4 x1/4,000,000) x 4]}-1=99
D’99’=B’ 01100011’になります。
Duty/λ ⇒ 33% ⇒ 0.33ですので
CCPRL1=0.33 x (99+1)=33となり, D’33’=B’ 00100001’ になります。
2019.01.09修正
※TMR2ポストスケールの働きを勘違いしていました。PWM信号発生にはかかわりないようです。
すみませんでした。
4. プログラム解説
それではアセンブラでプログラムを作ってゆきますが、記載方法について陥りやすい注意事項は以下の通りです。(私が嵌ったところです)
1. プログラム本文に記述する文字は、スペースを含めて「半角英数字」のみ。
2. コメントは全角で記述できるが、半角「;」の後で記述する。
3. ラベル・命令(ニモニック)・オペランド(命令のパラメーター)と記述するが、間には必ず1個以上のスペースを入れる。一般的には見やすくするためTABを使用します。
4. プログラムの最後は必ず“END”で終了させる。こうしないとアッセンブルが終了できなくなり、途中のプログラムが問題なくてもアッセンブルできません。
PIC12F1822で2,500Hz・Duty33%のPWM信号をRA2(5Pin)に出力する簡単な物を作りますが、プログラム中に出来るだけコメントを入れてありますので、参考にしてください。
最初のうちは、様々な方々の簡単なプログラムを参考にして、使ってみることが大切だと思います。同じような動作をさせるにも、幾通りも方法がありますので、考え方に幅が出てきます。
このプログラムの中で、最初の方に出てくる“INCLUDE”を例にとると、私は
INCLUDE “P12F1822.INC” と記述していますが、
INCLUDE “P12F1822.inc”
include “p12f1822.inc”
INCLUDE P12F1822.INC
INCLUDE <P12F1822.INC>
等様々な書き方がありますので、各人が使いやすい方法を用いてください。
※ 勉強不足でプログラムの.asmファイル記載方法が解りませんので、.docファイルで添付してみます。お手数かけてすみません。
サンプルプログラム;PWM2.5KHz_修正 ← 2019.01.09入替 ← 2019.01.26 廃止して以下の物に差し替えてください。
サンプルプログラム;これです。
3つのプログラム(.asm)を圧縮してあります。解凍すると以下のファイルが出来ます。
・ 1822_PWM2.5k-33.asm:PWM 2,500Hz・Duty 33%
・ 1822_LED-4xFosc.asm:カウンターを使って、0.2Sec毎に3つのLEDが順次光ります。
・ 1822_LED-Timer1.asm:Timer1を使って、0.2Sec毎に3つのLEDが順次光ります。
MPLAB X のソースファイルとしてコピペで利用できます。可能な限りコメントを入れてありますので、参考にしてください。
※2019.01.29差替え;シュミレターのロジックアナライザーを使うと、動作が不安定なことが分かりました。いろいろと試した結果、LISTオプションを設定すると安定して使えましたので、ファイルを差し替えました。
私の環境によるものなのかMPLAB X v5.10保有の症状なのかわかりません。ほかのLISTオプションではだめでした。
どなたか理由がわかる方がおられたら、お教えください。
差替えプログラム:こちらになります。
前回同様zipファイルにまとめてありますので、解凍してください。
5. MPLAB X IDEの設定
MPLAB X Ver5.10 を使いますが、Sumilaterの使い方に癖がありますので、解っていることだけになりますが、書き留めておきます。
「きむ茶工房ガレージハウス」“MPLAB X のシミュレータを動かして見る”の説明が解り易いと思います。
但しLogic Analyzerの設定方法・使い方については「マイコン漬け」“MPLABX Logic Analyzerの使い方 デバッガの設定方法”を参考にして、表示できるようにしてください。
シュミレターでLogic Analyzer動作させられると、出力波形が見られ非常に便利になります。
マーカーの位置がうまく調整できていないため数値は若干おかしいですが、周期=408uSec ≒ 400uSec ⇒ 2,500Hz,Duty=141 / 408 uSec ≒ 33%となっていることが確認できます。
この次は実際にPICにプログラムを焼き込み、LEDを光らせてみます。
乞うご期待あれ!!
※ PICKit3 つながらない!! 2019.01.14追記
さて「シュミレーション」もうまくいって、さて書き込みとなりましたがうまく書き込めません。使用機器は下記の構成です。
・NotePC;Windows10Home 64bit
・MPLAB X v5.10
・PICKit3
・ブレッドボード
このような構成ですが、書き込みどころかMPLAB XがPICKit3を認識しないことから始まりました。最終的には何とかなりましたが、まー時間のかかったこと。以下に分かった原因を書いておきますので、参考にしてください。
- PICKit3のUSBケーブルの交換
これでMPLAB XがPICKit3を認識しました。 - PICKit3のファームウェアー書き換え
PICKit3は接続時にファームウェアーを毎回VerUpしてから動くようです。但し書き換え対象のファームウェアーのバージョンが古すぎると、MPLAB XではVerUp出来ないとのことなので、急遽MPLAB IDE v8.92をインストールし、PIC12F1822の簡単なプログラムを作り、PICKit3のファームウェアーを書き換えました。
なぜかわかりませんが、最初は30分待っても書き換えが終了しませんでしたが、PCを強制終了させた後再度起動させると書き換えが出来ていました。 - 書き込みアダプタ
ブレッドボードを使っていましたがどうも接触が良くないようで、うまく行ことがごくたまにありますが書き込みエラーが起き書き込めません。ZIFソケットは発注してありますが、入手までまだ時間が掛かるでしょうから、何とかしなければなりません。
表示されるエラーは「書き込んだ値が違った値になっている」のようなエラーメッセージです。
早急に対応してみます。書き込み不良の原因追求と取った対策 2019.01.17追記
MPLAB Xで””が成功し、プログラムは成功していますのでPICに書き込みしましたが、後から考えるとこれが間違いのもとでした。
早速PCとPICKit3を繋ぎ、めでたくPC(Windows10)で何事もなくPICKit3を認識できました。
ブレッドボードにPICKit3を繋いでPICに書き込みましたが、「書き込めない」との警告が出ます。
ビルドは成功しているので、ハード的な問題だと思いましたが、これが間違いのもとでした。後から考えれば、エラーメッセージに書いてあることと症状を重ね合わせて考えればよかったのかもしれません。
警告の内容は「書き込んだ値と返ってきた値が違っている」と書いてあるようです。
”The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x2f
configuration memory
configuration memory
Address: 8008 Expected Value: 1000 Received Value: 1010
Failed to program device”
と出てきて、ブレッドボードで仮組した物で書きこんでいるので「ノイズを拾って書きこみ値が変わったのだろう」ぐらいに考えてしまったことで泥沼にはまってしまいました。何度書き換えても同じメッセージと同じ値です。
まずはPCからの供給電圧を疑いましたが、5.1V来ていますので、問題はなさそうです。
しょうがありませんので、PICKit3とブレッドボードを繋いでいるケーブルを疑いケーブルをなくしましたが同じです。次はブレッドボードの接触不良かと思いブレッドボードをユニバーサル基板に換えましたが変わりません。
ここで「どうもハード的ではなくプログラムではないか?」と疑い、他の方が公開している簡単なサンプルプログラムを使ってみると書き込めます。
昔を思い出してみると定かではありませんが、プログラム中に”半角”ではなく”全角”のスペースが入っているのではないかと思い、ソースファイルを見直してもそれらしいところは発見できません。
しょうがないので、”全角”のコメントをいれないでソースプログラムを作り直してみました。
気を取り直して、PICに再度書き込んでみると”何ということでしょう”無事書き込めました!!
次は点灯実験ですが、”秋月電子さん”で以前買った格安USBオシロも使ってみます。
点灯確認試験 ”秋月電子さん”の「USBミニオシロ/データロガー」使えます!!
プログラム完成からPICの書き込みまで3日間かかりました。まずはLEDが点灯するかをブレッドボードで確認してみます。
PWMとの比較のため、同一抵抗でPICの供給電圧で点灯させて物も乗せてあります。画面左側のLEDがDuty100%、右の物がDuty33%のLEDです。抵抗は560Ωですので、約5mA流しています。
目で見てもあまり違いが判りませんのでオシロを繋いで波形を確認しました。
ずいぶん前に購入したUSBオシロ「DOS-19」で確認した波形です。約2500Hz,Duty33%になっています。
ここで”秋月電子さん”から購入してあった格安USBミニオシロ「PICAXE(ピカクス)USBミニオシロ/データロガー;OSC001 PCB SCOPE」(\2,400)も使ってみました。
測定値は約2500Hz,Duty33%となり、波形は荒いのですがこの程度の物には使えると思います。当時「DOS-19」は直輸入で\20,000ぐらいしていたと思いますので、一台持っておくと安心です。
後は「データーロガー」としてどの程度使えるかです。
次はいよいよ点灯回路と照明器具の作成に入りますが、ここのところ寒いので機械加工が遅れそうです。
点灯確認試験2 2019.01.29
ここのところ“プログラムのミス発見”,“MPLAB Snap 入手”,“ノートPCキー破損によるキボード交換”等いろいろと重なり、やっと確認実験が出来ました。
確認するにしてもf=2500Hz・Duty33%で点滅するLEDの点滅は目では見えませんので、同一電流で点灯(Duty100%)するLEDとの輝度比較で確認することにします。
使用するLEDは手持ちのΦ5mm 砲弾型 高輝度 赤色LEDとしました。PICの出力電圧は5Vですので、If=5mAとするとVf=2.2Vぐらいと思われますので、電流制限抵抗 R=(5-2.2) / 5mA = 560Ωとなります。PIC12F1822の仕様を確認すると、出力電流はPin当たり25mA Maxとありますので問題なさそうです。
2個のLEDを同一条件にするため、PWMプログラムをちょっとイジリ、Duty100%の電源もPICの出力端子から供給するようにします。
改造プログラム;1822_PWM2.5k-33.1
実験回路;
RA2(5Pin):f=2500Hz,Duty33%
RA0(7Pin):Duty100%
シュミレター(ロジックアナライザ画像)
比較画像;
左 = RA2(100%)
右 = RA0(33%)
番外
点滅により輝度(明るさ)が違うのは分かりますが、どう変化するかを見るため複数のDutyで同時点灯させてみました。
実はこの確認実験のために先日息子にPIC12F1501を買って来てもらいましたが、ついでに買って来てくれた“MPLAB Snap”で時間を取られてしまいました。
このPIC12F1501は周波数は同じになりますが、Dutyの違うPWM信号を4種出力できる物です。出力させるDutyはRA1= 100% ,RA2 = 75% ,RA0 = 50% ,RA4 = 33% ,RA5 = 10%として、PIC12F1822と同じLED及び電流制限抵抗R=560Ωで同時点灯させます。
プログラム:1501_Prog-PWM0.1
実験回路;RA1(6Pin) =Duty100% ,RA2(5Pin) =Duty75% ,RA0(7Pin) =Duty50% ,RA4(3Pin) =Duty33% ,RA5(2Pin) =Duty10%
シュミレター(ロジックアナライザ画像)
比較画像;左よりRA1(100%)→RA2(75%) →RA0(50%)→RA4(33%)→RA5(10%)
MPLB Xのロジックアナライザー(シュミレター)の動作不安定解決方法
この実験の中でMPLABのシュミレターにあるロジックアナライザーを動かしたとき、うまく動かないことが多発しました。
いろいろ試してみると、私の環境では次の方法をとると改善できました。このバージョン(v5.10)固有の問題なのかもしれませんし、私のPC環境のせいかもしれません。
プログラム最初の“LIST PICXXFxxxx”を“LIST PICXXFxxxx,ST=OFF,R=DEC”とするLISTオプション“,ST=OFF,R=DEC”を追加することです。
最初のころ、他の方のプログラムを参考にして(丸写し)動かすと、ロジックアナライザーがきちんと表示されていたため、違いを探していて偶然解決できました。1822・1501共に同じでした。
このLISTオプションがなぜシュミレターに影響を与えるのか全く分かりません。どなたかご存知の方がおられればお教えください。
追加確認実験
これでLEDをPWMで駆動することが出来るようになりましたが、どのような組み合わせが可能か考えなければなりません。あくまで観賞用照明ですから最低白色系LEDは4個使いたいので、電源電圧は24Vで7個以上の直列駆動で用いたいところです。
また 普段あまり人がいるところでもないので、簡単な24hrタイマーを組み込みたいと思います。
まず使用する白色とディープレッドLEDのIf-Vf特性を実測してみます。
LED駆動ICnjw4616及び4617の電圧降下は約1Vですので、LED供給電圧は24-1=23Vになるため、23≦4 x Vf(W LED) + X x Vf(DR LED)にしなければなりません。
If-Vf曲線からIf=250mAの時 Vf(W LED)=3.4V,Vf(DR LED)=2.2Vですので、LEDのばらつきを考えて、W LED x 4+DR LED x 4またはW LED x 4+DR LED x 3の組み合わせとして、色合いを確認しながら配置等も考慮し作ってゆくことにします。