HOME >> 鉄道模型自動運転システム > ATS列車自動停止システム 12F635 を使用する
この制御システムに使用している8ピンPICマイコンは、当初は12F635 を使用予定であった。 しかし、教則本の例題は機能の豊富な 12F683 を使用していた。 このため安全を見て、両方のタイプを入手して工作を始めた。 最初は 12F635 を使い、使教則本に示されたサンプルプログラムを打ち込んでみたのであるが、アッセンブルエラーばかり出て素人にはお手上げであった。 そこで、教則本の通りの 12F683 に変えてプログラム構築を進めて来たいきさつがある。
しかし、同じ仲間の 12F635 が使いないのは何故なのか、疑問のままでは見過ごすことができなかったので、再度挑戦することにした。
■ 12F635 エラーの内容と対策
プログラム記述のためのエディタとアッセンブラは、MPLAB IDE を使用している。 このバージョンは v8.53 である。 教則本で紹介されているものと同じと認識しているのだが・・・・・。 そして、マイコンに書き込むためのライターとしてPICkit 3 を使用している。
◆ _INTOSCIO がエラーになる
何故だか、アセンブル時に _INTOSCIO が定義されていないとエラーになってしまい、前に進まないのである。 そこで、このコンフィグの意味をあちこちの情報を探して探ってみた。 すると、内部クロックか外部クロックかの選択と、クロック信号を出力するかしないかを決める大切なコンフィグであることが分かった。 さらに、これらに関するポートは GP4 と GP5 を I/O ポートとして使用するのかどうかも設定しているのである。
ちなみに、このコンフィグ部分を消してアッセンブラを掛けると、問題無く通るのであるが、マイコンの作動はダンマリであった。 何故 12F683ではOKなのに、12F635 ではNGとなるの・・・・・・・・・?。
Informations about the PIC microcontrollers にてPIC12F635とPIC12F683の仕様を比較してみた。 PIC12F635 と PIC12F683 の表を見ながらその違いを見てみたが、両方とも同じ様に、FOSC = INTOSCIO として定義されているようだ。 それぞれの仕様を見ていてもよく理解できないので、結局は、このソフトのバグとではないかと疑るようになった。
しかし、それでは対策にならないので、ソフトのあちこちの項目を探っていたら、下記の項目を見つけた。 注目したのは、Configuration Bits という項目の Configuration Bits set in code とあるチェックボックスが、デフォルトでチェックされている点であった。 このチェックを外すと、下の欄の項目が選択できるのである。
Field の欄の WDT を見て、ウオッチドックタイマーの項目だと理解し、ここの欄にて、コンフィグが手動で設定できることを理解した。 そして、他の項目の内容を猛(?)勉強してその意味を理解出来たので、下の図のような選択を設定した。 オッシレータの項目は、Internal RC No Clock を選択した。
各選択項目に対して、自分なりに学習・解釈して設定した理由を下記に示す。
Field | Category | Setting | 項目の意味と選択した理由 |
---|---|---|---|
OSC | Oscillator | Internal RC No Clock | オシレータの種類。PICマイコンを動作させるクロックを外部から供給するのか、内部クロックを使うのか、またそれぞれに対してより詳細な設定もします。 内部クロックを使用し、クロック信号をポートからも出力しないので Internal RC No Clock ⇒ _INTOSCIO を選択する。 この設定によって、2番ピンをGP5とし、3番ピンをGP4として使用できる。 |
WDT | Watchdog Timer | off | ウォッチドックタイマ使用有無。 使用しないを選択する。 |
PUT | Power Up Timer | on | パワーアップタイマ有効・無効。 電源投入直後やリセット直後は電源の状態やPIC内部の動作状態が不安定なケースがありますので、その間ちょっとだけPICマイコンの動作を停止させておく、というタイマー設定です。 使用するを選択する。 |
MCLRE | Master Clear Enable | Internal | マスタクリア有効・無効。 PICマイコンも外部からリセット信号を与えることができます。 外部からリセット信号を使用しないのでマスタクリアを無効にする。 このため、4番ピンを外部からのリセット信号用ポートではなく、GP3として使用出来る。 |
CP | Code Protect | off | プログラムメモリコードプロテクト有無。 コードプロテクトしない。 |
CPD | Data EE Read Protect | off | EEPROMメモリコードプロテクト有無。 コードプロテクトしない。 |
BODEN | Brown Out Detect | BOD Enabled, SBOREN Disabled | 電源電圧低下時の処理選択。 電源電圧低下リセットを有効にする。 |
IESO | Internal External Switch Over Mode | Disabled | 内部・外部切り替えモード選択。 PICマイコンの起動をスムーズにするために、電源投入直後は内部クロックで、ある程度時間が経ったら外部クロックに切り替える、という設定が可能です。 外部クロックを使用しないので無効にする。 |
FCMEN | Monitor Clock Fail-safe | Disabled | フェールセーフクロックモニタ有効・無効。 外部クロック故障時に内部クロックへの切替。 外部クロックを使用しないので無効にする。 |
WUR | Wake-Up Reset | Enabled | ウェイクアップリセット。 スリープからウェイクアップする際のリセットの設定。 |
1 #include P12F635.INC ; PIC12F635用のヘッダファイルの読み込み 2 3 ; コンフィグレジスタの設定 4 ; __config _BOD_ON & _WDT_OFF & _MCLRE_OFF & _INTOSCIO 5 6 ;ファイルレジスタの割り当て 7 CT_DELAY1MS equ 0x40 8 CT_DELAY100MS equ 0x41 9 10 ; 初期設定 11 bcf STATUS, RP0 ; バンク0 12 clrf GPIO ; GPIO の出力が0になるよう設定 13 movlw 0x7 ; W ← 7 14 movwf CMCON0 ; CMCON0 ← W = 7 : コンパレータをオフ 15 bsf STATUS, RP0 ; バンク1 16 ; clrf ANSEL ; ANSEL ← 0 : A/Dコンバータをオフ 17 movlw B'101000' ; W ← '101000' 18 movwf TRISIO ; TRISIO ← W : GPIO を出力に設定 19 bcf STATUS, RP0 ; バンク0 20 21 bcf GPIO,0 ;信号赤を消灯 22 bcf GPIO,1 ;信号橙を消灯 23 bsf GPIO,2 ;信号緑を点灯 24 25 ; プログラムの主要部分 26 LOOP ******** 省略 ***************************** 89 ; delay10us サブルーチン 90 delay10us 91 goto $+1 ******** 省略 ***************************** 98 goto $+1 99 return 100 ;delay1ms サブルーチン 101 delay1ms 102 movlw D'256' 103 movwf CT_DELAY1MS 104 delay1msL 105 call delay10us 106 decfsz CT_DELAY1MS, f 107 goto delay1msL 108 goto $+1 ******** 省略 ***************************** 115 goto $+1 116 return 117 ; delay100ms サブルーチン 118 delay100ms 119 movlw D'10' 120 movwf CT_DELAY100MS 121 delay100msL 122 call delay1ms 123 decfsz CT_DELAY100MS, f 124 goto delay100msL 125 return 126 127 ; プログラムの主要な部分の終わり 128 end ; プログラム終了
そして、プログラムをアッセンブリしてPIC に書き込み、制御ユニットにセットしたのだが、結果は期待外れで・・・・・・緑LEDが点灯したままであった。
◆ 教則本のサンプルプログラムを走らせてみる
もし、コンフィグが正常にセットされているのであれば、教則本に示された簡単なプログラムは作動するはずであると考えて、教則本に紹介されているプログラムを最初から実施してみた。 この推定はまさに正解であった、
リスト4-1、リスト5-1は問題無く作動したので意を強くしたのであるが、リスト6-1では途中で止まったままであった。 このプログラムはLEDを時間をおいて点滅させるもので、タイマーの設定を使用しているのである。 そのタイマー設定は、汎用レジスターを使用しているものであった。
右のプログラムは、今回作動させようとしているプログラムの完成状態ですが、そのタイマー作動部分は、教則本の内容をそっくり活用しています。
教則本のプログラムも動かない! これは、PIC12F635とPIC12F683 の差異に違いないと判断して、そのポイントはタイマー部分にあると推測した。 そして、このタイマーのカウントを記憶する部分は、汎用レジスターを使用しているので、ここが怪しいと睨んだ。
そして、PIC12F635とPIC12F683 のレジスタ・ファイル一覧表を比較した。
見つけたぞ! PIC12F635とPIC12F683 の違いを!
そうです。
汎用レジスタのアドレスは、PIC12F683 は 0x20 〜であり、 PIC12F635 は40h 〜と記されていました。 40h は16進数の表示方法なので、0x40 と同じです。 レジスタのアドレスが違っていたのです。
そこで、右のプログラムの7行目と8行目のように、アドレス指定を変更して、再度機能チェックを実施してみました。
大成功でしたね!
これで、安心して、PIC12F635 の石を使用する事が出来るようになりましたので、プログラムのチューニングに集中できるようになりました。
結論としては、PIC12F635 と PIC12F683 とはレジスタのアドレスが異なっているので注意すること。
2019/9/1 作成