実際はPWM3ではなくPWM5を使います。
左が今回の実験を行た回路です。
---------------------------------------------------------------------
#include <xc.h>
// コンフィギュレーション1の設定
#pragma config FEXTOSC = OFF // 外部クロックは無効(OFF)
#pragma config RSTOSC = HFINT32 // 初期発振器は内部発振器(HFFRQx2倍)を選択(HFINT32)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config CSWEN = OFF // NOSCとNDIVへの書き込みは許可しない(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
// コンフィギュレーション2の設定
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config LPBOREN = OFF // 低消費電力ブラウンアウトリセットは無効(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config PPS1WAY = OFF // ロック解除シーケンスを実行すれば何度でもPPSLOCKをセット/クリアできる
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
// コンフィギュレーション3の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
// コンフィギュレーション4の設定
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // EEPROMデータメモリーを保護しない(OFF)
/*******************************************************************************
* メインの処理 *
*******************************************************************************/
void main()
{
OSCFRQbits.HFFRQ = 0b011 ; // 4MHzをx2で8MHzの周波数を生成
WPUA = 0b00100000 ; // RA5は内部プルアップ抵抗を指定する
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00100000 ; // RA5は入力、その他は出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// CLCの設定
RA2PPS = 0b00100 ; // CLC1OUT出力をRA2から出す
CLCIN0PPS = 0x00 ;
CLCIN1PPS = 0x05 ; // CLCIN1 入力はRA5から入れる
CLCIN2PPS = 0x00 ;
CLCIN3PPS = 0x00 ;
CLC1GLS0 = 0x02 ; // ゲート1は入力1の信号(CLCIN1)を真(非反転)で使用する
CLC1GLS1 = 0x08 ; // ゲート2は入力2の信号(PWM5)を真(非反転)で使用する
CLC1GLS2 = 0x08 ; // ゲート3は入力2の信号(PWM5)を真(非反転)で使用する
CLC1GLS3 = 0x08 ; // ゲート4は入力2の信号(PWM5)を真(非反転)で使用する
CLC1SEL0 = 0x01 ; // 入力1はCLCIN1PPSのレジスタ(RA5)から入力
CLC1SEL1 = 0x10 ; // 入力2はPWM5から入力
CLC1SEL2 = 0x00 ;
CLC1SEL3 = 0x00 ;
CLC1POL = 0x00 ; // ゲート出力もCLC出力も反転出力はしない
CLC1CON = 0x82 ; // CLCは有効で、ロジックは[4-input AND]
// PWM5の設定
PWM5CON = 0b10010000 ; // PWM5機能を使用する(output is active-high)
PWM5DCH = 64 ; // デューティ値は50%で初期化
PWM5DCL = 0 ;
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 124 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
while(1) {
}
}
---------------------------------------------------------------------

なのでこのロジックを使いシステムクロック(Fosc)を1/2分周させて見ました。

入力4からFOSC(8MHz)をゲート1(CLK)に入力しています。
ゲート2(J)/ゲート3(R)/ゲート4(K)には何も入力していないのでゲートはLOWです。
但し、ゲート2(J)/ゲート4(K)の出力を反転させているのでJKにはHIGHが掛かります。
下図がロジアナで表示させた実行結果の内容です。
ロジックの出力"Q"(CLC1OUT)をRA5ピンから出力させた物です。
本当はCLC2当たりのORロジックにFOSCを入れ出力させた波形とぉ
下図を一緒に表示させれば解りやすいと思いますがぁ....m(_ _)m...

FOSC(8MHz)/2分周=4MHzなので大体合っていそうですね、
テスター測定も4.015MHzと表示されました、
誤差はPIC内蔵のFOSC自体が誤差が有るのでこんな物でしょう。
---------------------------------------------------------------------
void main()
{
OSCFRQbits.HFFRQ = 0b011 ; // 4MHzをx2で8MHzの周波数を生成
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00000000 ; // ピンは全て出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// CLC1の設定(JKフリップフロップのR付き)
RA5PPS = 0b00100 ; // CLC1OUT出力をRA5から出す
CLCIN0PPS = 0x00 ;
CLCIN1PPS = 0x00 ;
CLCIN2PPS = 0x00 ;
CLCIN3PPS = 0x04 ;
CLC1GLS0 = 0x80 ; // ゲート1(CLK)は入力4の信号(Fosc)を非反転(真)で使用する
CLC1GLS1 = 0x00 ; // ゲート2(J)はHIGHを入力
CLC1GLS2 = 0x00 ; // ゲート3(Reset)はLOWを入力
CLC1GLS3 = 0x00 ; // ゲート4(K)はHIGHを入力
CLC1SEL0 = 0x00 ;
CLC1SEL1 = 0x00 ;
CLC1SEL2 = 0x00 ;
CLC1SEL3 = 0x1F ; // 入力4はFosc(8MHz)を入力
CLC1POL = 0x0A ; // CLC出力は反転なし、ゲート2/4のみ反転する
CLC1CON = 0x86 ; // CLCは有効で、ロジックは[J-K Flip-Flop with R]
while(1) {
}
}
---------------------------------------------------------------------
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.