16F18346 には、CONFIGURABLE LOGIC CELL (CLC)が4組あり、デバイス内部の周辺モジュールの出力や、pin入力信号を自由に組み合わせ、再び周辺モジュールの入力や、pinに信号を出力できます。どこからの信号をどのように組み合わせ、どこに出力するかは、各モジュールごとに、10本のレジスタで決定します。
CLCを利用することで、今までソフトウエアで対応していた動作をハードウエアで実剣することが可能になります。ソフトウエアの負担が軽くなるだけでなく、今までは不可能だった機能をPICだけで実現することが可能になります。
CLCは利用価値の高い周辺モジュールです。
CLCに関連するレジスター一覧を下表に示します。
*注意*
CLC出力とCLCpin入力は、PPS機能でピンを指定します。PPS指定例を示します。
PPS機能で、入出力pinを指定 | |
CLCIN1PPS = 0x00; | // 信号源入力 1 を RA0 に指定 |
RC0PPS = 0x04; | // CLC1OUT を RC0 に出力 |
入力信号を処理するロジック回路には、以下の8種類があり、コントロールレジスター(CLCxCON)で選ぶことができます。
Configurable Logic Cell Functional Mode LCxMODE<2:0> | |||
---|---|---|---|
AND-OR <000> | OR-XOR <001> | 4input AND <010> | S-R Latch <011> |
1-Input D Flip-Flop with S and R <100> |
2-Input D Flip-Flop with R <101> |
J-K Flip-Flop with R <110> |
1-Input Transparent Latch with S and R <111> |
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | |
---|---|---|---|---|---|---|---|---|---|
CLCxCON | LCxEN | - | LCxOUT | LCxINTP | LCxINTN | LCxMODE<2:0> | |||
CLCxPOL | LCxPOL | - | - | - | LCxG4POL | LCxG3POL | LCxG2POL | LCxG1POL | |
CLCxSEL0 | - | - | LCxD1S<5:0> | ||||||
CLCxSEL1 | - | - | LCxD2S<5:0> | ||||||
CLCxSEL2 | - | - | LCxD3S<5:0> | ||||||
CLCxSEL3 | - | - | LCxD4S<5:0> | ||||||
CLCxGLS0 | LCxG1D4T | LCxG1D4N | LCxG1D3T | LCxG1D3N | LCxG1D2T | LCxG1D2N | LCxG1D1T | LCxG1D1N | |
CLCxGLS1 | LCxG2D4T | LCxG2D4N | LCxG2D3T | LCxG2D3N | LCxG2D2T | LCxG2D2N | LCxG2D1T | LCxG2D1N | |
CLCxGLS2 | LCxG3D4T | LCxG3D4N | LCxG3D3T | LCxG3D3N | LCxG3D2T | LCxG3D2N | LCxG3D1T | LCxG3D1N | |
CLCxGLS3 | LCxG4D4T | LCxG4D4N | LCxG4D3T | LCxG4D3N | LCxG4D2T | LCxG4D2N | LCxG4D1T | LCxG4D1N |
レジスタ | BIT | 名 | 説明 | 1 | 0 |
---|---|---|---|---|---|
CLCxCON | 7 | LCxEN | CLCxモジュールのOn/Off | ON | OFF |
5 | LCxOUT | (Read only) CLCxの出力 | 1 | 0 | |
4 | LCxINTP | CLCx出力の立ち上がりでCLCxIFをセット | 許可 | 禁止 | |
3 | LCxINTN | CLCx出力の立ち下がりでCLCxIFをセット | 許可 | 禁止 | |
<2:0> | LCxMODE | 使用するロジック回路の指定 | |||
CLCxPOL | 7 | LCxPOL | CLCxモジュール出力極性 | 反転 | 正論理 |
3 | LCxG4POL | CLCx Data Gate 4 の出力極性 | 反転 | 正論理 | |
2 | LCxG3POL | CLCx Data Gate 3 の出力極性 | 反転 | 正論理 | |
1 | LCxG32OL | CLCx Data Gate 2 の出力極性 | 反転 | 正論理 | |
0 | LCxG1POL | CLCx Data Gate 1 の出力極性 | 反転 | 正論理 | |
CLCxGLS0 | <5:0> | LCxD1S | 信号源1選択 表1参照 | ||
CLCxGLS1 | <5:0> | LCxD2S | 信号源2選択 表1参照 | ||
CLCxGLS2 | <5:0> | LCxD3S | 信号源3選択 表1参照 | ||
CLCxGLS3 | <5:0> | LCxD4S | 信号源4選択 表1参照 | ||
CLCxGLS0 | 7 | LCxG1D4T | Gate1 Data4の入力 10 = 信号源4を入力(正論理) 01 = 信号源4を反転入力(負論理) 00 = VSS |
||
6 | LCxG1D4N | ||||
5 | LCxG1D3T | Gate1 Data3の入力 10 = 信号源3を入力(正論理) 01 = 信号源3を反転入力(負論理) 00 = VSS |
|||
4 | LCxG1D3N | ||||
3 | LCxG1D2T | Gate1 Data2の入力 10 = 信号源2を入力(正論理) 01 = 信号源2を反転入力(負論理) 00 = VSS |
|||
2 | LCxG1D1N | ||||
1 | LCxG1D1T | Gate1 Data1の入力 10 = 信号源1を入力(正論理) 01 = 信号源1を反転入力(負論理) 00 = VSS |
|||
0 | LCxG1D1N |
表1 信号源選択 LCxDyS<5:0> | |||||||
---|---|---|---|---|---|---|---|
0x00 | 0 = CLCIN0PPS | 0x09 | 9 = C2出力 | 0x12 | 18 = SCL1 | 0x1B | 27 = IOCIF flag bit |
0x01 | 1 = CLCIN1PPS | 0x0A | 10 = DSM出力 | 0x13 | 19 = SDA1 | 0x1C | 28 = ADCRC |
0x02 | 2 = CLCIN2PPS | 0x0B | 11 = CLKR出力 | 0x14 | 20 = SCL2 | 0x1D | 29 = LFINTOSC |
0x03 | 3 = CLCIN3PPS | 0x0C | 12 = CCP1出力 | 0x15 | 21 = SDA2 | 0x1E | 30 = HFINTOSC |
0x04 | 4 = CLC1出力 | 0x0D | 13 = CCP2出力 | 0x16 | 22 = EUSART1 TX/CK | 0x1F | 31 = FOSC |
0x05 | 5 = CLC2出力 | 0x0E | 14 = CCP3出力 | 0x17 | 23 = EUSART1 DT出力 | 0x20 | 32 = TMR3 overflow |
0x06 | 6 = CLC3出力 | 0x0F | 15 = CCP4出力 | 0x18 | 24 = TMR0 overflow | 0x21 | 33 = TMR4/PR4一致 |
0x07 | 7 = CLC4出力 | 0x10 | 16 = PWM5出力 | 0x19 | 25 = TMR1 overflow | 0x22 | 34 = TMR5 overflow |
0x08 | 8 = C1出力 | 0x11 | 17 = PWM6出力 | 0x1A | 26 = TMR2/PR2一致 | 0x23 | 35 = TMR6/PR6一致 |
「SWでLEDをOn/Off」は、通常ソフトウェアでSWの接続されている端子を常時監視し、SWが押されるとLEDが接続された端子の電圧をHiにします。しかし、CLC機能の設定さえしておけば、PIC コアは、LED点滅のための命令ルーチンを実行することなく、独立したハードウエアだけで「SWでLEDをOn/Off」を実現できます。
MCCの CLC module を使い、Push SW ボタンを押すとLED D4 を点灯させるプログラムです。CLCに関わるレジスターの値は、MCCのGUIを利用して決定しました。しかしMCCを利用すると、丁寧なコメントや使用しない関数も自動作成するため、プログラム全体の見通しが悪くなります。ここでは、MCCで決定したレジスター関連の命令を抜き出して必要な部分だけを利用しています。
<回路図>
PPS機能の設定で
・pin RC4 を CLCIN0 入力
・pin RA5 を CLC1OUT 出力に、指定します。
これらのピンは Push SW S1 と LED D4 に接続されています。プログラムの確認は、Curiosity ボードにPIC16F18346を挿して行いました。
<プログラム>
/********************************************* * File: CLC sample * System ClockはConfigで内部1MHzに設定 * CLCのAND-ORで、PushSW入力を反転しLEDに接続する * CLC入出力はPPSでピン指定する * PIC16F18346 * Created on may 22, 2020 **********************************************/ #include <xc.h> #pragma config FEXTOSC = OFF,RSTOSC = HFINT1 // HFINTOSC (1MHz) #pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF #pragma config MCLRE = ON,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF #pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON #pragma config DEBUG = OFF #pragma config WRT = OFF,LVP = ON,CP = OFF,CPD = OFF void main(void){ TRISA5 = 0; // LED RA5 出力設定 ANSC4 = 0; // SW RC4 デジタル設定 // PPS 初期化 ************************************** // pin RC4 (PushSW) を CLCIN0 入力に指定 // pin RA5 (LED D4) を CLC1OUT 出力に指定 // ************************************************* CLCIN0PPS = 0x14; // RC4 -> CLCIN0 RA5PPS = 0x04; // CLC1OUT -> RA5 // CLC1 初期化 ************************************** // AND-OR を使用 // 入力は、CLCIN0PPS でPushSWを指定 // CLC1出力を反転したものをLEDに接続 // ************************************************* CLC1POL = 0x82; // モジュール、Gate2出力反転 他はそのまま CLC1SEL0 = 0x00; // 信号源1 CLCIN0PPS CLC1SEL1 = 0x00; // 信号源2 CLCIN0PPS CLC1SEL2 = 0x00; // 信号源3 CLCIN0PPS CLC1SEL3 = 0x00; // 信号源4 CLCIN0PPS CLC1GLS0 = 0x02; // Gate1 Data1T ON 他はOFF CLC1GLS1 = 0x00; // Gate2 全入力OFF CLC1GLS2 = 0x00; // Gate3 全入力OFF CLC1GLS3 = 0x00; // Gate4 全入力OFF CLC1CON = 0x80; // LC1 ON 割込OFF AND-OR while (1) {} }