PIC 16F1827のCCP機能をキャプチャモードで使う覚え書きです。
多分、あまり役に立たないと思います。笑
CCPの記事を検索しているとPWMモードでモーター制御する記事は多いのですがキャプチャモードで使う記事が無いのです。泣
I2Cの立下りをCCP1に入れ、キャプチャモードでその時のTimer1の値を取得しようとしています。
CCP1制御レジスタCCP1CONの設定
CCP1CON = 0x00000100 //入力の立下りで割り込み発生
CCP1IE = 1;
CCP1IF = 0;
CCPR1H = 0x00;
CCPR1L = 0x00;
割り込みが発生するとCCP1IFが1になるので、それを見て割り込み処理を行う。
CCP1IFはプログラムで0に戻してやる必要がある。
レジスタの読み込み
unsigned int a;
a = CCPR1H*256+CCPR1L;
I2Cの立ち上がりをRA1で出力してCCP1に入力することでCCP1の割り込みを出して割り込みから次の割り込みまでの時間をTimer1で測ろうとしたのですが、mainプログラムの周期に影響するため断念。
参考資料程度に残しておきます。
以下、データシートから抜粋
必要なタイマーリソース Timer1
レジスタ
CCPXCON:CCPX制御レジスタ
R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 |
PxM1(1) | PxM0(1) | DCxB1 | DCxB0 | CCPxM3 | CCPxM2 | CCPxM1 | CCPxM0 |
bit 7 |
bit 0 |
記号の説明: | ||
R = 読み出し可 | W = 書き込み可 | U = 未実装ビット。「0」として読み出し |
u = 不変 | x = 不明 |
-n/n = POR および BOR 時の値 / その他すべてのリセット時の値 |
1 = セット | 0 = クリア |
ビット 7-6 |
PxM<1:0>: 拡張型 PWM 出力のコンフィギュレーション ビット(1) CCPxM<3:2> = 00、01、10 の場合: xx = PxA をキャプチャ/ コンペア入力に割り当て、PxB、PxC、PxD をポートピンに割り当てる CCPxM<3:2> = 11 の場合: 00 = シングル出力。PxA が変調され、PxB、PxC、PxD をポートピンに割り当てる 01 = 順方向のフルブリッジ出力。P1D が変調され、P1A がアクティブ、P1B と P1C が非アクティブ 10 = ハーフブリッジ出力。P1A とP1B が変調され ( デッドバンド制御あり)、P1C とP1D をポート ピンに割り当 てる 11 = 逆方向フルブリッジ出力。P1B が変調され、P1C がアクティブ、P1A と P1D が非アクティブ |
ビット 5-4 |
DCxB<1:0>: PWM デューティ サイクル LSB ( 最下位ビット) キャプチャ モード: 未使用 コンペア モード: 未使用 PWM モード: PWM デューティ サイクルの下位 2 ビット。上位 8 ビットは CCPRxL に割り当て。 |
ビット 3-0 |
CCPxM<3:0>: ECCPx モード選択ビット 0000 = キャプチャ/ コンペア/PWM はオフ (ECCPx モジュールをリセット) 0001 = 予約 0010 = コンペア モード。一致時に出力をトグルする 0011 = 予約 0100 = キャプチャ モード: すべての立ち下がりエッジ 0101 = キャプチャ モード: すべての立ち上がりエッジ 0110 = キャプチャ モード: 立ち上がりエッジ 4 回ごと 0111 = キャプチャ モード: 立ち上がりエッジ 16 回ごと 1000 = コンペア モード: ECCPx ピンを Low に初期化し、比較が一致 (CCPxIF をセット) すると出力をセットする 1001 = コンペア モード: ECCPx ピンを high に初期化し、比較が一致 (CCPxIF をセット) すると出力をクリアする 1010 = コンペア モード: ソフトウェア割り込みのみ生成し、ECCPx ピンは I/O ステートに戻る 1011 = コンペア モード: 特殊イベントをトリガする
CCP3/CCP4:のみ: 11xx = PWM モード ECCP1/ECCP2:のみ: 1100 = PWM モード: PxA と PxC はアクティブ High、PxB と PxD はアクティブ High 1101 = PWM モード: PxA と PxC はアクティブ High 、PxB と PxD はアクティブ Low 1110 = PWM モード: PxA と PxC はアクティブ Low、PxB と PxD はアクティブ High 1111 = PWM モード: PxA と PxC はアクティブ Low、PxB と PxD はアクティブ Low |
注1: ECCPモジュールにのみ適用する。 |
CCP クロック選択
PIC16F/LF1827では、CCPモジュールを制御するタイマ ソースの選択はモジュールごとに設定できます。つまり、各モジュールで個別選択できます。
PIC16F/LF1827の場合、16 ビットタイマ(Timer1) は 1 個しかないため、CCP モジュールのキャプチャおよびコンペア モードでは常にTimer1を使用します。
自動リロード機能付きの8ビットタイマは3つ(Timer2、Timer4、Timer6)あるため、CCPモジュールのPWMモードではこれらのタイマのいずれかを使用できます。PIC16F/LF1827は、1つの8ビットタイマ(Timer2)を持ちます。これは、PWMモードで使用します。
CCPTMRS: CCP タイマ制御レジスタ
R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 | R/W-0/0 |
C4TSEL1 | C4TSEL0 | C3TSEL1 | C3TSEL0 | C2TSEL1 | C2TSEL0 | C1TSEL1 | C1TSEL0 |
bit 7 |
bit 0 |
記号の説明: | ||
R = 読み出し可 | W = 書き込み可 | U = 未実装ビット。「0」として読み出し |
u = 不変 | x = 不明 |
-n/n = POR および BOR 時の値 / その他すべてのリセット時の値 |
1 = セット | 0 = クリア |
ビット 7-6 |
C4TSEL<1:0>: CCP4 タイマ選択 00 =CCP4 は PWM モードで Timer2 を使用 01 =CCP4 は PWM モードで Timer4 を使用 10 =CCP4 は PWM モードで Timer6 を使用 11 = 予約 |
ビット 5-4 |
C3TSEL<1:0>: CCP3 タイマ選択 00 =CCP3 は PWM モードで Timer2 を使用 01 =CCP3 は PWM モードで Timer4 を使用 10 =CCP3 は PWM モードで Timer6 を使用 11 = 予約 |
ビット 3-2 |
C2TSEL<1:0>: CCP2 タイマ選択 00 =CCP2 は PWM モードで Timer2 を使用 01 =CCP2 は PWM モードで Timer4 を使用 10 =CCP2 は PWM モードで Timer6 を使用 11 = 予約 |
ビット 1-0 |
C1TSEL<1:0>: CCP1 タイマ選択 00 =CCP1 は PWM モードで Timer2 を使用 01 =CCP1 は PWM モードで Timer4 を使用 10 =CCP1 は PWM モードで Timer6 を使用 11 = 予約 |
注1: PIC16F/LF1827のみ |
キャプチャ モード
キャプチャ モードでは、CCPx ピンにイベントが発 生すると TMR1レジスタの16 ビット値がCCPRxHとCCPRxLレジスタペアにキャプチャされます。イベントの定義は次のいずれかであり、CCPxCONレジスタのCCPxM<3:0>ビットで設定します。
• すべての立ち下がりエッジ
• すべての立ち上がりエッジ
• 立ち上がりエッジ 4 回ごと
• 立ち上がりエッジ1 6 回ごと
キャプチャが実行されると、PIRxレジスタの割り込み要求フラグビットCCPxIFがセットされます。この割り込みフラグはソフトウェアでクリアされる必要があります。CCPRxHとCCPRxLのレジスタペア値を読み出す前に再度キャプチャが実行されると、以前にキャプチャした値が新しいキャプチャ 値で上書きされます。
CCPX ピンのコンフィギュレーション
キャプチャモードでは、関連するTRIS制御ビットをセットしてCCPxピンを入力として設定してください。また、APFCONレジスタを使用してCCPxピンの機能を他のピンに移動することができます。詳細は、12.1項「代替ピン機能」 を参照してください。
TIMER1 のモード選択
CCPモジュールのキャプチャ機能を利用するには、Timer1の動作をタイマ モードまたは同期カウンタモードに設定する必要があります。非同期カウンタ モードの場合、キャプチャ機能は利用できません。
ソフトウェア割り込みモード
キャプチャ モードを変更した場合、不正にキャプチャ割り込みが生成されることがあります。このよ うな不正な割り込み動作を防ぐため、ユーザーが PIEx レジスタの CCPxIE 割り込みイネーブル ビッ トをクリア状態に保持する必要があります。また、動作モード変更後には、PIRx レジスタの CCPxIF 割り込みフラグ ビットをクリアしてください。
注: キャプチャ モードの場合、システム クロッ ク (FOSC) を使用してTimer1へクロック供給してはいけません。キャプチャ モードで CCPx ピンのトリガイベントを認識するには、Timer1は命令クロック (FOSC/4)または外部クロックソースを使用してください。
CCP プリスケーラ
プリスケーラの設定は 4 種類あり、CCPxCON レジ スタのCCPxM<3:0> ビットで設定します。CCPモジュールをオフにした場合、またはCCP モジュールがキャプチャ モード以外の場合は、プリスケー ラ カウンタはクリアされます。何らかのリセットが発生してもプリスケーラカウンタはクリアされます。
キャプチャプリスケーラを切り替えてもプリスケーラはクリアされないので、不正割り込みが発生することがあります。このような予期しない動作を防ぐため、プリスケーラを変更する前にCCPxCON レジスタをクリアしてモジュールをオフにしてくだ さい。
スリープ時の動作
通常動作時のキャプチャ モードは、Timer1モジュー ルに依存します。キャプチャモードでTimer1モジュールを駆動するには 2 つのクロック オプション (命令クロック (FOSC/4) または外部クロック ソース) があります。
FOSC/4クロックを使用した場合、Timer1はスリープ中にインクリメントしません。デバイスがウェイクアップするとき、Timer1はスリープ直前の状態からインクリメントを再開します。
外部クロックソースを使用した場合のキャプチャ モードの動作については23.1項「キャプチャ/コンペア/PWM」 で説明しています。