PICのポートからの読み込みが正しくできない

このQ&Aのポイント
  • 16F648AのRA1,RA0にSW信号を抵抗でプルアップして入力、RA2はLEDを抵抗を通して直接駆動しています。
  • SW信号を読み取れていないようですが、17,18ピンの電圧を見るとSWの動きと正しくON/OFFしています。
  • 見落とししていることがあると思われますが、解決できません。お気づきの点があれば教えてください。
回答を見る
  • ベストアンサー

PICのポートからの読み込みが正しくできない

先月は16F648AのRA4出力が正しく出来ないを質問した者です。 またしてもお願いします 16F648AのRA1,RA0 にSW信号を抵抗でプルアップして入力、RA2はLEDを抵抗を通して直接駆動しています TRISA はこれに対応してXXXX X011 を設定していて プログラム中でRA1を押されたらLED ON, RA0が押されたらLED OFF となるようにテスト用プログラムを作りましたが SW信号を読み取れていないようです 17,18ピンの電圧を見るとSWの動きと正しくON/OFFしています 先月同様見落とししていることがあると思っていますが 正しい、多分正しいと思遺恨でいますこともあって解決できません お気づきの点がありましたら教えてください お願いするばかりですが宜しくお願いします

noname#230358
noname#230358

質問者が選んだベストアンサー

  • ベストアンサー
noname#230359
noname#230359
回答No.4

データシートにPORTAのイニシャライズのためのサンプルコードがあります。 ;EXAMPLE 5-1: INITIALIZING PORTA CLRF PORTA ;Initialize PORTA by setting output data latches MOVLW 0x07 ;Turn comparators off and MOVWF CMCON ;enable pins for I/O functions  :  : もし、コンパレータをオフにしていないとすれば、ご質問の状態になったと思います。

noname#230358
質問者

お礼

同じ過ちの繰り返しをしていまして皆さんのご迷惑をおかけします CMCON 操作によって 読み込みができるようになりました。 正直なところ全く知識がありませんでした 不勉強からお騒がせいたしました 回答・アドバイスをいただいた皆さんにお礼申し上げます ありがとうございました

その他の回答 (3)

noname#230359
noname#230359
回答No.3

RA0,RA1の端子が内部で断線している可能性もあるため、 実験的に、RA0,RA1を出力に設定して、High,Lowを出力してはどうでしょうか。 RA0,RA1の内部断線はなさそうですね。 RA0,RA1コンパレータがあるようですが、CMCONの設定はいかがですか。

noname#230358
質問者

お礼

アドバイスありがとうございます RA0,RA1を出力ピン設定しまして ON/OFF を繰り返すようプログラムしました 結果は ON/OFF を2ピンとも繰り返しています

noname#230359
noname#230359
回答No.2

> 17,18ピンの電圧を見るとSWの動きと正しくON/OFFしています H/Lがしっかり取れていないと言った簡単なミスではないですか? 例えば、L側で電圧が下がり切れていないとか、ハイインピーダンスに なっているとか。 (ちょっと失礼な回答ですが、違ったらお許しください。)

noname#230358
質問者

補足

おはようございます お返事が遅れていまして申し訳ありません テスターでピンの出力を見ましたところ SWのON/OFFで RA0は4.93Vと89.3mV、RA1は4.93Vと91.4mVとなっています 決して失礼なことはありません 前回もそうですが本当に基本的なことで誤っているのだと思っています そうしたことが判っていないことからこうして助けていただいているのですから

noname#230359
noname#230359
回答No.1

