PICクラブの情報交換会に出席

先日、PICのオーソリティ後閑氏が主催している、PICクラブの情報交換会に出席してきた
USのMicroChip社からの情報が色々と聞くことが出来て、非常に有意義な会である

今回は主催の後閑氏から、クラウドを使ったIoTシステムの試作例の紹介があった
3ヶ月に一度の情報交換会であるが、MicroChip社の動向や情報を色々と教えて頂けるので非常に勉強になる

その他メンバーによる作品紹介があって、会員の方々のユニークな作品を拝見させて頂ける
作者がプレゼンするため、開発の苦労話が聞けて、これもためになる

今回は数人の方が、プリント基板を頒布してくれたので、有り難く頂いて来たのであった
素晴らしいのは、ご自分でハターン設計を行いCADデータを作成し、ガーバーデータを基板屋さんに出していることである
そうすることで、基板作成の費用を下げることが可能になるのであるが、皆様素晴らし過ぎます

私は、アートワークはやって貰った基板しか作ったことが無いので、ご自分で回路からアートワークを起こせる人は本当に凄いと思う

ましてや、マイクロコントローラに載せるソフトウェアまで作っているのだから恐れ入るのである

IMGP6461

<実装密度の高い基板まで、ご自分でアートワーク設計されているのが凄い>

IMGP6462

<こちらはメロディータイマ ファームは別途ダウンロード可能 完成度は高い>

私も精進に励みたいと思う

 

 

PICkit用ISCP書込アダプタとPICライタの比較

PICを使って、何かを行う場合は使用するPICにプログラムを書き込む必要がある
そのプログラムの書込に使用するのが、ISCP書込アダプタPICライタである

PICを使用する基板自体が、ISCP(In Circuit Serial Programming)に対応していれば、その基板にPICKitを接続れば書込出来るので、アダプタやライタは必要無い
これから基板を設計する場合はISCP対応で設計を行うべきと思う
(デバッグもICEライクで出来る)

まずはISCP書込アダプタであるが、書き込むPICの種類が一種類に限定している場合は、全く問題無く快適に利用出来る

このアダプタは、ISCPの配線をジャンパー接続が必要になるので、ピン数が異なるPICを書き込む際には、ジャンパー配線が都度必要になる
従って数種類のPICを定常的に使う場合は、ジャンパー配線済みのISCP書込アダプタを複数用意した方が、間違いが少ない
都度、ジャンパー接続を行うのは結構たいへんだったりするのであった
PICkitを使用するので、MPLABから直接書込出来るのは便利である

IMGP6454

<ISCP書込アダプタ ジャンパー線の変更が少し面倒ではある>

 

次に定番だったPICライタであるが、これはPIC毎のジャンパー配線は必要無く、使い勝手は良い
MPLABから直接書込出来ると良いのであるが、専用のライタソフトでの書込である
従って、ソフト開発時の頻繁に書き換えが発生する場合は、煩わしい
対応していないデバイスもあるので、使用する前には確認が必要である

それぞれ一長一短であるが冒頭で書いた様に、これから基板を設計する場合はISCP対応すべきであろう
デバッグ時のプログラムの書き換えは、効率的でプログラマの手順が少ない方が良い

IMGP6455

<定番だった PICライタ 使い勝手は良い>

12F509 を弄って遊んでみた

今年最後のお遊びである
一個50円で入手出来る8pinのマイクロコントローラチップである

IMGP6306

<@50円のチップ、コストパフォーマンス抜群である>

この12F509はプログラムエリアがフラッシュメモリ1024wordの容量である
メモリは41byteで、5つの入出力ポートと1つ入力専用ポートで計6ポートである
その中の3ポートを内部プルアップする事が出来るので、この手の変換には向いている

マイクロチップ社ではベースラインと位置づけれる、1命令12bitのCPUコアである
初めてベースラインのプラグラムをしてみたのであったが
以外と手強いのである….

