PIC12F615でGP5が使えない!?

このQ&Aのポイント
  • PIC12F615でGP5が使えなくなる問題が発生しました。
  • GP5を利用するために割り込みを使用すると、GP5が入力も出力もできなくなります。
  • この問題の解決策をご存知の方は教えてください。
回答を見る
  • ベストアンサー

PIC12F615でGP5が使えません(T_T)

お世話になりますm(_ _)m PICマイコン初心者です(^^;) MPLAB IDE v8.80で、C言語でプログラムして、 PICkit3を使ってPIC12F615に書き込んでいます。 GP2にスイッチ、GP5にLEDを接続して、スイッチを押すとLEDが点灯するプログラムです。 これだけなら、普通にGP5は利用できます。 タイトルの「GP5が使えない」というのは、 このプログラムに、 割り込みを使用するために INTE=1; を書き込むと何故か、GP5が使えなくなります。 入力も出力も出来ません。 どなたか分かる方、よろしくお願い致しますm(_ _)m ↓プログラム↓ ---------------------------------------------------------------- #include <htc.h> __CONFIG(OSC_4MHZ & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO & BORDIS); void main(void) { //PIC12F615仕様  CMCON0 = 0x07 ; //コンパレート無効化  ANSEL = 0x00 ; //全てデジタル  TRISIO = 0b00001100 ; //入力出力設定  WPU = 0b00000100; //プルアップビット指定  GPPU = 0; //プルアップ有効化  GPIO = 0 ; //各ピンデフォルト値  INTEDG = 0; //INT割り込み立ち下がりエッジ  INTE = 1;  GIE = 1;  while(1)   {    if(!GP2) GP5=1; else GP5=0;   } } ----------------------------------------------------------------

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

  • ベストアンサー
  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.2

こんにちは。 「GP2の割り込みは利用できている」とは、どうやって確認されているのでしょうか。 ご提示のソースだけだと、ハンドラが無いから、何かおかしい事になっているんだろうなー、という想像くらいしかできません。 逆に、割り込みが動いているのなら、ハンドラ内でGP5にアクセスしてみては?

tanatanakzh
質問者

お礼

