HOME >> 鉄道模型自動運転システム >  ATS列車自動停止システム 12F635 を使用する

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の仕様を比較してみた。 PIC12F635PIC12F683 の表を見ながらその違いを見てみたが、両方とも同じ様に、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 作成