普段使っているのは、ミッドレンジと呼ばれる1命令14bitのCPUコアなのであるが、微妙に色んな所が違うのであった
ポートの入出力設定のやり方や、メモリのマッピング等々詳細が違っている
大きな点は、ハードウェアスタックが2つしか無いので、2つ以上のネストは出来ないのと、割込みが無いのは承知であったが、微妙な所で時間が掛かってしまった

まぁ、そうは言っても@50円は魅力的である
約4MHzの内蔵RCクロックもあり、簡単な制御であれば最適のコントローラであろう (慣れないとプログラムが面倒であるが)
今回の工作は、BCDスイッチ入力を16段階でPWM出力する、PWMコンバータである
0-Fの入力で16段階でのPWM出力をするプログラムである

PWMなら12F683等のチップを使った方が効率的であるが、16段階なので手作りのソフトウェアPWMにしてみた、今回の内容はBCDスイッチの数値に合わせてPWMを出力するだけの制御である

IMGP6305

<でっち上げた、PWM評価ボード>

IMGP6304

<とりあえずは、BCDスイッチとデューティは同期OKである>

初めてのベースラインチップでのプログラムは慣れないことも有って、思った以上に時間が掛かってしまったが、とりあえずは動くモノは出来たので、ヨシとしよう

さらりと遊ぶ筈が、今年最後の嵌まりゴトになってしまったのであった

PIC 16F88のPUSH POPについて

久しぶりのPICネタである

ミッドレンジのPICである16Fシリーズには、データスタックが無い
プログラムスタックは8段(最近のF1シリーズは拡張されている)となり、ネスティングが8段までとなり、プログラムスタックは、ソフトで読み書きは出来ないのである

PICでプログラムを書いていると、WレジスタがPUSH/POP出来るればと言う妄想が浮かんで来る、ついては、PUSH POPマクロをでっち上げてみた

マクロを使う場合、コードの中に以下のデータを定義する
.
.
dstack Udata_shr  h’78’
dstack_area res     8
;dstack_sp res  1
;dstack_fsr res 1
;dstack_w res  1
;dstack_data res 4
.
.

内容は Fレジスタの78番地からスタック用として8バイトを確保している
貴重な8バイトなのに、スタック出来るバイト数は4バイトなのは、愛嬌である

ちなみに70H~7FHのFレジスタは共用メモリとして重要である
メモリバンクがどこに設定されていても、必ず読めるアドレス空間である
従って、ここにスタックデータを置くことになる
以下がマクロである

;—————————————-
;Memory addrerss 00h-FFh 対応 (bank 0,1 only)
;PUSHW
;Wレジをスタックする
;78h dstack_sp データスタックポインタ
;79h dstack_w W reg save
;7ah dstack_fsr FSR save
;7bh-7fh dstack_data 5 level stack data
;

dstack_sp equ      h’80’-8
dstack_fsr equ     h’80’-7
dstack_w equ      h’80’-6
dstack_data equ  h’80’-5
;

;例: PUSHW
;—————————————-
PUSHW macro
movwf dstack_w    ;Wreg save
movfw FSR
movwf dstack_fsr   ;FSR save

movfw dstack_sp
addlw dstack_data   ;W=stack data offset
movwf FSR              ;FSR (stack_data)+sp

movfw dstack_w
movwf INDF            ;W → stack_data

incf dstack_sp,F        ;stack_sp ++

movfw dstack_fsr
movwf FSR               ;restore FSR
movfw dstack_w       ;restore W
endm

;—————————————-
;Memory addrerss 00h-FFh 対応 (bank 0,1 only)
;POPW
;スタックからWにデータをセットする
;78h dstack_sp データスタックポインタ
;79h dstack_w W reg save
;7ah dstack_fsr FSR save
;7bh-7fh dstack_data 5 level stack data
;
;例: POPW
;—————————————-
POPW macro
movwf dstack_w      ;Wreg save
movfw FSR
movwf dstack_fsr     ;FSR save

movfw dstack_sp       ;W=stack data offset
addlw dstack_data     ;W=stack data offset
movwf FSR
decf FSR,F                  ;FSR (stack_data)+sp-1

