第10週 先週と同等の回路をPIC12C509で構成してみる
富士重工の工場の真ん前にお菓子屋さんがあります。看板にでっかく「スバル最中」(^^; おい、おい。商標権なんのそのですね。
富士重工さんも多少は宣伝になるかな、なんて思って見ない振りしているんでしょうか。んな。
でも、お菓子屋さんも立場上多少控えめな態度に出てるところがなんとも奥ゆかしいです。分家の分際で本家を越えては失礼と、看板の「スバル」の文字、わざわざダサい字体になってます。そりゃ、単にセンスの問題でしょうか。
でも、スバルが町の自慢なのは分かりますが、ナニもお菓子にまでするこたぁないでしょうに。他に自慢するモンが思いつかなかったんでしょうか。太田と言えば、昔から関東の雄・新田義貞とか昔懐かしい焼き饅頭とかもあるでしょうが。
ちょっ、ちょっと待って。
新田義貞最中はともかく、焼き饅頭最中、味噌なんか塗りたくっちゃうわけでしょ、冷静に考えてみて、こりゃちょっとダメな気もする。(^^;
ま、この際やっぱりスバル最中で行きましょうか。
別のPICでやったらどうでしょうか。
Akiプログラマのおまけに8ピンタイプのPIC12C509がついてきました。ついでに紫外線消去タイプも買ってあります。ひとつこいつでもやってみようとスケベ根性起こしたのが泥沼のもと、たかが移植と思ったら、たいへん、たいへん、エライ苦労してしまいました。
でも苦労は買ってでもしろといいます。買いはしませんでしたが、苦労は、しました。ともかく、かなり別物だという印象です。
先週と同等の回路をPIC12C509で構成してみる
■テーマ
1.チップが替わったときどのくらい互換性があるのか知る。
2.8ピンタイプでどのくらいのことが出来るのか試してみる
前回の回路のPICのみを交換して手直ししました。
◎内部オシレータ使用可。外部に発振子を接続しなくても良いので、これは安上がり。
ただしそのための操作や設定が必要。
◎命令系統
ありゃま、SUBLW 命令が、ない。
◎レジスタ
OPTIONレジスタ、TRISレジスタの設定が必要。
この書き込みのためにTRIS,OPTION 命令がある。
PIC16F84ではレジスタファイルにMOVWFで書き込んでいたのが12C509ではそれに相当するレジスタファイルが
ないものもあり、そのかわりTRIS,OPTION 命令がある。
16F84でTRISAレジスタにI/O設定を書き込むかわりにTRIS命令がある。
OPTIONレジスタ書き込みと一部類似の処理にOPTION命令がある。
てこずった点や難儀した点を◎印で注釈入れました。
; PMM8713代替509
;*********************************************
LIST P=PIC12C509 ;
INCLUDE "P12C509.inc" ;標準ヘッダ定義ファイル
__CONFIG _MCLRE_OFF & _IntRC_OSC & _WDT_OFF
; ◎CONFIGは Register definition がInclude File に書いてあるので
; INCLUDEの後に書かなければならないらしい。
;*********************************
CNT EQU 0CH ;カウンタ
;***********************
; メインルーチン
;***********************
ORG 0 ;Reset Start
MAIN ;Initialize
; ◎ここから4行が16F84と異なる設定方法
; (OPTION,TRIS命令なんてモノが突然出てきた)
MOVLW B'11011111' ;GP2 は I/0 として使用
OPTION
MOVLW B'101000' ;I/O設定
TRIS GPIO ;ポートA bit3,5入力
MOVLW B'010001' ;初期出力 1001 bit3,5は入力
MOVWF GPIO
MOVLW 0H ;COUNTER初期設定
MOVWF CNT
LOOP1
BTFSC GPIO,3 ;bit3が0(pulse L)なら進む
GOTO LOOP1
LOOP2
BTFSS GPIO,3 ;bit3が1(pulse H)なら進む
GOTO LOOP2
BTFSC GPIO,5 ;bit5(正逆)チェック
GOTO FWD ;正転
GOTO RVS ;逆転
FWD ;正転カウント処理
MOVLW 07H
SUBWF CNT,W
; ◎SUBLW 命令、そんなもんは PIC12C509 には、ない。(*_*)
; そのためこの部分前回と異なるプログラムとなる。
BTFSC STATUS,2
GOTO SET0 ;カウンタ値 7 なら 0 に
INCF CNT,F
GOTO INCED
SET0 MOVLW 0H
MOVWF CNT
INCED GOTO PATTERN
RVS ;逆転カウント処理
MOVLW 0H
SUBWF CNT,W
BTFSC STATUS,2
GOTO SET7 ;カウンタ値 0 なら 7 に
DECF CNT,F
GOTO DECED
SET7 MOVLW 07H
MOVWF CNT
DECED
PATTERN
MOVF CNT,W
CALL TABLE
MOVWF GPIO
GOTO LOOP1
TABLE
ADDWF PCL,F
RETLW B'010001'
RETLW B'000001'
RETLW B'000011'
RETLW B'000010'
RETLW B'000110'
RETLW B'000100'
RETLW B'010100'
RETLW B'010000'
END
先週と同等の結果でした。
クロックが 10MHz に対し 4MHz ですから出力もその分低速で使わなければなりませんがステッピングモータの最高応答周波数からいって実用上大丈夫です。
このままワンタイム書き込みのデバイスにすれば、1個180円だぜぃ。(^^)(^^)
■こんなことにも気づいた
◎デバッグでレジスタを見ていると入力設定したビットははずして詰めて出力部分だけを数値としてモニタしているようです。
たとえば
TRISで[101000](1が入力)と設定しておいて出力を[010001]とする。
モニタは「11」(H)ではなく[09](H)と表示される。
◎Akiプログラマ画面で
FOSC IntRC 内部オシレーション
WDTE OFF ディスエーブル
CP OFF コードプロテクションオフ
MCLRE Internal 内部クリア
となっているので CONFIG がOKだとわかります。
ただし
CALIB 00
について(内部オシレーション校正値)は[FF]となっているのをAkiプログラマ上で[00]に書き換えました。
データシートによると個々のデバイス毎に校正値があらかじめプログラムの最後の番地に書き込んである、となっています。
Akiプログラマで読み出してみると最後の番地は [00] となっていましたので書き換えました。
このあたりのことはまだどうも良く理解していません。どうせ適当な時間管理ですから、まあ、いいか。
■今週のなるほど
◎コンフィグレーションレジスタについて
またまたコンフィグレーションレジスタについてです。
Include File を開いてみてやっと合点がいきました。 Include File に Configuration Bits の定義が書いてあります。
たとえば
_MCLRE_ON EQU H'0FFF'
_MCLRE_OFF EQU H'0FEF'
_WDT_ON EQU H'0FFF'
_WDT_OFF EQU H'0FFB'
という具合です。Config ビットのうち MCLRE は Bit4 ですからこれを[0]とするには H'0FEF' を書き込むというわけです。
いくつか Configuration Bits の設定が必要なときはこれをANDすれば[0]を着目して設定を積み重ねられるわけです。
_MCLRE_OFF & _WDT_OFF とすれば H'0FEF' と H'0FFB のANDで H'0FEB' となるわけです。
頭いいですね、PICの疑似命令。こんなんで感心するオレが頭悪い、か。
◎PICの互換性について
特に12C509がやっかいということはありませんが、互換性が高いかというとそうともいえない感じです。
やはりターゲットを見定めてから取りかかる方がいいようです。