いま、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);
No.1ベストアンサー
- 回答日時:
PICは実際に使った事が無いので感で回答します。
まず、オシロスコープがあれば、4pin をモニタすると
原因をつかみやすいのかもしれません。
この様な場合に考えられる原因は
1.4pin が"H"レベルになっていない。
2.4pin は"H"レベルになっているが、時間が短すぎてLEDをドライブできない。
もしくは、ドライブ時間が短すぎて人間の目では確認できない。
3.4pin のドライブ能力が不足している。
4.5pin がスイッチの動作を検知できていない。
と、いった感じでしょうか?
この辺の切り分けが出来れば解決しやすいと思います。
このプログラムは、スイッチに寄る立ち上がりを検知したら
4pinを "H" にホールドしたままプログラムを終了する事を
意図している…って、事で良いのでしょうか?
この回答への補足
あれから、よく配線を調べてみたらスイッチの接続箇所が間違えていました。
接続箇所を変えて動かしたところ、ちゃんと動きました。
お騒がせいたしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
【gcc・cygwin】multiple defin...
-
Notepad++の関数リスト表示の変...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
ArduinoでMouse関数を使用して...
-
ドラッグしたときにマウスカー...
-
多重定義が起きている?--lnk20...
-
合格か否かを表示するプログラ...
-
typedef unsigned int UINT;が...
-
構造体を宣言と共に初期化する方法
-
C++別のオブジェクトからメンバ...
-
VC++でGetKeyboardStateがうま...
-
C# Controls.Addで動的に配置し...
-
C#でラジオボタンを設定に記録...
-
void*型の配列について
-
gcc: incompatible pointer type
-
マルチメディアタイマーの使用方法
-
DLLの関数呼び出しで引数がある...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報