PICを使っていていくつか困ったことになったことがあったのでメモしておく。
凄く当たり前のことばっかりメモしてると思うけど、独学初心者だからしょうがないね!久しぶりに扱うといっつもゼロから思いださなくてはいけないから、ここに残す。
入力スイッチが不安定なときは抵抗を入れる
イメージしたものと違う動きをするので、プログラムの書き方が違うのかなあ。と思ったんだけど、スイッチの回路に問題があった。PICの入力端子が浮いた状態になると、不安定になるそうだ。スイッチをオフにしても、オンになったりする。これは、スイッチがオフの状態になって浮いた状態になったとき、PICの入力端子が5VにもGNDにも繋がっていないと、かってにオンオフを繰り返すような挙動になる。ということらしい。これの問題がはっきり分かるまで問題個所を切り分けて探すのがとっても大変であった。
PICの設定や種類によっては、この現象を抑える機構が入っているものもあるらしい。(WPUxというレジスタを使うぽい。今度試してみよう…)
WPUB = b00000111; // RB0-RB2をプルアップする
WPUEN = 0; //プルアップ有効化
解決策は、スイッチ部分の回路にプルアップ抵抗を入れるというものだった。プルダウンというのもあるらしいけど、プルダウンではうまく動かないという情報もいくつか散見したので、良く分からないから、プルアップ抵抗にした。プルアップとプルダウンで抵抗値が違うっぽい。
トグルスイッチの他にワイヤレススイッチのモジュールも使ってみたので、それの使い方もメモ。一般的にはCOMの側をGNDに繋ぐとどこかに書いてあったけど、購入したものはCOMに+Vを入れるようになっていた。
7805やPICが壊れるときは整流ダイオード
たくさんのLEDを駆動するのに、24Vにつないで約1000球光らせようとしていたが、PICを動かすために5Vをつくるための7805というICがしょっちゅう壊れて困ったのでメモ。電解コンデンサーが焦げるような臭いになり、7805がすっごく熱くなり、PICも壊れるということを繰り返す。PIC10個は壊れたよ… PICが壊れるということは、主電源の24Vが流れてきて壊れているんだろうなあということは予想できてたんだけど、最初のうちは、トランジスタの入れ方が悪いのかなとか、トランジスタに入れる抵抗値が悪いからかなと考えていた。でも、試行錯誤の結果なんとなく原因が分かってきた。電源を切るときに、どうやら壊れているっぽい。調べてみると、電源をオフにするとき、電圧が下がることで、電流が逆流することがあるらしい。それでICが壊れる場合があるとのこと。ということで、電圧が下がっても一定の方向にしか電流が流れないようにするための整流ダイオードを入れてみることにした。これで壊れなくなったので、たぶん正解だった。どこにどう入れたら良いのかはっきり分からないので、怪しそうな7805とPICに繋がっているトランジスタの2カ所に入れてみた。ダイオードはアノード、カソードがあって、電流が流れる方向が決まっているから、逆流しないってことっぽい。てことは代わりにLEDとかでもいいのかな?これは試してない。http://geo.d51498.com/k_otani3/working/working_15.html
ANがついているPICは設定の必要あり
アナログ入力の機能がついているPICは、初期設定でデジタル入力ではなくアナログ入力になっているらしく、そのままでは使えないということがある。PIC16F648Aが手元にあったので、それを使おうとしてたが、RA2に繋いだスイッチの挙動がおかしい。上記のプルアップ抵抗の件と合わさって、原因が全く分からなかったのでメモ。
種類によって設定の方法が違うらしいけど、とりあえず、16F648Aでは、
CMCON = 0x07; //b00000111
と設定することで、デジタル入力に切り替えできる。
アナログ入力についてはまだやったことがないので良く分からないけど、ADコンバータとアナログコンパレータという2種類があるらしい。片方の機能しかないPICもある。アナログコンパレータはCMCON、ADコンバータはANSEL(ピンのアナログ、デジタル切り替え)やADCON(AD有効化)あたりでどうやら設定できる模様。いずれ試してみたい。
TRISA,PORTA違い
TRISはピンの入出力モード設定
PORTはピンの値を読み書き
RB0/INT , RBの入力変化読み取り
入力の読み込みかたがいろいろあるっぽい。最初RB0/INTでやってたけど、うまく動かなかったからRBの入力変化を読み取る方法でやってみた。RB0と他のRBのピンでは、INTCONで立ち上がりエッジにする、立ち下りエッジにするという設定ができるかできないかの違いに見える。RB0では、オンになったのかオフになったのかを別々に見れるっぽい。
その後、RB0も使ってみた。LからHに変化したときに割り込み検知するのは立ち下がりエッジ、HからLは立ち上がりエッジということみたい。
TMR0
入力スイッチのチャタリング防止の時に使ったりもできるらしい。全然使い方が分からなかった。今後試す。
http://okgnz.web.fc2.com/picy/picy08.htm
https://smtengkapi.com/engineer-pic16f1827-difilter
とりあえず、分からなかったので、下のような感じでdelay使ってチャタリング防止を現状ごまかしてる。なんとなく大丈夫ぽい。
if(RB7==1){
__delay_ms(100);
if(RB7==1){
while(1){
・・・
}
}