• ベストアンサー

PIC 18F2320のI/Oポート

PIC 18F2320のI/OポートにおいてポートCの5ビット目の出力が ビットセットしてもLowのままでHighになりません。 ポートCはすべて出力設定になっているし、SPIも使用していません。 ちなみにポートCの5ビット目以外は、ビットセットでHighに変化します。 ハードの接続(回路)の問題はないと思います。 何か他に設定すべきところがあれば教えてください。

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

RC5はSPIのSDOとは選択になっていますが、それ以外には兼用していません。 出力されないとしたら、 (1)実はSPIが有効になっている。RC3/SCKなどに信号が出ているなら否定されますが。 (2)どこかでグランドにショートしている。グランドとの抵抗値を計ってみると確認できます。0Ωならショートしています。 (3)ソケットを使っていたら接触不良や足が曲がっている。PICの足と接続先の端子との抵抗値を計ってみると分かります。0Ωなら接続しています。 (4)不良品。壊れている。交換できるPICがあれば交換してみると確認できます。 などが考えられます。

naka_naka
質問者

お礼

 ご回答ありがとうございました。 私は、ハードは詳しくないのでとにかく抵抗値を計ってみました。 ショートはしていないみたいですが、RC5をHighセット固定にしてソケット(ソケットを使用しています)にさしたままだと0Vなのですが、ピンをうかせると5Vになりました。 データーシートには特に記述がないのですが、ハード面でなにか問題があるのかもしれません。このハードを設計した人は別にいますのでその人に相談したいと思います。

