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のために、貴重なプログラムエリアを無駄に消費してしまうのである

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

超基本 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全体に流し込める電流の方が多いためである

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

直読型周波数カウンタの制作 仕様検討編

いままで、色々と調べて来た内容から、制作する周波数カウンタの仕様概要を決めるのである

HMY0121_4

<とりあえずの回路図である>

以下 直読型周波数カウンタの仕様概要案

1.動作範囲等

a.周波数の測定範囲は100KHzから40MHzまでとする (内蔵PreScale OFF時)

b.入力感度は3dBm以上入力インピーダンスは50KΩ以上 (40MHz時)

c.動作温度は常温とする

2.周波数計測桁数は10MHz測定時に7桁(ゲートタイム0.1秒時)とし、ゲートタイムが1秒時には8桁とする

3.測定周波数とオフセット周波数の表示は同時に行う

4.表示は16桁2行のLCDとする

5.操作系のスイッチは以下の通り

a.ゲートタイム切替  b.オフセット登録(FUNCTIONキー) c.変調モード切替(MODEキー) d.内蔵PreScreler切替 e.バントメモリ切替(ロータリーSW)

FunctionとModeキーは登録したオフセット周波数の+-の調整機能を持たせる

6.マイクロコントローラはEEPROMが256Bytesでプログラムステップ4Kwordの16F88を使用する (将来は16F1827切替を予定)

7.周波数計測の増幅器は、入力インピーダンスを高くし感度を確保するため、初段にFETを使用しPICへのT1入力へトランジスタを使用する二段アンプとする

8.ファームウェアの実装でC言語だとプログラム容量の不足が想定されるため、開発言語にはアセンブラを用いる

9.クロック信号には20MHzの水晶発振ユニットとする、精度が必要な場合は発振器を選別で対応をする
ざっくりとした仕様は上記であるが、全体のかなりの部分がファームウェアの開発に費やされることになるである

要素技術確認編へ続く

*筆者はこの回路及び記事を使用した場合の責任は負いませんのでご留意下さい

FT-101E その2 OptionのYC-601

YC-601B

YC-601B

かのFT-101シリーズ用の周波数カウンタ(周波数表示装置)である
(表示桁数は6桁で、1.5MHz~29.9999MHzまで100Hz単位で表示が可能)
YC-601Bは親機(FT-101)のVFO出力の周波数を計測して、各バンド毎にMHz帯の2桁表示をバンドSWで選択することで、オフセット周波数を見かけ上の演算を行い表示する
FT-101内蔵VFOの発振周波数は9.2MHz~8.7MHzの500KHzでありこの周波数を計測する
(注:ノイズ対策ため内部で13.5MHzor14.0MHzに変換して計測している)
YC-601Bの右側のバンドSWでMHz帯の2桁を選択して直読周波数としている

これを通常の周波数カウンタで表示するためには、オフセットの演算が必要である
7.1MHzの表示については以下の計算となる
VFOの発振周波数 9.1MHz
オフセットベースの周波数 16.2MHz
表示周波数=16.2MHz – 9.1MHz = 7.1MHz

往年の銘器であるFT-101も周波数が直読出来れば、現代でも活躍の場は拡がりそうではある
たまにYC-601がオークションに出品されているが、コレクションアイテム価格なのは残念である

 

PICのソフトウェア開発環境

PICのソフトウェア開発環境は、Microchip社から無料で提供されている
MPLABXを使用するのが一般的かと思う

MPLABX
この開発環境は、エディターからアセンブラ・リンカ・シュミレータ(デバッガ)を含んだ統合環境である。
特に、素晴らしいと感じるのはPICのシュミレータである
このシュミレータは、PIC自体が無くても、PICのプラグラムを走らせる事が出来る
PICの動作については、このシュミレータで検証する事ができる
また、このシュミレータはC言語やアセンプラで使用している、変数や各ラベルに対応しているので、デバッグも効率的であり、各IOピンの状態も画面でウォッチ出来る
只、開発環境自体の機能が豊富であるがゆえに、慣れるまで操作には戸惑う事があるかも知れない
これについては’習うより慣れろ’で操作を覚えるしかない

更にPICKIT3を使う事で、PIC自体へのプログラム書込と、回路に組み込んだ状態でのデバッグが可能となる
(回路に組み込んだ状態での、プログラム書込とデバッグについては、ISCPと呼ばれる回路での仕組みが必要)
PICKITについては数千円で入手出来るし、文献や情報も沢山あるので、PICでプログラミングを検討している方は入手すべきアイテムである

何らかのシステムに組込んで使用する、マイクロコントローラではデバッグが特に肝となる
場合によっては、回路そのものの動作チェックまで、マイクロコントローラでプログラムする可能性もある
目的のソフトを作成する前に、システムで使用する各要素のデバッグを完了させないと、少しコードサイズが大きくなって来ると、混乱してしまう事もある

マイクロコントローラを選定する要素としてデバッグの効率性は重要なポイントである
それなり投資が出来る人(会社)は、ICE(in-circuit emulator)の利用やメーカサポートが重要であるが
少額で、評価や開発を行いたい人には、MPLABXは魅力的である

時代の変化

 

その昔、何らかの処理をコンピュータで動かすには、大変な作業が必要であった

CPUからのアドレスバスにデコーダを繋ぎ、指定したアドレスにラッチ回路を入れ

それらのハードウェアをデバッグしつつ、ソフトウェアを書いて行くって感じで、CPUを含んだ基板を設計するだけでも、手間がかかったのである

現在であれば、PICに代表されるマイクロコントローラがあれば、簡単に実現出来る

それもクロック精度が重要でなければ、クロックは発振器が内蔵され、プログラムを流して電源を投入するだけで動作してしまう

テクノロジーの恩恵は享受しなければ損である、仕事であれ趣味であれ、やりたい事が低コストで実現出来るのであれば、色々とチャレンジしてみたい

p1

(この写真は8pin 12F675 古めのチップであるが 1024Wordのプログラムエリアで64Byteのメモリ、4CHのA/D変換器と2つのタイマーを持つ)