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

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


16F1705の機能でCLC(Configurable Logic Cell)が有るので動作させて見たいと思います。
この機能はソフトウエアとは別にPICのハードでロジック(AND/OR等)が構成出来ます。
ロジックモジュールは3個有り、1つのモジュールあたり4つの入力が出来、32個の選択可能な
入力源(PWM/OSC/TMR/外部PIN等)が有ります。

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

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

《CLC設計ツール》

下記のツール(CLCDesignerTool.exe)は、現在MPLAB X IDEのMCC機能に統合されたので
ツールは削除されています、詳しくはこちらを参照下さい。 *1)

CLCで使用するレジスタは14種類程有り、設定するにはちょっとぉ面倒で大変です。
なので、これを手助けしてくれるツールがMicrochip社より手に入るのでこれを使って見ます。

インストール

@まずは、こちらからダウンロードします。
 そのHP最後の方に有る"Download the CLC Configuration Tool here."文字をクリックすればOKです。
 また、ツールのマニュアルはこちらが日本語なので良いでしょう。

Aダウンロードしたファイルを解凍させます、
 作成されたディレクトリごと適当な場所(c:\PrograamFilesの下とか)に移動させます。

B"CLCDesignerTool.exe"を起動させればOKです。

操作画面

上のロジック構成(4-input AND)をツールを使って設定して見た画面
ツールの詳しい操作方法はマニュアルを読みましょう!
赤枠の場所で信号の反転操作が出来ます。
ゲート1にCLC1IN0(RA5)を設定、ゲート2にPWM 3を設定しています。
ゲート3/4にも入力しないと動作しなかったのでPWM 3を入れています。
操作画面

 下がツールにて設定した内容で保存したファイル内容です。
 ---------------------------------------------------------------------
// File: CLC_AND_SET.inc
// Generated by CLC Designer, Version: 3.0.0.4
// Date: 2014/12/01 9:18
// Device:PIC16(L)F1704/5

// PPS Initialization

	CLCIN0PPS = 0x05;
	CLCIN1PPS = 0x00;
	CLCIN2PPS = 0x00;
	CLCIN3PPS = 0x00;

	CLC1GLS0  = 0x02;
	CLC1GLS1  = 0x08;
	CLC1GLS2  = 0x08;
	CLC1GLS3  = 0x08;
	CLC1SEL0  = 0x00;
	CLC1SEL1  = 0x0E;
	CLC1SEL2  = 0x00;
	CLC1SEL3  = 0x00;
	CLC1POL   = 0x00;
	CLC1CON   = 0x82;
 ---------------------------------------------------------------------
 16F1705ではCLC1出力を何れかのピンに割り当てないとダメですが、このファイルにはその設定が有りません。
 RA2PPS = 0b00100 ;    // CLC1OUT出力をRA2から出す。
 とこの行を追加する必要が有ります。

《実験回路》

ピン構成図
PIC16F1705のピン構成図です

CLCIN0とCLC1OUT(RA3はダメ)は好きなピンに割り当てできます。

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

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

《サンプルプログラム》

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

下記がプログラムソースです、
 MPLAB X(V2.15) MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
---------------------------------------------------------------------
#include <xc.h>

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下(BORV設定以下)常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO     = OFF      // 内部から外部クロックへの切替えでの起動はなし(OFF)
#pragma config FCMEN    = OFF      // 外部クロック監視しない(OFF)
// コンフィギュレーション2の設定
#pragma config WRT      = OFF      // Flashメモリーを保護しない(OFF)
#pragma config PPS1WAY  = OFF      // ロック解除シーケンスを実行すれば何度でもPPSLOCKをセット/クリアできる
#pragma config ZCDDIS   = ON       // ゼロクロス検出回路は無効とする(ON)
#pragma config PLLEN    = OFF      // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN   = ON       // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV     = HI       // 電源電圧降下常時監視電圧(2.7V)設定(HI)
#pragma config LPBOR    = OFF      // 低消費電力ブラウンアウトリセット(LPBOR_OFF)
#pragma config LVP      = OFF      // 低電圧プログラミング機能使用しない(OFF)

// メインの処理
void main()
{
     OSCCON     = 0b01110010 ;  // 内部クロックは8MHzとする
     OPTION_REG = 0b00000000 ;  // デジタルI/Oに内部プルアップ抵抗を使用する
     ANSELA     = 0b00000000 ;  // AN0-AN3は使用しない全てデジタルI/Oとする
     ANSELC     = 0b00000000 ;  // AN4-AN7は使用しない全てデジタルI/Oとする
     TRISA      = 0b00100000 ;  // RA5のみ入力、その他は全て出力に割当てる(RA3は入力専用)
     TRISC      = 0b00000000 ;  // ピン(RC)は全て出力に割当てる
     WPUA       = 0b00100000 ;  // RA5は内部プルアップ抵抗を指定する
     PORTA      = 0b00000000 ;  // RA出力ピンの初期化(全てLOWにする)
     PORTC      = 0b00000000 ;  // RC出力ピンの初期化(全てLOWにする)

     // CLCの設定
     RA2PPS    = 0b00100 ;    // CLC1OUT出力をRA2から出す。
     CLCIN0PPS = 0x05 ;       // CLCIN0 入力はRA5から入れる
     CLCIN1PPS = 0x00 ;
     CLCIN2PPS = 0x00 ;
     CLCIN3PPS = 0x00 ;
     CLC1GLS0  = 0x02 ;       // ゲート1は入力1の信号(CLCIN0)を真(非反転)で使用する
     CLC1GLS1  = 0x08 ;       // ゲート2は入力2の信号(PWM3)を真(非反転)で使用する
     CLC1GLS2  = 0x08 ;       // ゲート3は入力2の信号(PWM3)を真(非反転)で使用する
     CLC1GLS3  = 0x08 ;       // ゲート4は入力2の信号(PWM3)を真(非反転)で使用する
     CLC1SEL0  = 0x00 ;       // 入力1はCLCIN0PPSのレジスタ(RA5)から入力
     CLC1SEL1  = 0x0E ;       // 入力2はPWM3から入力
     CLC1SEL2  = 0x00 ;
     CLC1SEL3  = 0x00 ;
     CLC1POL   = 0x00 ;       // ゲート出力もCLC出力も反転出力はしない
     CLC1CON   = 0x82 ;       // CLCは有効で、ロジックは[4-input AND]

     // PWM3の設定
     PWM3CON = 0b10000000 ;   // PWM3ピンからは出力しない
     PWM3DCH = 64 ;           // デューティ値は50%で初期化
     PWM3DCL = 0 ;
     T2CON   = 0b00000010 ;   // TMR2プリスケーラ値を16倍に設定
     TMR2    = 0 ;            // タイマー2カウンターを初期化
     PR2     = 124 ;          // PWMの周期を設定(1000Hzで設定)
     TMR2ON  = 1 ;            // TMR2(PWM)スタート

     while(1) {
     }
}
---------------------------------------------------------------------

実行結果

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

ロジアナの表示画面

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

レジスタの設定

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

《その他》

12F1501のCLC機能に比べて入力源が倍に増えています、
全ての周辺モジュールと繋がっている感じぃ。
ロジックモジュールも2個から3個になっているしぃ、
さすがぁ、"Intelligent Analog Flash Microcontrollers"みたいなぁ。



記事一部追記(*1) 2016/12/01


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