dsPIC33AKシリーズ㉘ CLCモジュールの使い方(2nd Generation)

CLCモジュールの使い方

概要

今回は、dsPIC33AKシリーズに搭載されているCLC(Configurable Logic Cell)モジュールの使い方についてご紹介します。

CLCモジュールは、過去の記事でも取り上げたことがありますが、PICシリーズに搭載されているペリフェラルの中でも非常にユニークな機能です。以下のような特徴があります。

CLCとは

CLCは「Configurable Logic Cell」の略で、ANDやOR、フリップフロップなどの論理機能を自由に組み合わせて、簡易的な論理回路を構成できるモジュールです。

・VHDLやVerilogなどのHDL言語で記述する必要はなく、レジスタ設定のみで構成可能
・複雑な回路は組めないものの、動的にロジック構成を変更できる柔軟性
・ハードウェア処理のため、ソフトウェアよりも高速な信号処理が可能
・外付け部品が不要で、基板の集積度向上やシステムコストの削減に貢献
・他モジュールとの連携により機能拡張が可能
・CPU負荷を軽減可能

記事変更履歴

公開/
変更日
特記
25/5/23初版公開。
25/5/26対応型式の追加
25/6/14開発環境、ブロック図、ソースコード、結果の追加

dsPIC33系CLCの残念なポイント

これまでのdsPICシリーズに搭載されているCLCには大きな課題がありました。
それは、データソース(DS:Data Selection)の選択肢が非常に少なかったという点です。

例えば、8bit PICシリーズではDSの選択肢が6〜7ビット用意されているのに対し、dsPIC系ではわずか3ビットしかなく、しかも割り当て可能な入力が限られていました。

その結果、「CLCを使いたくても使えない」という状況が多く、使い勝手が悪い印象を持っていた方も多いのではないでしょうか。

(fig.1-1)dsPIC系のCLC構造(70005539C – 1295 より抜粋)
(fig.1-2)8bitPIC系のCLC構造(DS40002329F – 388より抜粋)

改善されなかったdsPIC33AK 初代のCLC

これはdsPIC33AKの初代でも変わらず、下記のように特定のモジュールの出力しかデータソースとして割り当てられていませんでした。
一応、他モジュールの出力を一度I/Oピンに出力し、再びCLC入力ピン(例:CLCINA)から取り込むといった回避策もありましたが、貴重な外部ピンを消費してしまうという大きなデメリットがありました。

(fig.1-3)Table 25-2. DS1 Data Selection
(fig.1-4)Table 25-3. DS2 Data Selection
(fig.1-5)Table 25-5. DS4 Data Selection

改善されたdsPIC33AK 2nd GenerationのCLC

このような状況が、dsPIC33AKシリーズの第2世代で大きく改善されました。
DSのビット幅自体は変わらず3ビットのままですが、各DS入力にバーチャルピン出力が割り当てられるようになったのです。
つまり、Peripheral Pin Select(PPS)で出力できるすべての機能が、CLCのデータソースとして使用可能になっています

これにより、従来のように外部ピンを経由する必要がなくなり、使い勝手が飛躍的に向上しています。
さらに、10チャンネル分のCLCが使用可能となり、クリティカルなリアルタイム処理にも十分に対応できます。

(fig.1-6)Table 27-2. DS1 Data Selection
(fig.1-7)Table 27-3. DS2 Data Selection
(fig.1-8)Table 27-4. DS3 Data Selection
(fig.1-9)Table 27-5. DS4 Data Selection

関連リンク

内部リンク

