PIC16F886のコンフェグ・デジタルI/O化
- PIC16F887でのコンフェグ指定方法についてエラーが出る問題に対する質問です
- PIC16F886のデジタルI/O化において、RA6とRA7の動作がプログラム通りに機能しない問題があります
- 内部発振を使用する場合に必要なプログラム指定についての質問です
- ベストアンサー
PIC16F886のコンフェグ・デジタルI/O化
PICマイコンのPIC16F887でのアセンブラ言語プログラムでの質問です。 (1)コンフェグの指定方法 現状はPIC16F877Aでプログラムした内容で設定していますが、書込み時に エラーが出ます。 (2)デジタルI/O化 このPICはI/Oが35個使用できると思います。現状はLEDを点滅し確認するということで機能確認をしていますが、RA6は常時点灯、RA7は常時消灯とプログラム指定通りに機能してくれません。他のI/Oはプログラム通りに点滅消灯の動きが出来ます。 詳しいことは知識不足のため、わかりませんがRA6・RA7はオシレータが影響しているのかな?と思います。外部で設置は考えていません。内部クロックを使用したいと検討しています。 解除?デジタルI/O化等の手段があれば教えて下さい。 (3)内部発振を使用する場合は何らかのプログラム指定が必要でしょうか? 上記(1)~(3)ですが、自分なりにネットや参考書などで調べてみましたが、887はまだあまり普及されていない?のかなかなか解決策が出ません。回答できる方、(1)~(3)の一部でもかまいませんのでよろしくお願いします。
- curippa17
- お礼率100% (1/1)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
アセンブラはわかりませんが一般論として。 ハードウェアマニュアル及びアプリケーションノートは読んでますか? 組み込み系では最初にあたるところだと思いますが。 > (1)コンフェグの指定方法 「コンフェグ」って「コンフィグ(configuration)」のことでしょうか? いずれにせよ、「何がしたくて」「どう書いたら」「どんなエラーが出る」の情報が全くないので誰も答えられないのでは。 > (2)デジタルI/O化 > (3)内部発振を使用する場合は何らかのプログラム指定が必要でしょうか? ハードウェアマニュアルに書いてあるはずです。 I/O Portの出力だか入力だかわかりませんが、「期待通りに動作しない」のなら関連レジスタの設定値を疑いますが。
関連するQ&A
- PIC16F88 内部オシレータ使用による割り込み
PIC16F88を内部オシレータで発振させて使用しています。 問題は、TIMER0割り込みが計算通りに動かないことです。 外部にオシレータを付けると計算通りのタイミングで割り込みが発生するのですが、内部オシレータ使用の場合は、その間隔よりもかなり長くなってしまいます。(0.01秒間隔で割り込みをかけるつもりが、3秒間隔ぐらいになってしまいます。) 何が原因なのでしょうか? 完全な答えでなくても色々試してみますので、何か気になる部分が御座いましたら、教えて下さい。
- 締切済み
- その他(プログラミング・開発)
- PIC・eepromとPIN設定について
目をとめて頂き、ありがとうございます。 さっそくですが、PICのプログラムについてとPIN設定について解らないところがありましたので、質問させていただきます。 1)シリアル通信のプログラムです。 eeprom内蔵のPICを使っているのですが、eepromに書き込んだ後に(画面に)「無事に書きこみましたよ」的な表示をさせたいのですが、ちゃんと書き込まれたかどうかがわからなくて… アセンブリでやると、レジスタのフラグ(?)をみて判断しているっぽいのですが、生憎とアセンブリはさっぱり分かりません。 c言語でもわかる方法はないものでしょうか? 2)PIN設定です。 RA5(OSC1)-->外付けで振動子つけてます RA4(OSC2)-->RA5と同じです RA3(MCLR/VPP)-->リセットICつけてます RA2(I/O)-->input設定 RA1(I/O)-->input設定 RA0(I/O)-->output設定 という設定のPICで、RA0~2は普通にI/OとしてSET_TRISできるのですが、RA3~5をどうSETしたらいいのかが分かりません。 普通のI/Oとしては使わないけど、外付けで振動子とICがついているので普通にI/OでSETしていいのか… 以上2点ですが、わかる方がいらっしゃいましたらよろしくお願いします。
- ベストアンサー
- C・C++・C#
- PIC初心者ですが、16F88のLED点滅制御です。
PIC初心者ですが、16F88のLED点滅制御です。 マイナスコントロールの回路ですが車のウインカーでスモール点灯時は今まではウインカー消灯。ウインカーを出した時に点滅でした。これをスモール点灯時にウインカーが点滅ではなく常時点灯に。ウインカーを出した時に点滅に変わるようにしたいんですが、どんなプログラムにすればいいんでしょうか?
- ベストアンサー
- その他([技術者向] コンピューター)
- PIC12F629デジタル入力について
PIC12F629をC言語でプログラミングしています。 GP2ピンをデジタル入力としてスイッチを接続しGP4をデジタル出力 としてLEDを接続し、スイッチを押すたびにLEDが点灯、消灯を繰り返す ようにプログラミングしてみました。 ところがデジタル入力のピンをGP0,GP1に変更しピンにスイッチを 接続し入力しても同じように動作しません。回路に電源をいれた瞬間 LEDが点灯しスイッチを入力しても点灯したままです。 GP0,1をGP2と同様にデジタル入力として使いたいのですが、単にピンの 番号をプログラム中で変更するだけではダメなのでしょうか? ご教授おねがいします。
- ベストアンサー
- その他([技術者向] コンピューター)
- PIC 18F2320のI/Oポート
PIC 18F2320のI/OポートにおいてポートCの5ビット目の出力が ビットセットしてもLowのままでHighになりません。 ポートCはすべて出力設定になっているし、SPIも使用していません。 ちなみにポートCの5ビット目以外は、ビットセットでHighに変化します。 ハードの接続(回路)の問題はないと思います。 何か他に設定すべきところがあれば教えてください。
- ベストアンサー
- その他(プログラミング・開発)
- PICについての質問です。使用PIC(PIC16F88)
PICについての質問です。使用PIC(PIC16F88) LEDを0.5秒点灯、0.5秒消灯させるプログラムを書いています。 追加でLEDを駆動するFETが故障してショートモードになったときを考えて、通電監視プログラムを 組み込みましたが、わからないところがあります。 タイマー1を使用して、0.1秒ごとに割り込み、通電検知させて、3秒連続して通電状態の場合はハード的にOFFにするという回路を組み込みました。 0.1秒ごとに割り込みさせて、通電と判断したらカウンターをカウントダウンさせて、0回になったらフラグをたてています。 メインルーチンで フラグチェック処理→0.5秒点灯、0.5秒消灯処理→(はじめに戻る)というフローにより、通電監視フラグを1秒ごとにチェックして、フラグが立ててあれば、強制的にOFFにします。 そのカウンターの設定値ですが、30回にすると3秒後の消灯になりません。いろいろ試した結果23回であれば、最短3秒後以降消灯できるようになりました。 自分で理解したいと思うのですが、なぜこれでうまくいくのかわかりません。 解説書、webも調べましたがわかりません。 どなたか推測でもいいので、教えていただけませんでしょうか?
- 締切済み
- その他(趣味・娯楽・エンターテイメント)
- 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ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。
- ベストアンサー
- C・C++・C#
- PIC16F874Aについて
16F874Aを使用して回路をつくっているのですが、I/Oピンの出力(LEDを接続)はちゃんと動作してくれるのに、入力(スイッチを接続)が全く動作してくれません。動作確認のために、 void main(){ PORTB=0x01; TRISB=0x01; while(1){ if(PORTB.F0==0){ PORTB.F1=1; } } } という簡単なプログラムでも動作しません。 また、AN0~AN7をデジタルで使用したいため、A/D変換のプログラムとして、 setup_adc_ports(0b00000000); をプログラム中に入れてビルドすると、エラーが出てしまいます。 PIC素人のため初歩的な質問かとは思いますが、回答よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- PIC(PIC16F57-I/P)と押しボタンスイッチ8個を使用して、
PIC(PIC16F57-I/P)と押しボタンスイッチ8個を使用して、簡単なピアノのようなものを作ってみようと思っています。 ドレミファソラシドと各音をファイルで用意しておき、押しボタンを押せば、 それぞれの音が出るようなものを考えています。 PICでどのようなC言語プログラムをすれば可能でしょうか。 できれば、プログラムと構成図と一緒に教えていただきたいです。
- 締切済み
- C・C++・C#
- 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; }
- 締切済み
- その他(インターネット・Webサービス)
お礼
ご回答、有難う御座いました。 自分なりにマニュアルを読んで再度トライします。 ’「何がしたくて」「どう書いたら」「どんなエラーが出る」’ 上記コメント頂きましたが、質問する側としてとても大事な事だと思いました。もし次回質問をするような機会があれば具体的なエラー内容が相手に伝わる質問方法を心がけます。 有難う御座いました。