第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がやっかいということはありませんが、互換性が高いかというとそうともいえない感じです。
  やはりターゲットを見定めてから取りかかる方がいいようです。