毎度JOです。 16F648AにはADコンバータがありませんから、ADコンバータに起因するトラブルでも無さそうです、 そこで問題を切り分けてみられては、いかがでしょうか! まずは、プログラム通りRA2が出力されているかを確認後、入力の確認と進んでみられては? TRISA はこれに対応してXXXX X011 この後 BCF STATUS,RP0    ページ切り替え MOVLW B'00000100'  RA2に出力してみる  RA2がLOでLED点灯の場合はB'00000000' MOVWF PORTA ポートに出力! この状態でLEDが点灯しない(PICの出力がLED点灯させる状態に無い)場合、まだプログラムに問題があります。 16F648Aのデタシート http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf 毎度JOです。 プルアップされたRA0,RA1の端子電圧が、スイッチの動作により0V - 5Vと変化するのが確認できたなら、やはり問題はプログラムにあります、 スイッチが動作する時には「チャタリング」が必ず発生します、 http://elm-chan.org/docs/tec/te01.html これを回避するには、ポートを1回のみの確認で済まさず、ポートを確認し続ければ、チャタリングの問題を回避できます、 list p=16F648A INCLUDE<16F648A.INC> BSF STATUS,RP0    ページ切り替え MOVLW B'00000011' MOVWF TRISA ポートセット BCF STATUS,RP0    ページ切り替え HOGE BTFSS PORTA,0 RA0を監視 GOTO HOGE1 BSF PORTA,2 出力H GOTO HOGE HOGE1 BCF PORTA,2 出力L GOTO HOGE 入力ポートを監視してて、変化があったら処理をするのではなく、ポートの状態をそのまま出力ポートへ出してみる、 上記の検証により、入力ポートが読めているか確認できます。 追記 コンフィグ(CONFIGURATION WORD REGISTER)でWDTはOFFとなっていますか? コンフィグ設定がされていると、デェフォルトでWDTが18ms周期で掛かってしまい、リセットが掛かり続けます、

noname#230358
質問者

お礼

ありがとうございます 1. コンフィグでWDはOFFにしていまして書き込み器でもそのように設定し てありました 2.先にSWをON/OFFしたときの電圧を確認しました 3.示していただいているプログラムをそのままコピーして機械語に直して実   装しましたが SWのON/OFFでLEDは点滅していません   念のためSWを長時間 短時間押すなどしましたが結果は変わりませんでし  た 

noname#230358
質問者

補足

またお世話になります まさかああした時間帯にお返事をいただけるとは思いませんでしたありがとうございます 状況説明が足りませんでした RA2 LEDへの出力は上手くいっていまして(点滅させることは出来ています)これとRA0,RA1に接続されたSW(+5Vに対して10kΩでプルアップしています)の状態が読み込めていないと判断しています 

