Darkside(https対応しました)

2014年5月28日(水) 21:26

MCLR

 アセンブラとの mixed langage programming は必須になりそうな感がある。
 もちろんインラインアセンブラというのはあるが、関数の引数や返り値と連動できなければ意味はない。
 PIC系の開発環境は、ローカルラベルの使えないマクロというゴミをかましてくれた例があるので、油断ならない。

 LEDを点滅させるには、人間が見て分かる程度の時間待ちを行わねばならない。面倒なので、タイマー割り込みで点滅させる例を参考にする。
 1.024倍のクロックアップしてるので、キリのよい時間をタイマーで簡単に作り出せる。うまく行きそうなら、時間計測もタイマーで済ませるのがベストと思われる。dsPICでは16ビットのタイマーを連結して32ビットとして使えるので、超音波の反射時間をクロック単位で計測可能。
 0.5秒ごとに点灯と消灯を繰り返すようにする。すなわち、1秒ごとに光るはず。
 だが PicKit2 で書き込むと、恐れていた通りLEDは消えたままである。

 タイマー割り込み方式だから、メインの処理は空ループ回ってるだけである。そこでその空ループ内にLED状態反転コードを追加。時間待ちは無いので、点滅は肉眼では分からないはず。暗く光り続けると想定される。
 これで書き込むと、確かに点滅しているようだが想定以上に暗い。室内照明を落とさないと、良く見えない。しかも、点滅が速い。点滅していることは分かるが、毎秒数回は光っている。

 なにかおかしい。

 今度は常時点灯のコードに変えてみる。ところが、LEDの挙動は変わらない。異様に暗く、速く点滅する。そう、常時点灯のコードなのに、点滅するのだ。これまでの経験から、思い至った。これはきっと、dsPIC がリセットを繰り返している。
 パワーオン遅延を設定しているため、リセットしまくれば毎秒数回の点滅になるだろう。
 ではなぜ即時リセットを繰り返すのか。引っ掛かっているのは、MCLR を無効にしてあること。外付け抵抗も付けていない。PIC16F88 では、MCLR 内部プルアップの設定が可能であり、その場合 MCLR は I/O ピンとして使用できた。PIC16F88 ユーザーの大半が恐らく MCLR を無効にして使っている。わざわざ存在する意味が無い。

 これに対し F4012 では、MCLR は独立ピンであるうえに I/O ピンとしては使えない。内部プルアップの設定も無さそうである。
 dsPIC ではピンアサインが冗長であり、旧PIC に比べるとピン数の割に使える I/O が少ない。
 素直に外付け抵抗を付けたうえで、MCLR を有効にすべきではないか?

 試しに PicKit2 を外し、三端子にラジコンバッテリーを接続。すると、ほぼ想定通りのタイミングでLEDが点滅を始めた。と思った瞬間LEDが消えたままになり、再度ラジコンバッテリーを接続し直しても消えたまま。MCLR が外付けも何も無しでオープンというのがマズいかもしれない。
 とはいえ、どうやらクロックは無事に動いているっぽい。

written by higashino [高度測定装置] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4