9章:タイマ(PWMモード)

    作成2014.03.16

     PIC18F4553マイコンでタタイマ(PWMモード)のプログラムを検討します。

  1. 評価回路
     タイマ(PWMモード)の評価回路を図9-1に示します。
     RB0とRC2にLEDを接続します。



  2. PWMModeソースプログラム
    (1)PWMModeソースプログラム
    PWMModeソースプログラムを以下に示します。
    //PWMMode
    #include <xc.h>
    #include <p18f4553.h>
    
    #pragma config PLLDIV   = 5	// (20MHz crystal)
    #pragma config CPUDIV   = OSC1_PLL2	//「 主 発振 器 そのまま」「システム96MHzPLLソースを2 分 の 一 」
    #pragma config USBDIV   = 2	// Clock source from 96MHz PLL/2
    #pragma config FOSC     = HSPLL_HS	//外付け振動子利用の高速クロック発振で、PLLを 使 う
    #pragma config FCMEN    = OFF	//フェイルセーフクロックモニターを 無効
    #pragma config IESO     = OFF	//発振 器 の 内部 外部 切 り 替 えを 無効
    #pragma config PWRT     = OFF	//電源オン時タイマーを使わない
    #pragma config BOR      = ON	//ハードだけでブラウンアウトリセット 機能 を使う
    #pragma config BORV     = 3	//最小電圧設定
    #pragma config VREGEN   = ON	//USB Voltage Regulator = ON
    #pragma config WDT      = OFF	//ウオッチドッグタイマを 無効
    #pragma config WDTPS    = 32768	//ウォッチドッグタイマーのプリスケーラが1:32,768
    #pragma config MCLRE    = ON	//MCLRを 有効 にしてRE3入力端子は 無効
    #pragma config LPT1OSC  = OFF	//タイマー1 発振 器 を 高電力 モードにする
    #pragma config PBADEN   = OFF	//リセット 時 にPORTB0〜4をデジタル 入出力 に 選択 する
    #pragma config CCP2MX   = OFF	//CCP2の入出力をRB3にマルチプレックスしない
    #pragma config STVREN   = ON	//スタック満杯あるいはアンダーフロー時にリセットする
    #pragma config LVP      = OFF	//ICSPモードでの単一書き込み電源は 使 わない
    #pragma config ICPRT    = OFF	// Dedicated In-Circuit Debug/Programming = OFF
    #pragma config XINST    = OFF	// Extended Instruction Set = OFF
    #pragma config CP0      = OFF	//ブロック0(000800−001FFFh)のコードを保護しない
    #pragma config CP1      = OFF
    #pragma config CP2      = OFF
    #pragma config CP3      = OFF
    #pragma config CPB      = OFF
    #pragma config CPD      = OFF
    #pragma config WRT0     = OFF	//ブロック0 (000800-001FFFh) の書込み保護しない
    #pragma config WRT1     = OFF
    #pragma config WRT2     = OFF
    #pragma config WRT3     = OFF
    #pragma config WRTB     = OFF	// Boot block (000000-0007FFh)の書込み保護しない
    #pragma config WRTC     = OFF	//Configuration registers (300000-3000FFh) の書込み保護しない
    #pragma config WRTD     = OFF	//Data EEPROM の書込み保護しない
    #pragma config EBTR0    = OFF	//Block 0 (000800-001FFFh) を他のブロック実行時のテーブル読み取りから保護しない
    #pragma config EBTR1    = OFF
    #pragma config EBTR2    = OFF
    #pragma config EBTR3    = OFF
    #pragma config EBTRB    = OFF	//Boot block (000000-0007FFh)を他のブロック実行時のテーブル読み取りから保護しない
    
    
    
    // プロトタイプ宣言
    void InitPWM (void);
    void InitTimer2 (void);
    
    // メイン関数
    void main (void)
    {
    	// 入出力設定
    	ADCON1  =	0b00001111;	//全チャンネルがデジタルに設定され、VDDとVSSが選択
    	TRISA   =	0b00000000;
        	TRISB   =	0b00000000;
        	TRISC   =	0b00110000;	//D-,D+(USB用)RC4とRC5を入力に設定
        	TRISD   =	0b00000000;
        	TRISE   =   0b00000011;         //SW1,2=INPUT LED=OUTPUT
        	LATA    =	0b00000000;
        	LATB    =	0b00000000;
        	LATC    =	0b00000000;
        	LATD    =	0b00000000;
        	LATE    =	0b00000000;
    
    	// 電圧レベルの初期設定
    	PORTA = 0xFF;
    	PORTB = 0xFF;
            PORTC = 0xFF;
    
    	// PWMモード設定関数の呼び出し
    	InitPWM();
    
    	// タイマ2設定関数の呼び出し
    	InitTimer2();
    
    	// 永久ループ
    	while(1)
    	{
    		// LED1点灯
    		PORTBbits.RB0 = 0;
    	}
    }
    
    // PWMモード設定関数
    void InitPWM (void)
    {
    	
    	//TRISB3 = 0;// RB3端子を出力端子に設定
            TRISCbits.TRISC2=0;// RC2端子を出力端子に設定
    
    	// CCPのモードをPWMモードに設定
            CCP1CONbits.CCP1M3=1;
            CCP1CONbits.CCP1M2=1;
            CCP1CONbits.CCP1M2=1;
            CCP1CONbits.CCP1M0=1;
    
    
    	// 周期を100μ秒に設定(99 + 1μ秒)
    	PR2 =  0b01100011;
            //extern volatile unsigned char           PR2                 @ 0xFCB;
    
    	// Hの時間を99μ秒に設定(396 × 0.25μ秒)
    	CCPR1L =0b01100000;
    	//CCP1X = 0;
    	//CCP1Y = 0;
            CCP1CONbits.DC1B1=0;
            CCP1CONbits.DC1B0=0;
            CCP1CONbits.P1M1=0;
            CCP1CONbits.P1M0=0;
    }
    
    // タイマ2設定関数
    void InitTimer2 (void)
    {
    	// プリスケーラ値を1に設定
            T2CONbits.T2CKPS1=0;
            T2CONbits.T2CKPS0=0;
    
    	// TMR2レジスタをクリア
    	TMR2 = 0;
            //extern volatile unsigned char TMR2   @ 0xFCC;
    
    	// タイマ2起動
            T2CONbits.TMR2ON=1;
    }
    
     CompareMode.cの内容は以下を開いてコピーします。
    「PWMMode.cの内容」にいく。


  3. PIC16F627A→PIC18F4553の主な変更点
    (1) config設定は全面的に変更です。
    (2)RB0をPORTBbits.RB0に変更しました。
    (3)// CCPのモードをPWMモードに設定
    CCP1M3 = 1;CCP1M2 = 1;CCP1M1 = 0;CCP1M0 = 0;を
    CCP1CONbits.CCP1M3=1;CCP1CONbits.CCP1M2=1;CCP1CONbits.CCP1M2=1;CCP1CONbits.CCP1M0=1;
    に変更しました。
    (4)CCP1X = 0;CCP1Y = 0;を
    CCP1CONbits.DC1B1=0;CCP1CONbits.DC1B0=0; CCP1CONbits.P1M1=0;CCP1CONbits.P1M0=0;
    (5)その他ビットの名称もオブジェクト指向のクラスメンバの表記方法に変更しました。
    **CCP1CONのビットの定義がかなり変更になっていました。


  4. 動作確認
     動作確認の状況を以下に示します。

    *RB0に接続したLEDが明るく点灯し、RC2に接続したLEDが暗く点灯します。


  5. 新PIC入門C言語編のPIC18F4553対応変換まとめ
    (1)キットで遊ぼう電子回路No.9新PIC入門C言語編でPIC16F627A用ソースプログラムは全てPIC18F4553用に変換できることがわかりました。
    (2)PIC18F4553対応の開発環境は「MPLAB X IDE v2.00」と「xc8-v1.30-win」と「PICkit3」の組合せとなります。
    (3)上記の条件において、ビルド、デバッグ、書き込み機能は全て正常に動作しました。
    (4)PIC16F627AとPIC18F4553とでは、機能が異なるためソースプログラムのコードが一部変更となります。
    (5)ソースプログラムコードの変更はデータシートを参照して行う必要が生じます。
    (6)データシートの内容は膨大であり、全てを理解するのは困難です。当然、変更点のみをじっくり比較して読むことになります。
    (7)データシートのみでソースプログラムを作成するのは困難で、何らかのサンプルコードを理解して、PIC18F4553対応変換を行うことになります。
    (8)詳細が理解できないサンプルプログラムを参考にPIC18F4553対応変換は可能か?(秋月電子通商サンプルプログラム「MPLABを使った使用例2」がそうです。)
    (9)残念ながら無理です。内容が理解できたサンプルプログラムからPIC18F4553対応変換することになります。











10章:AD変換に行く。

トップページに戻る。