CLC機能を動作させて見ます

〔PICの動かせ方入門に戻る〕


16F18313には2個(CLC1/CLC2)の構成可能なロジックセルモジュールが有ります、
この機能によりソフトウエアではなくハード的にロジック(AND/OR等)が構成出来ます。
1つのモジュールあたり4つの入力が出来、16個の選択可能な入力源(PWM/OSC/TMR/外部PIN等)
が有ります。
ロジック機能はAND-OR/OR-XOR/4-InputAND/Dフロップ/Dラッチ/SR/JKなどです。

動作実験は下のロジック構成で行って見たいと思います。
実験するロジックの構成図  実際はPWM3ではなくPWM5を使います。
 RA5端子にスイッチを接続し、RA2端子にはLEDを
 配線します。
 スイッチを押せばPWM 5の信号が押している間出
 力されLEDが点灯するはずです。

実はスイッチはPIC内蔵プルアップにしたので通常点灯で押せば消えるです。
(ロジックモジュールで反転入力にしても良いのですが、ここではそのままです)

《CLC設計ツール》

CLCの設定レジスタは沢山有り操作も複雑なので、それの手助けをしてくれる機能(MCC)が
MPLAB X IDEのプラグインに有ります、なのでそれを使う事をお勧めして置きます。
MCCのインストール方法はこちらで全体的な操作はこちらを参照下さい。
また、MCCによるCLC設定操作の話はこちらを参照下さい。

《実験回路》

ピン構成図
PIC16F18313のピン構成図です
今回はCLC1を使用しCLC2は未使用です。

CLC1IN0とCLC1OUT(RA3はダメ)はPPS機能で
好きなピンに割り当て出来ます。


実験回路図  左が今回の実験を行た回路です。

 PICの1番ピンに電源+5V、14番ピンに電源GND(-)を接続しています。
 LEDは足の長い方(+)をPIC側(RA2)に接続し抵抗は470Ωにて配線して
 います。
 スイッチは2番ピン(RA5)に接続し、PIC内蔵プルアップ抵抗を利用して
 いますが、プルアップなので通常は電気が流れて、スイッチを押せば
 電気が切れる(LED消灯)と言う事になります。

《サンプルプログラム》

電源を入れればLEDが点灯して、スイッチを押せばLEDは消灯すると思います。
CLCの入力の1つにPWM5を入れています、
PWM5の周期はTIMER2で1KHzを発生させPWMのデューティ比は50%です。
但し、PWM5OUTのピンからはPWMの出力は行っていません。
尚、PICのシステムクロック(Fosc)は内蔵8MHzで行っています。

下記がプログラムソースです、
 MPLAB X(V3.40) MPLAB(R) XC8 C Compiler Version 1.38コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
#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) {
     }
}
---------------------------------------------------------------------

実行結果

ロジックアナライザに信号を表示させる為に、PWM5OUTをピンに出して、スイッチのプルアップを
外付けにしました。下記がロジアナの表示画面です。

ロジアナの表示画面

PWM3とスイッチがAND条件なのでスイッチの信号がLOWになると出力(CLC1OUT)は出ていませんね。

レジスタの設定

レジスタの設定説明についてはツールを使えば簡単に設定可能なのでここでは説明を省きます。

《分周器》

CLC機能で入力されたクロックを1/2分周させて見ます。
分周させるには、DフリップフロップかJKフリップフロップのロジックを使います。
詳しい説明などは、"フリップフロップ"AND"分周回路"又は"カウンタ回路"等で検索を行って下さい、
ゴロっとゴぉロゴロ記事が出て来ると思いますのでここでは説明を省きます。

Dフリップフロップの[1-Input D Flip-Flop with S and R]のロジックで試しました、動作しません。
こちらのドキュメント”構成可能なロジックセルのヒントとコツ ”に記載されている”分周器”を
真似て動作させて見ました、動作しません。
えぇ〜、なんでや〜、ならPICを12F1501に換えてみましたが、動作しません、訳わかめです。
じゃー、ってんでぇ、[J-K Flip-Flop with R]のJKフリップフロップロジックで試しました、動きます。

なのでこのロジックを使いシステムクロック(Fosc)を1/2分周させて見ました。
JKFlip-Flop分周
入力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...
JKFlip-Flop分周
FOSC(8MHz)/2分周=4MHzなので大体合っていそうですね、
テスター測定も4.015MHzと表示されました、
誤差はPIC内蔵のFOSC自体が誤差が有るのでこんな物でしょう。


下に実験したプログラムのメイン部分のみ載せときます、
上記のプログラムのmain( )関数と入換えコピッペーしましょう
---------------------------------------------------------------------
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) {
     }
}
---------------------------------------------------------------------

《その他》

しかしぃ、何故に、Dフリップフロップで分周動作しないのかがぁ、解せない!
FOSCでなく外部からクロックを入れたら動作するかしらぁ、未実験です。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.