SCCPモジュールの使い方3(同期機能)

SCCPモジュールの使い方

概要

1つのSCCPモジュールに他のモジュールがタイミングを同期させる場合には同期機能を使用します。

今回は(fig.1)のように、SCCP1の立下りパルスを基準にSCCP2とSCCP3の波形を出力します。

同期機能とは

同期ソース(SYNC<4:0>)で選択されている入力がアサートされた時に自分のタイマカウントを0にする機能です。

(fig.1)SCCPモジュール同士の同期
(fig.2)フルカラーLED位置

ハードウェア構成と制御ブロック

SCCP1で周期を決定し、自己はSYNC機能を使用しない設定にします。また他のSCCP2、SCCP3はSYNC入力にSCCP1出力を指定します。このように設定すると、SCCP1のコンペアマッチのタイミングでSCCP2、SCCP3のタイマがクリアされます。CCPxRAで最初の変化、CCPxRBで次の変化のタイミングを設定します。上記例では出力を反転させていますので、最初の変化がH→Lと遷移します。

注意点としてはクロック入力を全て同一のクロック源とする必要が有ります。

(fig.3) ハードウェア構成

ソースコード

以下の6つの値を変更することで、出力波形が変わります。

  • CCP1PRL 全体周期
  • CCP1RB CCP1パルスの立ち上がりタイミング
  • CCP2RA CCP2パルスの立ち下がりタイミング
  • CCP2RB CCP2パルスの立ち上がりタイミング
  • CCP3RA CCP3パルスの立ち下がりタイミング
  • CCP3RB CCP3パルスの立ち上がりタイミング

同期ソースレジスタ「 CCPxCON1Hbits.SYNC 」の設定は以下のようにします。

CCP1CON1Hbits.SYNC = 0u;     /* 同期無し */
CCP2CON1Hbits.SYNC = 2u;     /* SCCP1に同期 */	
CCP3CON1Hbits.SYNC = 2u;     /* SCCP1に同期 */	
コンフィグレーション設定について

コンフィグレーション設定についてはコンフィグレーション設定に記載しております。

コピーして下記のソースコードの「 //ここにコンフィグレーション設定を挿入する// 」の位置に挿入してください。

クロック設定について

クロック設定用関数 vds_Main_Init_Clock_Register(); のソースコードはクロック設定のページに記載しております。

コピーして下記のソースコードの「 //ここにクロック設定ソースをコピペする// 」の位置に挿入してください。

/*--------------------------------------------------------------------------------*/
/* @file      SCCP_SYNC.c */
/* @brief     SCCPモジュールの使い方3 */
/* @details   SCCP(CCPxCON1L,CCPxCON2H,CCPxPRL,CCPxRB) */
/*                  リマッパブルピン(RPOR) */
/*--------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------*/
/* コンフィグレーション設定*/
/*--------------------------------------------------------------------------------*/
//ここにコンフィグレーション設定を挿入する//
/*--------------------------------------------------------------------------------*/
/* インクルードファイル*/
/*--------------------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
/*--------------------------------------------------------------------------------*/
/* 定数定義*/
/*--------------------------------------------------------------------------------*/
#define FCY         90000000L           /*90MHz*/
#define ORG_CLOCK   100000L             /*クロック源周期*/
#define ORG_DUTY    (ORG_CLOCK >> 1u)   /*クロック源Duty*/
#define DIV_NUM     10                  /*間引き回数 Min 2*/
#define DIV_DUTY    1                   /*分周時Duty */
/*--------------------------------------------------------------------------------*/
/* クロック設定 */
/*--------------------------------------------------------------------------------*/
//ここにクロック設定ソースを挿入する//
/*--------------------------------------------------------------------------------*/
/* Main関数 */
/*--------------------------------------------------------------------------------*/
int main(int argc, char** argv) 
{
    /*------------------------------------------------------------------------------*/
    /* リマッパブルピン初期化*/
    /*------------------------------------------------------------------------------*/
        RPOR18bits.RP69R = 15u;       /* RGB LED RED [SCCP1] */
        RPOR19bits.RP71R = 16u;       /* RGB LED GREEN[SCCP2] */
        RPOR7bits.RP46R	= 17u;        /* RGB LED BLUE [SCCP3] */
    /*-----------------------------------------------------------------------------*/
    /* CCP1初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP1CON1L = 0x0000u;
            CCP1CON1Lbits.MOD	= 4u;	/* CCPx モード選択ビット */
            CCP1CON1Lbits.CCSEL	= 0u;	/* キャプチャ / コンペア モード選択ビット */	
        CCP1CON1H = 0x0000u;
            CCP1CON1Hbits.SYNC = 0u;     /* 同期無し */
        CCP1CON2H = 0x0000u;
            CCP1CON2Hbits.OCAEN	= 1u;	/* 出力イネーブル / ステアリング制御ビット  */
        CCP1CON3H = 0x0000u;		
            CCP1CON3Hbits.POLACE = 1u;	/* CCPx 出力ピン極性制御ビット */
        CCP1PRL	= 6250;
        CCP1RB	= 400u;
    /*-----------------------------------------------------------------------------*/
    /* CCP2初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP2CON1L = 0x0000u;
            CCP2CON1Lbits.MOD	= 4u;	/* CCPx モード選択ビット */
            CCP2CON1Lbits.CCSEL	= 0u;	/* キャプチャ / コンペア モード選択ビット */
        CCP2CON1H = 0x0000u;
            CCP2CON1Hbits.SYNC = 2u;     /* SCCP1に同期 */	
        CCP2CON2H = 0x0000u;
            CCP2CON2Hbits.OCAEN	= 1u;	/* 出力イネーブル / ステアリング制御ビット  */
        CCP2CON3H = 0x0000u;		
            CCP2CON3Hbits.POLACE = 1u;	/* CCPx 出力ピン極性制御ビット */
        CCP2PRL	= 65535;    
        CCP2RA	= 450u;
        CCP2RB	= 850u;
    /*-----------------------------------------------------------------------------*/
    /* CCP3初期化*/
    /*-----------------------------------------------------------------------------*/
        CCP3CON1L = 0x0000u;
            CCP3CON1Lbits.MOD	= 4u;	/* CCPx モード選択ビット */
            CCP3CON1Lbits.CCSEL	= 0u;	/* キャプチャ / コンペア モード選択ビット */
        CCP3CON1H = 0x0000u;
            CCP3CON1Hbits.SYNC = 2u;     /* SCCP1に同期 */
        CCP3CON2H = 0x0000u;
            CCP3CON2Hbits.OCAEN	= 1u;	/* 出力イネーブル / ステアリング制御ビット  */
        CCP3CON3H = 0x0000u;		
            CCP3CON3Hbits.POLACE = 1u;	/* CCPx 出力ピン極性制御ビット */
        CCP3PRL	= 65535;     
        CCP3RA	= 900u;
        CCP3RB	= 1300u;
    /*-----------------------------------------------------------------------------*/
    /* CCP2,3,4の有効化*/
    /*-----------------------------------------------------------------------------*/ 
        CCP2CON1Lbits.CCPON = 1u ;
        CCP3CON1Lbits.CCPON = 1u ;
        CCP1CON1Lbits.CCPON = 1u ; //基準を最後に有効化
        
    while(1){} 
}

結果

SCCP1(Ch1/黄色)を基準にSCCP2、SCCP3のパルスが出力されています。

(fig.4)同期出力波形

コメント

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