18F14K50 I/Oポートの設定(入力の制御)スイッチ
18F14K50の入力制御についてまとめました。出力と異なりportレジスタで読み取り制御をするため,入力と出力の記事を分けることにしました。Bootloaderを使ったプログラミングだとRB4とRB5は、入力として利用できないので注意してください。原因不明で、現在も検証中です。
I/Oポートの概要
I/Oポートについては、すでに出力制御で記事にしているのでそちらを参考にしてください。
I/Oレジスタの構造
入力は、下記のようにマイコンへ入力されます。Dフリップフロップと3ステートバッファーで制御されています。
InputBufferを通過してD型フリップフロップへ入力します。※詳しくは、下記のリンクより
※「EN」が1のときに、Dの値を取り込み「EN」が0のときに、入力を保持します
回路図
実験した回路図です。今回は、RB4へ接続しようとしましたが、RB4とRB5で上手く制御できなく、RB6となりました。回路図の修正ができず大変申し訳ありません。Bootloaderを利用しなければ普通に動作します。
プログラムの設定
PICマイコンは、TRISレジスタで入力か出力を決定します。PIC18F14K50は、「Aポート」「Bポート」「Cポート」があるので、下に示したサンプルのように全てのポートへ設定します。
出力に設定:0
入力に設定:1
サンプルプログラム
Bootloaderを使ったプログラミングのため、そのままコピー&ペーストしても動作できないので注意してください。Bootloaderについては、下記のリンク先の記事を参考にしてください。
#include <xc.h>
#define _XTAL_FREQ 48000000
#define SW PORTBbits.RB6
void main(void) {
//ポートセット 出力のみであれば、全て『0』を設定する
TRISA = 0b00000000; //LEDの接続されているポートを出力に設定
TRISB = 0b01000000; //LEDの接続されているポートを出力に設定
TRISC = 0b00000000; //LEDの接続されているポートを出力に設定
LATA = 0; //PortAのすべてのビットを「0」
LATB = 0; //PortBのすべてのビットを「0」
LATC = 0; //PortCのすべてのビットを「0」
while(1){
if(SW == 1){
LATCbits.LATC0=1;
__delay_ms(500);
LATCbits.LATC0=0;
__delay_ms(500);
}
}
return;
}
まとめ
今回の実験では、RB4とRB5が入力として利用することができませんでした。Bootloaderを使わなければ問題なかったのですが、どいうわけか、RB4とRB5が入力として機能しませんでした。
確認したこと
・オートプルアップを停止
・通信機能を停止
RB4とRB5については、さらにアナログ機能も持っていますが、18F14k50はレジスタでピンの指定をすることでアナログとなる仕様なので、なぜ動作しないのか理解できません。さらに、Bootloaderを使わなければ、同じプログラムが動作するので、より「???」状態となりました。かれこれ1時間程度悩みながら原因を特定しようと試みましたが、解決に至らずであきらめることにしました。
また、時間があるときに原因を特定できるように努力しようかなと思いました。よって、Bootloaderを使ったプログラミングの場合、気を付けて作業をするようにしてください。
Bootloaderのプログラムをしっかり読まないとだけなのか??
I am not sure where you're getting your info, but
good topic. I needs to spend some time learning more or
understanding more. Thanks for wonderful info I was looking for this information for my
mission.