movfw INDF              ;stack_data → W

movwf dstack_w         ;Wreg save
movfw dstack_fsr
movwf FSR                  ;restore FSR
decf dstack_sp,F           ;stack_sp —
movfw dstack_w          ;restore W
endm

 

 

MPLABX

<MPLAB X IDE の画面>

デバッグはマダである
従って利用するには、大変な勇気が必要となると思われる
当然であるが、サポートは何も無いのである

実は少し使って見たので有ったが、WレジスタのPUSH/POPのために、貴重なプログラムエリアを無駄に消費してしまうのである

画期的と思ったのは私の妄想であった
。゚(゚´Д`゚)゚。

MPLABX で ソースファイル が変更出来ない?

久しぶりに、PICのソースファイルを弄ったのであるが
ソースファイルを変更して、アセンブルをした所エラーメッセージが出て上手くいかなかったのである
そのエラーメッセージも ‘ファイルが書込出来ません’で致命的である

えっ! と思って、フォルダやファイルのプロパティを調べてみたが、特に変な所は無さげである

1時間以上、色々とやってみた所、原因が判明したのであった

結論は、プロジェクト作成時の最後の’Encoding’にShift_JISの設定をしていなかったためである 今回はJIS-X0201に設定しており、そのためソースファイルの漢字部分で、誤動作していたみたいである

mplabx_projct_1

<デフォルトはISO-8859-1 >

MPLABx_project_2

<Shift_JIS を選択するのが正しい >

普段、MPMABXの環境に親しんでいれば造作の無いことであるが、私みたいなサンデープログラマだとそこに気付くまで時間がかかってしまうのである

ALL_IN_ONEの統合開発環境であるMPLABXは、機能が多く特にマルチウインドウのデバック環境は素晴らしいのであるが
機能てんこ盛りで、設定のバスが覚えきれないのである
私の頭が悪いだけであるが….

もっと真面目に、MPLABXと付き合いなさいとの啓示であろうか
けど、プログラミング以外に覚えるお作法が多過な気がするのは私だけであろう
まだまだ努力が必要みたいである

PIC の水晶発振子入力で VXO を試してみる

ふっとした思いつきである
PICでマーカ発信器が出来れば、超安く出来るのでは? と妄想を抱いたのであった
冷静に色々と考えた所、クロック入力の補正はソフトウェアでの補正は無理なのである

例えば、周波数カウンタではゲートタイムの値を正確に補正すれば良い
ゲートタイムは1/100秒とか1/10秒の単位なので、正確な基準信号があれば補正も可能である
しかし、マーカ発信器として使うには、ソフトウェアでの補正は実行命令ステップ単位で4クロックなので、低い周波数であれば可能性はあるが周波数が高くなると実質的に不可能である

で、考えた結論はPICの水晶発振子の入力に、LとCを付けてVXOを構成してみる実験をしてみた
今回は部品箱に転がっている12F675で実験してみる
まずは素の水晶でPICと接続して発振させてみる
水晶も貰い物なので想定負荷容量などは不明である、発振周波数は2KHz程高く発振していたのである

IMGP5903

<必殺 空中配線で水晶を繋ぐ>

さてPIC + VXOの実験である
まずは発振コイルを作る 私は10Kボビンが転がっていたので、それに巻いてみた
一旦の想定インダンクタンスは10μHである
コイルが組み上がったところで、仮組みで実験してみる
素晴らしい…. 約19.999…MHz
発振周波数が3KHz低く発振出来たのである

IMGP5905

<このボビンを使用する>

IMGP5907

<分解して 元に巻いてある線をほどく>

IMGP5908

<今回は上段8T 中段8T 下段8T 計24Tを巻いた 9μH~14μHとなった>

気を良くして、基板に実装してみる
元々の発振周波数が高い水晶なので、コンデンサの容量は小さめに15pFとしてみた

IMGP5910

これで、発振周波数の変化範囲は、19.995MHz~20.004MHzと約10KHz程度の幅が確認出来た
PICは発信器としても使えるではないか…
但し、クロック発振周波数20MHzの数10Hz単位で安定しないのである 全体をシールドしてしまえば安定度は増すと思うが、そこまでする程のモノではない

また、データシートだと水晶の両端をコンデンサでグランドに落とすのが正当だと思うが、その部分にL・Cを付けても上手く変動しなかったのである 究極の力技でLCをぶち込んだが、回路的に水晶のグランドがフローティング状態なので、不安定の理由はそこらへんかも知れない

PIC_Marker

<回路は簡単であるが、発振コイルと水晶・C2の配線は最短かつ発振コイルと水晶の筐体はアースが必要である>

今回は、マーカのテストなので、500MHzのマーカをでっち上げてみた
発振コイルのコアで、20.000.000MHzにHz単位で合わせる
あとは、超簡単な手抜きファームを入れ込むだけである
(超短いので500KHz版のソースを掲載する 当然ノンサポートである)

好きな人は、ソースを変更して100KHzなり25KHzなりのマーカに仕上げれば良いと思う

ちなみに、PICでVXOなんてマイクロチップ社は想定もしていないと思うので、当然誰も動作保証なぞしてくれないのである

超手抜きであるがソースは以下のリンクで

PIC_MARKER

超基本 LED の点灯について考えてみる

電子回路超基本

LEDの点灯について考えてみる

回路設計の経験者の方はこの項は読み飛ばして欲しいのである

ここでは、あえて電子工作と言う単語は使わない「電子工作」と言うと単なる趣味で終わりそうな気がするからなのである
学んだことは、趣味でも良いと思う、けれどこの手の知識は決して趣味だけで終わることのない、自己啓発の一つだと私は信じているのである

さて、前置きは別として今回はLEDの点灯について考えてみる

IMGP5842
PICなどのマイクロコントローラ入門で、例題に良く出てくるのがLEDの点滅である

LEDの点灯は非常にポピュラーであるが、原理原則について改めて記載してみた

1・LEDは順方向(アノード→カソード)に規定電流を流す
2・LEDは順方向(アノード→カソード)に規定電圧以上を印加する
3・LEDは許容電流値を超えると壊れる
4・LEDは逆方向電圧に弱い

まずLEDを点灯させるためには、アノード→カソード間に一定以上の電圧(Vf)を加え、普通のLEDで10mA,高輝度タイプで20mA位の電流を流す必要がある (定格は使用するLEDのデータシートを参照のこと)
一般的な用語では、点灯開始の電圧をVf、電流値をIfと言う記号で表す

少し乱暴であるが、電流制限が出来る安定化電源で点灯実験をしてみる
(電流制限が無い電源では絶対に試してはいけない)
最初に最大電流値を10mAに設定する
+端子にアノード –端子にカソードを繋ぐ
5mA,15mAで試してみる

IMGP5843

<上記は5mAで点灯させた所>

IMGP5844

<上記は10mAで点灯させた所>

一般的なLEDに10mA以上流しても、LEDの明るさには殆ど差は無い

例として5VでLEDを点灯させるためには
直列に470Ωの電流制限抵抗を接続する
(一般的なLEDのVFは3V以下なのでVf以上の電圧を印加する場合はVfを無視する)
この場合だと最大電流値は 5V ÷ 470Ω = 10.06mA である

LEDは定格電流で動作させるのが基本である

マイクロコントローラ例えばPIC12F675を5V動作させた場合のLEDを点滅させるためには以下の条件で接続する

GP3(4pin)以外のIOピンにLEDのカソードを接続し、アノードに470Ωの電流制限抵抗を繋げて、5Vの電源に接続する

12F675のプログラムで、接続したIOピンを’0’に設定すればLEDは点灯し、’1’に設定すればLEDは消える これはポートが’0’の時にPIC全体に流し込める電流の方が多いためである

この辺りは別途説明したいのである

PIC の入門を考えてみた

初歩の組込みシステムについて

PICなどのマイクロコントローラを実際に動かしてみることは以外と敷居が高いことかもしれないと思ったのである
今回は比較的世の中に広まっているPIC(12,16シリーズ)で考えてみる

経験者であれば、クロックは内蔵のCR発振器を使って、入力は何のpinからどの様に信号を受けて、出力は何のpinにどの様のタイミングで何を出力 とかのシナリオが湧いて出て来るのである

IMGP5759

<写真は12F1822 新世代の8Pin PIC 単価100円>

されど、PICと言えど小規模ながら立派な独立したコンピュータである
PICを含めマイクロコントローラは、何かを実現するための部品であり、作るモノによってはメインコンピュータであるが、実際に「PICを使ってみたいのですが? 」 「PICを勉強したいのですが何から勉強すれば?」 等のことを聞かれることがある

その昔1980年頃のマイコンブームの際に、’マイコン’を勉強したいのですが何から勉強すれば? と同じ様な感じがした
当時は、’BASIC言語でプログムすれば何でも出来ます’って雰囲気が世の中に蔓延し、巷のマイコンスクールが大繁盛したのであった
あれはあれで、コンピュータのリテラシを世の中に広めることになり、多数の技術者も当時のブームから育ったはずである
当時のマイコンってPC-8001,MZ-80,APPLEⅡ,FM-8などのパソコン元祖達が当時の金額で10数万以上価格でバカスカ売れまくったのであった
当時と現在が大きく違う点は、当時はそれらが最新のテクノロジーであったことで、現在の組込み系の最新テクノロジーは携帯電話やクルマの内部,そしてテレビ等のデジタル家電である

さて、我々がPICを動かしてみる際の投資は僅かではある
(PCとネット環境は有るとして、PIC・評価基板・PICライタ位)
只、実際にPICを自力で動かすためには、いくら簡単になったとは言えどそれは、独立したコンピュータシステムをリセットから順を追って動作させるということである
なのでCPU(コンピュータの中心部分)の立ち振舞が理解出来ていないと何も出来ないことが多いと思う
そして、それなりに苦労してLEDの点滅をさせ配偶者や家族に見せたとしても、安易に想像出来るリアクションは、「ふーん それで...」となりがちではないだろうか

やっていることは、CPUの立ち振舞を理解して、電源投入時からの1ステップ1ステップを精魂込めて書いたハズなのであるが、そのことを理解してくれる人は実際に組込み系に携わったことのある人位であろう

話が逸れたが、これから始めるPICの勉強スタートには何から勉強すれば良いのであろうか?
私個人としては、PICの電源を入れてからの立ち振舞を理解するためにアセンブラの勉強は推奨したい
決してアセンブラで大きなソフトを書くのが目的では無く、CPUの立ち振舞を理解するためである
また、picのアセンブラ MPASMは過去の開発環境であるMPLABから現バージョンのMPLABXまでそのまま使えるのである
最低限の立ち振舞を理解した後に、C言語で取組むと良いのではと考えるのである

データシートを読める方はメーカのデータシートを読む事をお勧めする

下記のリンクも、アセンブラでのPIC動作を解説してあるので比較的わかりやすい
お勧めの本 

IMGP5762

<写真は12C509A 一度書込したら再書込出来ない @50円>

そして、PICを含むマイクロコントローラを動作させるためには、最低限のハードウェアの基礎知識も不可欠である

経験者にとっては安易であるが、初心者にとってPICの敷居は決して低くないと思う
是非敷居を超えて欲しい (私も精進が足らないのであるが..)

PICについては今後、超入門編を書いて行きたいと思っているのである (自分のためである)

 

直読型周波数カウンタの制作 活用編1

部品の調達と組立

今回の直読周波数カウンタで、特別な部品は無いのである
只、この部品は最初からバンドメモリの切替に利用を前提としていた
12接点のロータリSWである、なおこのロータリSWは使用接点数でストッパーを掛ける事によって8接点で使用している
このロータリSWの代わりに普通のボリームでも使用出来るが、バンド切替であるのでやっぱりロータリSWの方が使い勝手は良い
このロータリSWの端子に抵抗を取付て、クリック付き8接点VRとして今回は用いている
その他のスイッチ類も一般的なものである

IMGP5679

 

水晶発振器は安かったので、10個パック300円の表面実装タイプを使用した
常温で使用するので、ゲートタイムの補正機能があれば十分と考える

アンプ回路も、一般的な2SK141と2SC1815である

 

ケースは色々と考えたのであるが、私の加工技術が未熟であるため、金属パネルを綺麗に直線に切り抜きが出来ない
従って、今回は安易に100均のミニカー等のディスプレイケースを用いた
自分用であるため、周波数測定入力は2系統とし、スイッチで切り替えられる様にした
電源は、9VのACアダプタのコネクタを付けて対応している

IMGP5684

<FRONT >

IMGP5681

<REAR>

フリーハンド加工であるため超適当ではあるが、何となくそれっぽい雰囲気にはなった

IMGP5683

R-4Aの上に載せた、周波数カウンタである

思ったほど、違和感は無い(自分的に)

 

次に続く…

直読型周波数カウンタの制作 要素開発編4

とりあえずの、ファームウェア概要である

最近の機器の場合は、商品なり制作物の仕様の大半が、搭載されるファームウェアによって実現される
そして開発費用のかなりの部分がファームウェア開発費となっていると思う
ファームウェアの開発規模も昔に比較すると巨大なものとなっており、その生産性と品質の向上にトップエンジニアが日夜努力をしている

この直読型周波数カウンタについては、自分が自分のために開発しているファームウェアである
従って、自由に仕様が決められるのであり、ファームウェア検査も自分自信が行う甘々の検査である

で、前置きはともかく本題に入ろう

最初に動作モードは以下の3点である
1.通常計測モード
a.電源を投入するとこのモードとなる
b.入力信号の周波数を計測し、選択されたバンドメモリのオフセット周波数と計測周波数を演算して表示をする
c.バンドメモリの0-7で8メモリである

<バンドメモリ0はオフセット周波数は0Hzで、計測周波数がそのまま表示される>

IMGP5675

写真は、10MHzを入力

・バンドメモリ7番の オフセット周波数は-455KHz

・表示周波数は 10MHz – 0.455MHz = 9.555MHz

 

2.較正モード
a.Funcボタンを押しながら電源を投入するとこのモードとなる
b.バンドメモリのオフセット周波数は演算されない
c.計測した周波数を選択したバンドメモリにオフセット周波数として登録できる
d.電源OFFで解除

IMGP5677

写真は、10MHzを入力

・バンドメモリ7番の オフセット周波数は-455KHz だがオフセット演算はしない

・表示周波数は 10MHz

・ここでFuncボタンを押すと、バンドメモリ7番に表示している周波数がメモリされる

 

3.オフセット修正モード
a.Modeボタンを押しながら電源を投入するとこのモードとなる
b.通常計測モードと同等であるが、FuncボタンとModeボタンでオフセット周波数を5Hz単位で加減出来る
c.電源OFFで解除
*古い無線機や受信機では第一局発の水晶発振周波数がズレている事が多いのでこのモードで調整を行う想定である

IMGP5678

写真は、10MHzを入力

・バンドメモリ7番の オフセット周波数は-455KHz

・表示周波数は 10MHz – 0.455MHz = 9.555MHz

・ここでFunc/Modeボタンで、バンドメモリに記録されているオフセット周波数を5Hzステップで修正出来る

 

 

実際にファームウェアを実装してみると、4Kwordでのプログラミングは厳しいのである
コードの共通化や、コードの見直しを行い4Kwrodに押し込める(なんか大昔を思い出してしまうのである)
今風のエレガントなコードからかけ離れてしまったコードが残念である 自分の非力さを改めて思い知ったのであった

直読型周波数カウンタの制作 活用編1へ続く