関連するQ&A

  • マイコンH8/3048FのI/Oポートについて教えてくださいm(_ _)m

    全くの初心者です。。。 マイコンH8/3048FのI/Oポートについて教えてください。 こちらを用いて、PCの電源を遠隔操作で ON/OFFするスイッチを作成しようと試みています。 マニュアルによるとH8/3048Fには、 10本の入出力ポートがありますが ポート1~6,8では90pF、9,A,Bでは30pFと 駆動出来る容量負荷が異なっています。 これの意味する所がよく分かりません。。。 同じレベルで出力を利用したい場合、 出力ポートによっては、後のハードの回路で 増幅したりする必要があるのでしょうか?? 何か参考になるHPなどありましたら 同時にお知らせ頂ければ幸いです。 初歩的な質問で申し訳ありませんが、 どうぞよろしくお願いしますm(_ _)m

  • PIC(16F84A)を使用して周波数判定を行い…

    PIC(16F84A)を使用して周波数判定を行いたいのですが…。 PICの16F84Aを使用し、周波数を判定して出力としてHIを出力する、LOWを出力するなどの判定を行うプログラムをC言語で行いたいと考えております。 例として100Hz以上の周波数が入ってきたときに、HIを出力したい場合、どういうプログラムを組めばよいのでしょうか? 周波数を判定する関数等はあるのでしょうか? よろしくお願いします。

  • PIC16F877のビルドについての質問です。

    PIC初心者です。 MPLAB IDE v8.30を使用して、PIC16F877でLCD SC1602BS*B を駆動しようとしていますが、メインプログラムを書く前に、最初の段階(おそらくは設定かインクルードの方法)でつまづいてしまい、エラーだらけになってしまいます。 ・ConfigureのSelectDiviceは、16F877を選択 ・ネットで見つけた"lcd_lib3.c"をヘッダとしてインクルード   http://www.picfun.com/p877frame.html ・出てくるエラーは、  ・illegal # directive "byte"  ・ function declared implicit int ・ undefined identifier "PIN_D0" 等の3種類のエラーです。 どこが悪いのでしょうか? 以下にプログラムと ヘッダーを記載します。 #include<pic.h> //////// link LCD library #include <lcd_lib3.c> // コンフィギュレーションワードの設定 __CONFIG(UNPROTECT & PWRTEN & HS & WRTEN & DEBUGEN & LVPDIS & BORDIS & WDTDIS); // プロトタイプ宣言 static void pic_init(); // メイン関数 void main(void){ int cnt,j; pic_init(); lcd_init();//initialize LCD } // =============== PICの初期化 ======================= static void pic_init() { //OSCCON = 0x71;// INTOSC 8MHz //ANSEL = 0x00;// AN未使用 //ANSELH = 0x00;// AN未使用 ADCON1 = 7; //すべてデジタルI/O PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00; PORTE = 0x00; TRISA = 0x00; TRISB = 0x00; TRISC = 0x00; //TRISD = 0x00; TRISE = 0x00; //OPTION = 0x88;// TMR0プリスケーラ:なし //INTCON = 0xA8;// GIE:1 ,T0IE:1 ,RBIE:1 } "lcd_lib3.c"の内容 /////////////////////////////////////////////// // LCD control Library // functions are below // lcd_init()-------- initialize // lcd_ready()------- busy check // lcd_cmd(cmd)------ send command // lcd_data(string)-- display string // lcd_clear() ------ clear display ////////////////////////////////////////////// ////// port define to port D #byte port = 8 //port D #define set_tris_x set_tris_d #define rs PIN_D0 #define rw PIN_D1 #define stb PIN_D2 /////////// lcd ready check function int lcd_ready(){ static int higha; int high,low; set_tris_x(0xF0); //upper is input output_low(rs); output_high(rw); //read mode output_high(stb); high=port & 0xF0; //input upper output_low(stb); output_high(stb); low=port & 0xF0; //input lower output_low(stb); set_tris_x(0); return(high | (low>>4)); //end check } ////////// lcd display data function void lcd_data(int asci){ port = (asci & 0xF0) | (port & 0x0F); //set upper data output_low(rw); //set write output_high(rs); //set rs high output_high(stb); //strobe output_low(stb); asci=asci<<4; port = asci | (port & 0x0F); //set lower data output_high(stb); //strobe output_low(stb); while(bit_test(lcd_ready(),7)); } ////////// lcd command out function void cmdout(int cmd){ port = (cmd & 0xF0) | (port & 0x0F); //set upper data output_low(rw); //set write output_low(rs); //set rs low output_high(stb); //strobe output_low(stb); cmd=cmd<<4; port = cmd | (port & 0x0F); //set lower data output_high(stb); //strobe output_low(stb); } void lcd_cmd(int cmd){ cmdout(cmd); while(bit_test(lcd_ready(),7)); //end check } ////////// lcd display clear function void lcd_clear(){ lcd_cmd(1); //initialize command } ///////// lcd initialize function void lcd_incmd(int cmd){ port = (cmd & 0xF0) | (port & 0x0F); //mode command output_low(rw); //set write output_low(rs); //set rs low output_high(stb); //strobe output_low(stb); delay_us(100); } void lcd_init(){ set_tris_x(0); //initialise delay_ms(15); lcd_incmd(0x30); //8bit mode set lcd_incmd(0x30); //8bit mode set lcd_incmd(0x30); //8bit mode set lcd_incmd(0x20); //4bit mode set lcd_cmd(0x2E); //DL=0 4bit mode lcd_cmd(0x08); //disolay off C=D=B=0 lcd_cmd(0x0D); //display on C=D=1 B=0 lcd_cmd(0x06); //entry I/D=1 S=0 }

  • PIC16f84AにおけるBポート(RB0-RB…

    PIC16f84AにおけるBポート(RB0-RB7)のHレベル時の電圧について いつも参考にさせて頂いています。 PICマイコンによる工作で困っているので、お力添えをお願いします。 現在、PIC16F84Aを使ってスイッチを押したらLEDが点灯するプログラムを作っています。 プログラム通りにLEDは点灯するようになりましたが、 プログラムにより出力を「H」レベルに設定したときの出力ポート電圧が2.2Vぐらいにしかなりません。 (ソース電流となるようにPIC出力端子 --> LED --> 抵抗 --> GNDとつないでます) データシートを眺める限りでは、 V_OH = Vdd-0.7 となっているので、私の予定では4.3V程度が出る予定です。 ソース電流は25mAまで流せるはずなので、仮に電圧が5.0Vでも、 抵抗が330Ωなので制限には引っかかりません。 この回路を応用し、HブリッジICを利用したDCモータの正逆転を行う予定なので、 Hレベルが2.47Vでは困ります。(IC側から「H」レベルと認識されない?) ハードウェアは以下のように設計・製作しています。 Vdd=5.0V(スイッチング電源から) Vss=0V(=GND) 外部クロック=セラミック振動子(10MHz) RA0~RA4までにスイッチをつけ、入力ポートと設定 RB0~RB7までにそれぞれLED+抵抗(330Ω)をつけ、出力ポートに設定 ご教授お願いします。 このURLの回路図と基本的に同じです。(違いは入力ポートの抵抗値など) http://homepage3.nifty.com/mitt/pic/pic6_01.html

  • PIC16F84Aのしきい値電圧

    PICの16F84AでLOWからHIGHに変わるときのしきい値電圧を教えてください。

  • PIC12F675のRB割込みミス(?)

    PIC12F675を20MHzでポート変化割込みを使用しています。 A.割込みルーチン内では BTFSC 05.3とラストリードし、bit出力(オシロでのチェック用)をするのみ (ポート変化割込に使用しているbitへの入力は約500Hz) B.メインルーチン内では MOVWF 05という形で無限ループでGPIOに出力し続けるのみ。 (出力周期は約600KHz) オシロでみると、入力が変化しても割込みが発生しないミスがかなりあります。 ここでB.の出力にディレイを入れて出力周期を約1KHzに下げると割込みミスは減少します。 Q1. マニュアルによれば、ポート変化割込みはラストリードから入力が変化とき 発生するとあります。 ラストリードはA.の割り込みルーチン内でしかしていません。 したがってB.で出力しても(出力にBCF,BSFは使用していません) 割り込みの発生には関係ないはずですが 現実は出力周期が割り込みの発生に大きく関係しています。 どういう理由でしょうか? Q2. ここまで述べてくると PIC12F675では、ポート出力をしているときはポート変化割込み ミスがある???ということになってしまいます。 これは正しいのでしょうか? 入力の変化を見落とさないために、ソフトウェアプログラムではなく割り込みを使用しているのですが・・・。

  • PIC16F1823の割り込み処理について

    PIC初心者です。よろしくお願いします。 ※HI-TECH Cコンパイラを使用しています。 最近まで、PIC16F676を使用していましたが、 今回、PIC16F1823に変更することにしました。 プルグラムをPIC16F1823用に変更し、実行したところ思ったように動いてくれません。 いろいろ調べたところ割り込み処理がうまいこと出来ていないような気がします。 割り込みルーチンに飛んだ後、なぜか戻ってこないような気がします。 下記のコードは、簡単に書き直しました。 どなたか分かる方、お願いしますm(_ _)m --------------------------------------------- #include <htc.h> __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_ON & CP_OFF); unsigned int i,Time; void main(void) { OSCCON = 0b01101010; //おそらく4MHz? //ポートA ANSELA = 0x00; //全てデジタル CM1CON0 = 0b00000111; //コンパレート無効化 CM1CON1 = 0b00000111; TRISA = 0b00111110; //ポートA入力出力設定 WPUA = 0b00110110; //ポートAプルアップビット指定 PORTA = 0b00000100; //各ピンデフォルト値 IOCAP = 0b00100000; //割り込みピン指定 //ポートC ANSELC = 0x00; //全てデジタル TRISC = 0b00000000; //ポートC入力出力設定 nWPUEN = 0; //プルアップ有効化 IOCIE = 1; IOCIF = 0; GIE = 1; i = 0; while(1){  if(i){   RC5 =1;   RC0 =0;  }else{   RC5 =0;   RC0 =1;  } } } void interrupt ISR(void){ //割込み if(IOCIF && !RA5){  if(i) i=0;else i=1; } IOCIF = 0; }

  • 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ビットのみ)とせよ。

  • PICの信号について

    PICでループやスリープを使わずピンの1つをHIGHにし続けたり、LOWにし続けたりする出力信号を出すことはできるのでしょうか?

  • PICからの出力のHiとLowの出力をHi=+10V、Low=-10V

    PICからの出力のHiとLowの出力をHi=+10V、Low=-10Vの信号に変換したいのですが どんな部品でなんという回路を組めば良いでしょうか? トランジスタ何個とかどんな電源がいるとか簡単でもいいので教えて頂きたいです 電流は2アンペアくらい取れれば良いです。