記事リンク
第1回dsPIC33AKシリーズについてdsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com)
第2回開発ボード、コンフィグレーション設定、クロック設定についてdsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com)
第3回CPU性能についてdsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第4回FPU性能についてdsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com)
第5回DSPについてdsPIC33AKシリーズ⑤DSPについて – ぴくおの電子工作的な何かWP (electricpico.com)
第6回タイマー1割り込みの使い方dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第7回PMUの使い方dsPIC33AKシリーズ⑦PMUの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第8回高速ADCの使い方dsPIC33AKシリーズ⑧高速ADCの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第9回高速OPAMPの使い方dsPIC33AKシリーズ⑨高速OPAMPの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第10回DMAモジュールの使い方dsPIC33AKシリーズ⑩DMAモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第11回WDTモジュールの使い方dsPIC33AKシリーズ⑪WDTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第12回DMTモジュールの使い方dsPIC33AKシリーズ⑫DMTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第13回I/Oインテグリティモニタモジュールの使い方dsPIC33AKシリーズ⑬I/Oインテグリティモニターモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第14回QEIモジュールの使い方dsPIC33AKシリーズ⑭QEIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第15回UARTモジュールの使い方dsPIC33AKシリーズ⑮UARTモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第16回DSPの使い方1 (デジタルフィルタ)dsPIC33AKシリーズ⑯ DSPの使い方1(デジタルフィルタ) – ぴくおの電子工作的な何かWP (electricpico.com)
第17回DSPの使い方2 (FFT)dsPIC33AKシリーズ⑰ DSPの使い方2(FFT) – ぴくおの電子工作的な何かWP (electricpico.com)
第18回DSPの使い方3 (自己相関アルゴリズム)dsPIC33AKシリーズ⑱ DSPの使い方3(自己相関アルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第19回DSPの使い方4(LMSアルゴリズム)dsPIC33AKシリーズ⑲ DSPの使い方4(LMSアルゴリズム) – ぴくおの電子工作的な何かWP (electricpico.com)
第20回SPIモジュールの使い方dsPIC33AKシリーズ⑳ SPIモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第21回高速コンパレータモジュールの使い方1dsPIC33AKシリーズ㉑ 高速コンパレータモジュールの使い方1 – ぴくおの電子工作的な何かWP (electricpico.com)
第22回CBGモジュールの使い方dsPIC33AKシリーズ㉒ CBGモジュールの使い方 – ぴくおの電子工作的な何かWP (electricpico.com)
第23回高速PWMの使い方dsPIC33AKシリーズ㉓ 高速PWMについて – ぴくおの電子工作的な何かWP
第24回SENTモジュールの使い方dsPIC33AKシリーズ㉔ SENTモジュールの使い方 – ぴくおの電子工作的な何かWP
第25回①AC負荷アナライザの製作①
~設計、ハードウエア編~
dsPIC33AKシリーズ㉕ AC負荷アナライザの製作①設計、ハードウェア編 – ぴくおの電子工作的な何かWP
第25回②AC負荷アナライザの製作②
~マイコンソフトウェア編~
dsPIC33AKシリーズ㉕ AC負荷アナライザの製作②マイコンソフトウェア編 – ぴくおの電子工作的な何かWP
第25回③AC負荷アナライザの製作③
~Windowsアプリ編~
dsPIC33AKシリーズ㉕ AC負荷アナライザの製作③Windowsアプリ編 – ぴくおの電子工作的な何かWP
第26回dsPIC33AKシリーズ㉖ MBISTの使い方dsPIC33AKシリーズ㉖ MBISTの使い方 – ぴくおの電子工作的な何かWP
第27回DSPの使い方5(行列)dsPIC33AKシリーズ㉗ DSPの使い方5(行列) – ぴくおの電子工作的な何かWP
第28回(本記事)CLCの使い方(2nd Generation)dsPIC33AKシリーズ㉘ CLCモジュールの使い方(2nd Generation) – ぴくおの電子工作的な何かWP
(fig.2-1)各関連記事リンク
記事タイトルリンク
CLCモジュールの使い方CLCモジュールの使い方 – ぴくおの電子工作的な何かWP
CLCモジュールの使い方2dsPIC33Cシリーズ CLCモジュールの使い方2 – ぴくおの電子工作的な何かWP
(fig.2-2)各関連記事リンク

外部リンク

タイトルリンク
CPUホームページdsPIC33AK512MPS512 | Microchip Technology
CPUボードdsPIC33AK512MPS512 General Purpose Dual In-Line Module (DIM) | Microchip Technology
Git Hub特設ページdspic33a-curiosity-oob/dspic33ak512mps512_dim at 1.3.2 · microchip-pic-avr-examples/dspic33a-curiosity-oob

開発環境

開発環境を以下に示します。
今回はCPUボード(EV80L65A)で動作確認を行います。

項目リンク
ベースボードdsPIC33A CURIOSITY PLATFORM
DEVELOPMENT BOARD
dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com)
CPUボード(EV80L65A)dsPIC33AK512MPS512 General Purpose Dual In-Line Module (DIM)dsPIC33AK512MPS512 General Purpose Dual In-Line Module (DIM) | Microchip Technology
統合開発環境MPLAB X IDE v6.25MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.21MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境
(fig.2-2)ベースボード + CPUボード