本当に言葉足らずで申し訳ありません。 ご親切にありがとうございます。 まず、本文のコードに「INTE = 1;」を書き込んだ時点で、GP5が使えなかったので、余計なコードは削除しました(^^;) ↓先程これを追加で書き込んで、GP5にLEDを接続し動作するか確認してみました。 ----------------------------------------- void interrupt ISR(void){ //割込み  if(INTF){   INTF = 0;   GP5=1;   __delay_ms(150);   __delay_ms(150);  } } ----------------------------------------- 結果はGP5に接続したLEDが点灯しました。 とりあえず、割り込みでGP5が使えるなら、今やっていることに利用できそうです。 本当なら、他のピンと同じように使えるともっと便利なのですが・・・。 でも、ひとつ道が開けたような気がします。 本当にご親切にありがとうございました。 誰にも回答して頂けないかと諦めていたのですが、嬉しかったです。

その他の回答 (1)

  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 GP2は外部割り込みの端子なので、割り込みハンドラに飛んで行ってしまっているのではないでしょうか。

tanatanakzh
質問者

補足

ご回答ありがとうございます。 PICもC言語もほぼ初心者同然な物で、どのように確認したらいいのか分からないのですが、教えて頂けないでしょうか? 一応、GP2の割り込みは利用できてます。

関連するQ&A

  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • PIC12F683 のULPW機能につきまして

    PIC12F683の機能のUltra Low-Power Wake-up の機能使おうとこちらhttp://www.picfun.com/pic26.htmlを参考にさせていただいて、GP0に抵抗と、コンデンサをR=200Ω、C=0.1μFで動かしてみました。 取りあえずは動作した(オシロできちんとのこぎりの波形を確認でました)のですが、しばらくすると、GP0がHiの状態のままになってしまいます。 このような現象を経験された方はいないでしょうか? 情報があれば助かります。 この動作を行うためのプログラムは以下のようにしてみました。 (MikroCを使っています) *****************************************************/ #define _ON 1 #define _OFF 0 #define _INPUT 1 #define _OUTPUT 0 #define SIG GPIO.F1 #define PWR GPIO.F5 void interrupt() { // 全体割り込み停止しているので、GPIO.1pin に変化があっても、ここの関数は呼び出されない if (INTCON.GPIF) { INTCON.GPIF = 0; // Port Change Interrupt Flag clear // GPIO.F1 = 1; // delay_ms(700); // 700ms LED ON // GPIO.F1 = 0; } } void opl_sleep() { INTCON.GIE = 0; //全体割り込みは停止 IOC = 0b00000001; // Interrupt pin GP0 only //1pinだけ検知する。 INTCON.GPIF = 0; // Port Change Interrupt Flag clear INTCON.GPIE = 1; //Enables the GPIO port change interrupt //ポート割り込み有効にすればsleepから復帰 TRISIO.F0 = _INPUT; // Input PCON.ULPWUE = _ON; SIG = _OFF; // Low sleep_start: asm{ nop nop nop nop sleep nop nop nop nop } INTCON.GPIE = 0; // disable GPIO port change interrupt INTCON.GPIF = 0; // Port Change Interrupt Flag clear //場合によっては、ここにチャタリング処理(wait)を入れると良い // INTCON.GIE = 1; } void _FloatValToStr( float val, char* str ) { unsigned char ch = 0x00; int val2; val2 = val * 1000; // val2 = val; ch = (val2 / 1000) % 10; // extract 1.0 volts digit str[0] = 48+ch; // write ASCII digit at cursor point str[1] = '.'; ch = (val2 / 100) % 10; // extract 0.1 volts digit str[2] = 48+ch; // write ASCII digit at cursor point ch = (val2 / 10) % 10; // extract 0.01 volts digit str[3] = 48+ch; // write ASCII digit at cursor point ch = val2 % 10; // extract 0.001 volts digit str[4] = 48+ch; // write ASCII digit at cursor point str[5] = 0x00; } void _CheckADC() { short i; double adc; double val = 0; char str[10]; //センサー信号取り込み ( Vref=3.0V : 実測値 ) adc = Adc_Read(2); val = (double)( adc * 300 ) / 1023; val = val / 100; // _FloatValToStr( val, str ); if ( val > 2.5 ) { // センサーに圧が掛かった! PWR = _ON; Delay_ms( 2000 ); PWR = _OFF; } } void main() { unsigned int co; ANSEL = 0b00100; // Configure AN pins as digital // CMCON = 7; // Turn off the comparators OSCCON = 0b01110000; // クロックを8Mhzに設定する。 CMCON0 = 0b00000111; // コンパレータ使用しない PCON = 0b00100000; // Ultra Low-Power Wake-up enabled TRISIO = 0b00000101; //GP0 pin input GPIO = 0; OPTION_REG.NOT_GPPU = 0; //GPIO pull-ups are enabled //内部弱プルアップに設定する WPU = 0b00000001; //PULL-UP REGISTER setting ,only GP0 pull-up SIG = _OFF; while( 1 ) { TRISIO.F0 = _OUTPUT; // Output GPIO.F0 = _ON; // Hi delay_ms(10); /*** for(co=0;co<10;co++){ //500ms だけLEDをピカピカッとやる GPIO.F1 = ~GPIO.F1; delay_ms(50); } **/ opl_sleep(); //SLEEPへ SIG = _ON; _CheckADC(); delay_ms(40); } }

  • PIC16F819

    PIC16F819のADコンバータを使用しています。 RA0からアナログ信号を入力して、PORTBのそれぞれのピンから1bitずつ(計8bit)のデジタル信号を出力させるためのプログラムを書いてみましたが、まったく動作しません。レジスタの設定なども変えてみましたが動作しませんでした。特にPORTBを全てHighにした場合、なぜかRB6とRB7からの出力を確認することができませんでした。 動作しない原因がまったく分からないので困っています。原因が分かる方がおられましたらご教授お願いします。 #include <pic.h> __CONFIG(DEBUGEN&WDTDIS&LVPDIS&HS&PWRTEN); void init_a2d(void){  ADCON0=0x40;  ADCON1=0x40;  ADON=1; } unsigned char read_a2d(unsigned char channel){  channel&=0x07;  ADCON0&=0xC5;  ADCON0|=(channel<<3);  GODONE=1;  while(GODONE)continue;  return(ADRESH); } void main(void){  unsigned char x1;  init_a2d(); //initialise the A2D module  GIE=0; // we don't want interrupts  TRISB=0x00;     // PORTB will be used in output mode  PORTB=0x00;  x1=read_a2d(1); // sample the analog value on RA0  PORTB=x1; }

  • PIC12F629デジタル入力について

    PIC12F629をC言語でプログラミングしています。 GP2ピンをデジタル入力としてスイッチを接続しGP4をデジタル出力 としてLEDを接続し、スイッチを押すたびにLEDが点灯、消灯を繰り返す ようにプログラミングしてみました。 ところがデジタル入力のピンをGP0,GP1に変更しピンにスイッチを 接続し入力しても同じように動作しません。回路に電源をいれた瞬間 LEDが点灯しスイッチを入力しても点灯したままです。 GP0,1をGP2と同様にデジタル入力として使いたいのですが、単にピンの 番号をプログラム中で変更するだけではダメなのでしょうか? ご教授おねがいします。

  • PIC12F675 の入力読み込み が正しく出来…

    PIC12F675 の入力読み込み が正しく出来ない こう度々だと恥ずかしく思いますが解決したいと思いお願いすることにしました。12F675 を MOVLW B'00101010' ;GP0,2,4ピンを出力にする     MOVWF TRISIO ;入力は10Kの抵抗でプルアップしてます GP3がLOになっているときGP2を100mS間LOレベルにしています GP2はJK-FFのクロックになっていてJKは5Vに接続してあるためGP2によって反転しますこのJK-FFのQ出力がフォトカプラを介してGP3に接続していてJK-FFのQ出力をGP2で操作します(信号線の長さが10mあります) ところがQ出力がHIのとき ?PICはGP3がLOであると判断して ?GP2をLO/HI にスイッチさせていてしかもプログラムが LO/HI操作を一度通過した後何度でもLO/HI を繰り返しています  ?のように判断していることが誤動作の発端と思いますが 原因がわかりません 今回は ANSEL = B'00000000' (デジタルI/Oモード) COMCN = B'00000111' (コンパレータ機能をOFF) BCF ADCON0,ADON (コンバータ電源 OFF)    CLRF INTCON (割り込み発生はさせない)に注意したつもりですがまだ足りていないようです 何方かお願いします

  • PIC16F877AでRA0をデジタルI/Oに

    PICプログラミング初心者です。 テスト回路を作っていたのですが、下記の回路でRB0のスイッチ入力部をRA0に変更したいのですが いろいろ試してどうしてもRA0ではうまく出来ませんでした。 わかるかた教えて下さい、宜しくお願いします。 //HI-TECH //PIC16F877 LED Momentary SW ON_OFF #include <pic.h> #include <htc.h> #define _XTAL_FREQ 20000000 //セラミック発振子:20MHz ディレイ関数用 __CONFIG( PWRTEN // パワーアップタイマ有 enable power up timer & BORDIS // ブラウンアウトリセット有enable brown out reset & UNPROTECT // コードプロテクト無 use UNPROTECT & WDTDIS // ウォッチドックタイマ無 & LVPDIS // 低電圧プログラミング無 low voltage programming disabled & HS // 外部ハイスピード発振子 EXTRC Oscillator, RC on RA7/OSC1/CLKIN ); short int Led = 0; //LED Mode : LED On_Mode = 1, LED Off_Mode = 0 /*///////////////////////// 1mse ディレー関数 /////////////////////////*/ void delay_ms(unsigned long int msec) { while(msec) { msec--; __delay_ms(1); //1msec delay } } void interrupt ISR(void) { INTE = 0; // ext INT Disable PEIE = 0; //Peripheral INT Disable GIE = 0; // Gloval INT Disable delay_ms(50); if(RB0 == 0)//←ここをRA0に変更したい { if(Led == 0) //if LED Not Lighed { Led = 1; //LED Mode : LED ON Mode RD0 = 0; // LED Turn ON } else //if LED Lighted { Led = 0; //LED Mode : LED OFF Mode RD0 = 1; //RD0 port LED Turn off } } INTF = 0; // LED Flag Clear INTE = 1; // ext INT Enable PEIE = 0; // Peripheral INT Disable GIE = 1; //Gloval INT Enable } int main() { ADCON0 = 0x00; ADCON1 = 0x00; //アナログセレクタ アナログ不使用 TRISA=0b11111111;//入出力設定 A,Bポートすべて入力に TRISB=0b11111111; TRISC=0b10111111;//RC6 = TxDなので出力に。RC7はRxDなので入力にする必要あり。 TRISD=0b00000000; INTEDG = 0; // Down Edge Trigger Led = 0; //LED Mode : OFF Mode RD0 = 1; //RD0 port LED Turn off INTF = 0; //INT Flag Clear INTE = 1; //ext-INT Enable PEIE = 0; // Peripheral INT Disable GIE = 1; // Gloval INT Enable while(1) { } return 0; }

  • PIC12F675 GPIO入出力について

     現在、PIC12F675にてA/D変換、EEP- W/R,TMR0を使ったプログラムを作成しているのですが、GPIOの入出力がおかしくTMR0、GP0~2が正常に動作しません。   ●各PINの使用状況・・・ ・GP0/出力(H/L) ・GP1/出力(H/L) ・GP2/TMR0 ・GP3/入力(S/W) ・GP4/入力(A/D変換) ・GP5/出力(H/L) ●開発環境   ・MPLAB IDE V8.40   ・デイバイス PIC KIT1 MPLAB IDEのファイルレジスタとウォッチのウインドウでデバッグしていて気づいたのですが、SFRアドレス00H~05Hまでの変化がそのままGPポートの変化へとつながっており、GP0がRestricted Memoryicted Memoryが表示され、SIMでRUNさせてみるとプログラムでは「BSF」でGP0を出力してもGPIOの0ビット目は変化しません。 GP2も変化がなくTMR0も動作していない様です。  もちろんBANK1でTRISIOの設定(B'00011000')は行っています。 自己解決を試みましたが万策尽きて投稿させていただきました。 恐れ入りますが何方かご教授いただけましですでしょうか。  

  • PICのシリアル通信について

    現在PICで電子工作を勉強中です。 PIC16f628Aを使ってパソコンとのシリアル通信をしようと思っています。 しかし、PICから"Hit some key for test"という文字列をおくったところ、 文字化けして"ソ3!・ソ)5"といった感じで出力されてしまいました。 文字化けが起きる原因としては何が考えられるのでしょうか? なお、パソコン側の端末にはTera Termを使用しています。 どなたかご教授お願いします。 以下にソースコードを示します。 #include <pic.h> __CONFIG(MCLRDIS & PWRTEN & BORDIS & UNPROTECT & WDTDIS & LVPDIS & HS); __IDLOC(628A); unsigned char getchr(void) { while(RCIF == 0); return (RCREG); } void putchr(unsigned char c) { while(TXIF == 0); TXREG = c; } void puts(const unsigned char *s) { while(*s) putchr(*s++); } void main(void) { PORTB = 0; TRISB = 0b00000010; SPBRG = 129; TXSTA = 0b00100100; RCSTA = 0b10010000; puts("Hit some key for test\n"); puts("\n"); while(1) putchr(getchr()); }

  • PIC12F683 TMR2の割込がうまくいきませ

    タイトルのPICを使ってTMR2の割込動作を確認しているのですが、割込が全く掛かりません。 TMR2は単独で割込を掛けないで動作することは確認できましたがエラーもあるわけでもなく あれこれやっても解決せず迷走中です。また、割込ルーチンはこれまで動作が確認できたプログラムを埋め込んで使っているので問題はないと思っています。 何方かお助け頂けませんでしょうか。宜しくお願い致します。 ;******************************************* ; PIC初期設定 ;******************************************* START_INI BCF STATUS,RP0    ;BANK【0】 MOVLW 07h MOVWF CMCON0 ;GP0-2はデジタルIO BSF STATUS,RP0    ;BANK【1】 MOVLW B'0000000' MOVWF ANSEL ;A/D変換クロックF/2 デジタルI/O BCF OPTION_REG,7 ;GPIO端子をプルアップ MOVLW B'001000' ;RESET端子有効 MOVWF TRISIO ;GP0,1,2,4,5:OUT GPO3:IN MOVLW B'1000000' ;40h MOVWF OSCCON ;クロック=1MHz ;******************************************* ; TMR2の設定 ;******************************************* BCF STATUS,RP0    ;BANK【0】 MOVLW B'000101' ;ポス=1:1 TMR2=ON プリ=1:4 MOVWF T2CON ; BCF PIR1,TMR2IF    ;Timer2 割込み検出フラグをクリア BSF STATUS,RP0    ;BANK【1】 BSF PIE1,TMR2IE    ;Timer2 有効 MOVLW H'FA' ;250 MOVWF PR2    ;TRM2カウントSET ;******************************************* BCF STATUS,RP0     ;BANK【0】 CLRF TMR2 BSF INTCON,GIE     ;割り込み全体を有効

  • PIC Timer0割り込み されない

    12F609でTimer0割り込みが実行されません。 実行されないというか、動作的に割り込みハンドラが呼ばれていない感じです。 以下がプログラムです。 void main(void) //メインプログラム { T0IE = 0; GPIO = 0; T0CS = 0; PSA = 0; PS0 = 1; PS1 = 1; PS2 = 1; TMR0 = 0; TRISIO = 0x00; a = 0; GP4 = 1; T0IE = 1; GIE = 1; while(1) } void interrupt blink(void) //---割り込みハンドラ--- { if(T0IF==1) { T0IF = 0; if(a%15==0) { GP4 ^= 1; a=0; } a++; } } 以上です。 割り込み15回ごとにGP4の出力を反転させるプログラムです。 が、反転されずGP4は1のままになってしまいます。 (初期時にGP4=1としているので) 二週間粘りましたが、まったく解決できず困っています。 何がいけないのでしょうか。 ご教授お願いします。

専門家に質問してみよう