関連するQ&A

  • PICの割り込み機能

    現在電子工作をしており、それにPIC16F84Aを使っています。 正直アセンブリはよくわからないので、C言語でプログラムを作っています。 コンパイラはPICCLITEで、LEDの点灯・消灯に関するプログラムです。 機能としては ・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 ・RA0に入力があったときRB0につないであるLEDが点灯しているならLEDを消灯。 ・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 というものを目指しています。 1つ目、2つ目の項目はif文で簡単に実現できましたが、割り込みがうまくいかず、 消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 だからRB0の出力を逆にしてみたんですがうまくいかず・・・。 ハード的には、RB0には反対側から5Vをかけ、 RB0=0の時は点灯 RB0=1の時は消灯 としています。 またセラロックは10MHzのものを使用しています。 現在のプログラムとしては #include "pic.h" #define XTAL_FREQ 10MHZ #define MHZ*1000 void DelayUs(unsigned char cnt){ //時間待ち関数  unsigned char i;  i=(cnt)/(12MHZ/(XTAL_FREQ))|1;  while(--i!=0) continue; } void DelayMs(unsigned int cnt){ //時間待ち関数  unsigned char i;  do{   i=4;   do{    DelayUs(250);   }while(--i);  }while(--cnt); } int cnt,SW; //SWが0なら消灯 //SWが1なら点灯 void interrupt isr(void){ //割り込み関数  if(T0IF==1){   T0IF=0;   cnt--;  }  if(cnt==0){   RB0=1; //消灯   SW=0;   cnt=190;   T0IE=0;   GIE=0;  } } main() {  TRISA=0xFF; //入出力設定  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  SW=0;  OPTION=0x87; //プリスケーラの設定  TMR0=0x00;  T0IF=0;  T0IE=1;  cnt=190;  while(1){   if(RA0==1){    DelayMs(60); //チャタリング防止    if(RA0==1){     if(SW==0){      RB0=0;      SW=1;     }    else{     RB0=1;     SW=0;    }   }  }  if(RA1==1){   DelayMs(60); //チャタリング防止    if(RA1==1 && SW==1){     TMR0=0;     T0IF=0;     T0IE=1; //割り込み許可     GIE=1; //全体割り込み許可    }   }  } } インターネット上での割り込みのプログラムをいくつか見てみたのですが、 どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムばかりでした。 僕のは基本的にRA0の入力によってLEDを点灯・消灯させつつ RA1の入力で割り込みを開始。 5秒後に消えたら割り込みを禁止する。 という仕様にしたいのですが・・・・・・。 1ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。

  • PICのプログラム

    PICのテストプログラムを作ったのですが、LEDの点灯が、順々に動くプログラムのはずがすべてのLEDが同時に着いてしまいます。なぜですか???? とても困っています。誰か教えてくれたらありがたいです。 PICは、16F877Aです。 ポートDにLEDがついています。 TITLE "QUARK Test1 PICUN1" LIST p=PIC16F877A __CONFIG _HS_OSC & _CP_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _WRT_OFF & _DEBUG_OFF #INCLUDE "P16F877A.inc" __IDLOCS D'1' matu EQU 020H matu2 EQU 021H matu3 EQU 022H main ORG 0 clrf STATUS clrf INTCON bsf STATUS,RP0 clrf TRISA clrf TRISB clrf TRISC clrf TRISD clrf TRISE clrf STATUS clrf PORTD clrf matu clrf matu2 clrf matu3 mainloop bsf PORTD,2 call matuloop3 bcf PORTD,2 call matuloop3 goto mainloop ;この後にmatuloop1~3が続く。 END よろしくお願いします。

  • PICマイコン16F84Aを使った入出力でつまづいてます。

    とても初心者な質問です。 色々調べましたがわかりませんでしたので質問させていただきます。 要するに、PORTAを書き換えてRA0~4につないだ任意のLEDを点灯させたいだけなんですが、うまいこといきません。 LEDの極性は間違いないようです。 以下がソースです。 このソースではb'11111'を転送する事で全てのポートAのLEDを点灯させたいつもりなのですが、実際のテストボードでは何故か RA0,RB3,RB5,RB7が点灯して、もうわけわかりません。どなたかご教授お願いします。 LIST P=PIC16F84A ; INCLUDE P16F84A.INC ; __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ORG 0 INIT BSF STATUS,RP0     CLRF TRISA CLRF  TRISB BCF STATUS,RP0 ; <メイン> LOOP MOVLW b'11111' MOVWF PORTA GOTO LOOP END

  • pic のポート出力がされない

    たまにしかPICを使わない割にはその都度お訊ねして恐縮ですがどなたか教えてください。 16F648A のPORTA bit4(RA4) を  MOVLW B'11100000' , MOVWF TRISA によって出力設定しています。 プログラムの中で H/Lレベル出力するようにしているつもりですが LレベルのままHレベルになりません bit3-0 はプログラム通り H/Lが正しく出力しています 何か見過ごしていると思っていますが 気がつかず困っています 宜しくお願いします 追記します SIM によるデバックではSFRの表示から bit4は他のbitと同様正しく出力されていることを確認しています

  • PIC タイマー0の使い方

    PIC16F886を触り始めたのですが、タイマー割り込みで苦戦しています。 タイマー割り込みを使ったLEDの点滅の間隔が、自分の思った時間にならないのです。 下に今のプログラムを載せておきます。 私の今の考え方はこうです。 ・内部クロックは4MHzに設定してある ・TMR0のカウントはクロックの1/4らしい→1MHzなので周期は1μsec ・プリスケーラは1:128に設定→128μsecでTMR0がカウントアップ ・TMR0の初期値を61に設定→195回のカウントアップでT0IF=1 ・128μsec*195μsec=2496μsec≒0.025msec←タイマー割り込み ・40回カウントすると1秒 と、1秒ごとにLEDのON,OFFが切り替わるはずだと考えているのですが、書き込んで計測したところ、約0.8秒でon,offを繰り返しています。 私の考え方やプログラムに間違いがあるのでしょうか? もしくはPICがハード的に壊れているのでしょうか?(picに5Vをかけても動かず、mainが実行中に点灯するLED(この時点では点いていない)の端子の両端を指で触ると何故か動き出します。) 以下プログラムです。(注釈などは省いたので見難いかもしれません) #include <stdio.h> #include <stdlib.h> #include <xc.h> #include <pic.h> #pragma config FOSC = INTRC_NOCLKOUT #pragma config WDTE = OFF #pragma config PWRTE = OFF #pragma config MCLRE = OFF #pragma config CP = OFF #pragma config CPD = OFF #pragma config BOREN = ON #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config LVP = ON void interrupt tc_int(void); volatile unsigned int cnt = 0; volatile unsigned int cnt1 = 0; #define sw RB0 #define led RA0 #define led2 RA1 #define led3 RA2 #define _XTAL_FREQ 4000000 void init(void) //初期設定 { OSCCON=0b01101000; // 内部クロック設定 4MHz TRISA=0b00000000; TRISB=0b00000000; TRISC=0b00000000; ANSEL=0x00; /* 割り込み初期設定 */ GIE = 1; // すべての割り込みを許可 T0IE = 0; // タイマー割り込みを禁止 T0CS = 0; // TIMAR0モジュールをタイマーとして使用 PSA = 0; // プリスケーラをTIMER0モジュール用にセット OPTION_REG |= 0x06; // CPUクロックを128分周 TMR0 = 61; // カウンタ値をリセット T0IE = 1; // タイマー割り込みを許可 T0IF = 0; // 割り込みフラグをクリア } int main(void) { init(); sw=1; led=1; led3=0; cnt1=0; LEDflg=0; while(1) { if(cnt1>=10){ led3=~led3; cnt1=0; } } } void interrupt tc_int(void){ // 割り込みハンドラ if(T0IF == 1){ cnt++; TMR0=61; T0IF = 0; // 割り込みフラグをクリア if(cnt>=40){ cnt=0; cnt1++; led2= ~led2; } } }

  • PIC 初歩プログラムについて

    PICの初めてのプログラムを書いたのですがテキストのように動きません。 ORG 0 ; MAIN  BSF STATUS,RP0 MOVLW B'00000000' ;ポートB 出力 MOVWF TRISB ; MOVLW B'00001111' ;ポートA 0,1,2,3入力 MOVWF TRISA ; BCF STATUS,RP0 SW BTFSS PORTA,0 GOTO  LED1 BTFSS PORTA,1 GOTO LED2 GOTO SW LED1 MOVLW B'00000010' MOVWF PORTB GOTO SW LED2 MOVLW B'00000001' MOVWF PORTB GOTO SW END 入力SWを押していないときがHIです。したがって何もしなければSWのループになると思うのですが、LED2に行ってしまいます。BTFSC POARTA,1とすればSWループ状態ですがテキストとは違います。 何かおかしいのでしょうか?

  • PIC アセンブラ ポートB 内部プルアップ抵抗の使い方

    PIC16F877Aを使っています。 プログラムを作り始めてかなりたってから ポートBにプルアップ用の抵抗があることを知りました。 それで使い方とか調べてみたんですが ポートBで内部プルアップを使う場合は RBを全部入力設定にしないといけない的な事を 書いてるページがありました。 これって、そうしないとPICが壊れてしまうって事でしょうか? RB0~RB3にタクトスイッチ(入力) RB4~RB7に7セグのカソード(出力) として入出力を混ぜて使いたいのですが スイッチ用にポートBをプルアップ抵抗ONにしても問題ないでしょうか?

  • PICによるLED制御について

    大学の講義でPICのLED制御の課題がよくわかりません。 どなたか教えていただけないでしょうか? [問]  PIC16F84Aにおいて、動作を実現するプログラムを示せ。  メインルーチンでLED出力の点燈箇所を1秒ごとに巡回させる。   RA3=Low(OFF)のとき、左向きに巡回シフト(RLF命令)させる。   RA3=High(ON)のとき、右向きに巡回シフト(RRF命令)させる。  また割り込みルーチンによって、RA0~RA2の3ビットの値に応じて  点灯速度を変化させる(値が大きいほど速く)  ただし、ポートAは全て入力モード、ポートBはRB0以外を出力モードとし(RB0は割り込み用)、ポートBの初期出力を0000100*(LED出力の初期点燈位置は第3ビットのみ)とせよ。

  • PIC16F84AのRA4ポートに流せる最大電流

    PIC16F84AのRA4(オープンドレイン)を使ってリレーを直接ON/OFFさせようと 考えていますが、RA4ポートは最大どのくらいまで電流を流せるのでしょうか。 自分なりに仕様書を見ましたが、RA4については記載が無かったと思います。 リレーは、コイル電圧が5V、電流40mAです。 よろしくお願いします。

  • マイコンPIC16F84Aについて質問です

    MPLAB(秋月)のライターを使用して PIC16F84Aにプログラムを製作したいのですがプログラムの組み方がわかりません 内容は、センサー5v~24vがオンしたらLEDが点灯する回路です。 動作確認をしたところ、センサーはオンオフしているのですが、LEDが点灯しません。 プログラムを組む時に、RB0がオンしたらRA0がオンする為の繋がりがイマイチわかりません。 c言語はわからないので、アセンブル命令で教えていただけないでしょうか? 初心者なので全くわかりませんがお願いします。