ブロック図

今回はCLCの動作確認を目的として、以下のような構成でLEDを点滅させます。

  • CLC1:PWM1Hの出力を内部バーチャルピンに接続し、Standard ClockとのAND演算結果を出力します。

最終的な出力は外部ピンに接続し、LED1を点灯させて動作を確認します。

ソースコード

int main() 
{
    /*-----------------------------------------------------------------------*/
    /*初期化*/
    /*-----------------------------------------------------------------------*/
        vdg_Clock_Set_Register();

	RPOR10bits.RP42R = 69;	//CLC1OUT
	RPOR34bits.RP139R = 1;	//PWM1OUT
		
    /*-----------------------------------------------------------------------*/
    /* CLC1CONレジスタ */
    /*-----------------------------------------------------------------------*/
	CLC1CON = 
		( 2 << _CLC1CON_MODE_POSITION ) |	//4 in AND
		( 0 << _CLC1CON_LCPOL_POSITION ) |
		( 0 << _CLC1CON_LCOUT_POSITION ) |
		( 1 << _CLC1CON_LCOE_POSITION ) |
		( 0 << _CLC1CON_INTN_POSITION ) |
		( 0 << _CLC1CON_INTP_POSITION ) |
		( 0 << _CLC1CON_ON_POSITION ) |
		( 0 << _CLC1CON_G1POL_POSITION ) |
		( 0 << _CLC1CON_G2POL_POSITION ) |
		( 1 << _CLC1CON_G3POL_POSITION ) |
		( 1 << _CLC1CON_G4POL_POSITION ) ;

    /*-----------------------------------------------------------------------*/
    /* CLC1SELレジスタ */
    /*-----------------------------------------------------------------------*/
	CLC1SEL = 
		( 0 << _CLC1SEL_DS1_POSITION ) |	//Standard Peripheral Clock (system clock/2)
		( 6 << _CLC1SEL_DS2_POSITION ) |	//Virtual Pin 10 Output
		( 0 << _CLC1SEL_DS3_POSITION ) |	//BFRC/244
		( 0 << _CLC1SEL_DS4_POSITION ) ;	//FRC

    /*-----------------------------------------------------------------------*/
    /* CLC1GLSレジスタ */
    /*-----------------------------------------------------------------------*/
	CLC1GLS = 
		( 0 << _CLC1GLS_G1D1N_POSITION ) |
		( 1 << _CLC1GLS_G1D1T_POSITION ) |
		( 0 << _CLC1GLS_G1D2N_POSITION ) |
		( 0 << _CLC1GLS_G1D2T_POSITION ) |
		( 0 << _CLC1GLS_G1D3N_POSITION ) |
		( 0 << _CLC1GLS_G1D3T_POSITION ) |
		( 0 << _CLC1GLS_G1D4N_POSITION ) |
		( 0 << _CLC1GLS_G1D4T_POSITION ) |
		( 0 << _CLC1GLS_G2D1N_POSITION ) |
		( 0 << _CLC1GLS_G2D1T_POSITION ) |
		( 0 << _CLC1GLS_G2D2N_POSITION ) |
		( 1 << _CLC1GLS_G2D2T_POSITION ) |
		( 0 << _CLC1GLS_G2D3N_POSITION ) |
		( 0 << _CLC1GLS_G2D3T_POSITION ) |
		( 0 << _CLC1GLS_G2D4N_POSITION ) |
		( 0 << _CLC1GLS_G2D4T_POSITION ) |
		( 0 << _CLC1GLS_G3D1N_POSITION ) |
		( 0 << _CLC1GLS_G3D1T_POSITION ) |
		( 0 << _CLC1GLS_G3D2N_POSITION ) |
		( 0 << _CLC1GLS_G3D2T_POSITION ) |
		( 0 << _CLC1GLS_G3D3N_POSITION ) |
		( 0 << _CLC1GLS_G3D3T_POSITION ) |
		( 0 << _CLC1GLS_G3D4N_POSITION ) |
		( 0 << _CLC1GLS_G3D4T_POSITION ) |
		( 0 << _CLC1GLS_G4D1N_POSITION ) |
		( 0 << _CLC1GLS_G4D1T_POSITION ) |
		( 0 << _CLC1GLS_G4D2N_POSITION ) |
		( 0 << _CLC1GLS_G4D2T_POSITION ) |
		( 0 << _CLC1GLS_G4D3N_POSITION ) |
		( 0 << _CLC1GLS_G4D3T_POSITION ) |
		( 0 << _CLC1GLS_G4D4N_POSITION ) |
		( 0 << _CLC1GLS_G4D4T_POSITION ) ;
			
	CLC1CONbits.ON = 1;

  /*-----------------------------------------------------------------------*/
    /* PWM設定*/
    /*-----------------------------------------------------------------------*/
	PCLKCONbits.MCLKSEL = 0u;
	PCLKCONbits.DIVSEL = 0u;
		
	MPER = 1000;
	MDC = MPER / 2;
		
	PG1PHASE = 0u;
		
	PG1CONbits.MODSEL = 0u; //可変フェーズ
	PG1CONbits.CLKSEL = 1u; //MCLKSEL
	PG1CONbits.TRGCNT = 0u;
	PG1CONbits.SOCS = 0u;
	PG1CONbits.TRGMOD = 0u;
	PG1CONbits.UPDMOD = 0u;
	PG1CONbits.MSTEN = 0u;
	PG1CONbits.MPHSEL = 0u;
	PG1CONbits.MPERSEL = 1u; //MPER
	PG1CONbits.MDCSEL = 1u; //MDC

	PG1IOCON1bits.POLL = 0;
	PG1IOCON1bits.POLH = 0;
	PG1IOCON1bits.PENL = 0;
	PG1IOCON1bits.PENH = 1;
	PG1IOCON1bits.PMOD = 0;
	PG1IOCON1bits.DTCMPSEL = 0;
	PG1IOCON1bits.PPSEN = 0;
	PG1IOCON1bits.FORCEON = 0;
	PG1IOCON1bits.SWAP = 0;
	PG1IOCON1bits.CAPTRSEL = 0;
	PG1IOCON1bits.CAPTREN = 0;
	PG1IOCON1bits.CAPSRC = 0;
	PG1IOCON1bits.CAPEN = 0;

    /*-----------------------------------------------------------------------*/
    /* PG1IOCON2レジスタ */
    /*-----------------------------------------------------------------------*/
	PG1IOCON2 = 0x00000000;
			
	PG1CONbits.ON = 1u;
	
	while(1){;}
		
}

