- 締切済み
PIC12F683を用いたCapture実験
いま、PIC12F683を用いてCCPモジュールのCapture機能の実験をしています。一応、ビルドはできたので書き込んで動かしてみましたが、思ったとおり(スイッチを押したときにLEDを点灯させる)に動作しませんでした 動作はとしては、押しボタンスイッチを押したときにキャプチャーして LEDを点灯させるという簡単なものです。 下に使用しているプログラムを掲載しますので、どうしたらいいか教えてください。 // CaptureTest.c #include <pic.h> #include "delay.h" #include "CCP.h" __CONFIG( FCMDIS & IESODIS & BORDIS & WDTDIS & UNPROTECT & UNPROTECT & MCLRDIS & PWRTEN & INTIO); __IDLOC(0x00); unsigned char temp; ioport(); main(void) { //ポートの初期化、入出力設定など ioport(); //Captureモード、立ち上がりエッジに設定 setCcpMode(CCP_CAPUTURE_PGE); //フラグ(CCP1IF)を「0」にセット ResetCcpFlag(); //CCP割り込み許可 setCcpEnable(ENABLED); //TIMER1のプリスケーラを「1/8」に設定 T1CKPS1=1; T1CKPS0=1; //外部回路を動作させない T1OSCEN=0; //TIMER1を同期モードにセット T1SYNC=0; //TIMER1のクロックは内部クロックを使用 TMR1CS=0; //全割り込み、周辺割り込み許可 GIE=1; PEIE=1; //TIMER1をリセット(0セット) ResetTMR1(); //TIMER1スタート T1_START(); //CCP割り込みフラグが立つまでチェック while(ChkCcpFlag()==0); //CCP割り込みフラグクリア ResetCcpFlag(); //GP3をハイレベルに設定してLEDを点灯 temp=1; GPIO3=temp; } ioport() { ANSEL=0x00; TRISIO=0x04; } //CCP.c #include <pic.h> void setCcpMode(unsigned char mode) { CCP1CON= mode; } void setPwmPeriod(unsigned char T) { PR2=(T-1); } void setPwmDuty(unsigned int duty) { DC1B0 = 0x01&duty; DC1B1 = 0x02&duty; CCPR1L = 0xFC &duty; } void setCcpEnable(unsigned char flag) { CCP1IE=flag; } void ResetCcpFlag(void) { CCP1IF=0; } unsigned char ChkCcpFlag(void) { unsigned char ret=0; if(CCP1IF==1) return ret=1; return ret; } void ResetTMR1(void) { TMR1H=0x00; TMR1L=0x00; } void T1_START(void) { TMR1ON=1; } void T1_STOP(void) { TMR1ON=0; } //CCP.h #define ENABLED 1 #define DISABLED 0 #define CCP_OFF 0x00 #define CCP_CAPUTURE_NGE 0x04 #define CCP_CAPUTURE_PGE 0x05 #define CCP_CAPUTURE_4th_PGE 0x06 #define CCP_CAPUTURE_16th_PGE 0x07 #define CCP_COMPARE_SET_ON_MATCH 0x08 #define CCP_COMPARE_CLR_ON_MATCH 0x09 #define CCP_COMPARE_INT 0x0A #define CCP_COMPARE_RESET_TIMER 0x0B #define CCP_PWM 0x0C extern void setCcpMode(unsigned char); extern void setPwmPeriod(unsigned char); extern void setPwmDuty(unsigned int); extern void setCcpEnable(unsigned char); extern void ResetCcpFlag(void); extern unsigned char ChkCcpFlag(void); extern void ResetTMR1(void); extern void T1_START(void); extern void T1_STOP(void);
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- monova
- ベストアンサー率68% (68/100)
PICは実際に使った事が無いので感で回答します。 まず、オシロスコープがあれば、4pin をモニタすると 原因をつかみやすいのかもしれません。 この様な場合に考えられる原因は 1.4pin が"H"レベルになっていない。 2.4pin は"H"レベルになっているが、時間が短すぎてLEDをドライブできない。 もしくは、ドライブ時間が短すぎて人間の目では確認できない。 3.4pin のドライブ能力が不足している。 4.5pin がスイッチの動作を検知できていない。 と、いった感じでしょうか? この辺の切り分けが出来れば解決しやすいと思います。 このプログラムは、スイッチに寄る立ち上がりを検知したら 4pinを "H" にホールドしたままプログラムを終了する事を 意図している…って、事で良いのでしょうか?
お礼
ありがとうございます。 いろいろ条件変えて調べてみます。 また、よろしくお願いいたします。
補足
あれから、よく配線を調べてみたらスイッチの接続箇所が間違えていました。 接続箇所を変えて動かしたところ、ちゃんと動きました。 お騒がせいたしました。