結果

下記のように、Standard ClockがPWM信号でチョッピングされている事が確認できると思います。

対応型式

以下の型式には、すべて改良されたCLCが搭載されています。

・dsPIC33AK256MPS205・dsPIC33AK256MPS206・dsPIC33AK256MPS208・dsPIC33AK256MPS210・dsPIC33AK256MPS212
・dsPIC33AK256MPS505・dsPIC33AK256MPS506・dsPIC33AK256MPS508・dsPIC33AK256MPS510・dsPIC33AK256MPS512
・dsPIC33AK512MPS205・dsPIC33AK512MPS206・dsPIC33AK512MPS208・dsPIC33AK512MPS210・dsPIC33AK512MPS212
・dsPIC33AK512MPS505・dsPIC33AK512MPS506・dsPIC33AK512MPS508・dsPIC33AK512MPS510・dsPIC33AK512MPS512

・dsPIC33AK256MC205・dsPIC33AK256MC206・dsPIC33AK256MC208・dsPIC33AK256MC210・dsPIC33AK256MC505
・dsPIC33AK256MC506・dsPIC33AK256MC508・dsPIC33AK256MC510・dsPIC33AK512MC205・dsPIC33AK512MC206
・dsPIC33AK512MC208・dsPIC33AK512MC210・dsPIC33AK512MC505・dsPIC33AK512MC506・dsPIC33AK512MC508
・dsPIC33AK512MC510

記事についての注意点

本記事は慎重に内容を検討し正確さに努めておりますが、内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント

タイトルとURLをコピーしました