--------------------------------------------------------------------- #include <xc.h> #define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定) // コンフィギュレーション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 // 電源電圧降下常時監視機能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.5V)設定(HI) #pragma config LPBOR = OFF // 低消費電力ブラウンアウトリセット(LPBOR_OFF) #pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) // アナログ値の入力処理 unsigned int adconv() { unsigned int temp; GO_nDONE = 1 ; // PICにアナログ値読取り開始を指示 while(GO_nDONE) ; // PICが読取り完了するまで待つ temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です return temp ; } // メインの処理 void main() { unsigned int num ; OSCCON = 0b01110010 ; // 内部クロックは8MHzとする ANSELA = 0b00000000 ; // AN0-AN3は使用しない全てデジタルI/Oとする ANSELC = 0b00001000 ; // アナログはAN7を使用し、AN4-AN6は使用しないデジタルI/Oとする TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(RA3は入力専用) TRISC = 0b00001000 ; // RC3(AN7)だけ入力その他のピンは出力に割当てる PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする) // A/Dの設定 ADCON1 = 0b10010000 ; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスに ADCON0 = 0b00011101 ; // アナログ変換情報設定(AN7から読込む) __delay_us(5) ; // アナログ変換情報が設定されるまでとりあえず待つ // CCP1の設定 RC2PPS = 0b00001100 ; // RC2(8)ピンをCCP1出力に割り当てる CCP1CON = 0b00001100 ; // PWM機能を使用する T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 CCPR1L = 0 ; // デューティ値は0で初期化 CCPR1H = 0 ; TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート while(1) { num = adconv() ; // 7番ピン(AN7)から半固定抵抗の値を読み込む CCPR1L = num/4 ; // アナログ値からのデータでデューティ値を設定 } } ---------------------------------------------------------------------
RC2PPS = 0b00001100 ; // RC2(8)ピンをCCP1出力に割り当てる CCP1CON = 0b00001100 ; // PWM機能を使用する T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 CCPR1L = 0 ; // デューティ値は0で初期化 CCPR1H = 0 ; TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート CCPR1L = num/4 ; この行でPWMのデューティ値を変更しています。CCP2を利用する場合は、レジスター"CCP1"の文字を"CCP2"に書き換えます。
--------------------------------------------------------------------- #include <xc.h> #define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定) // コンフィギュレーション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 // 電源電圧降下常時監視機能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.5V)設定(HI) #pragma config LPBOR = OFF // 低消費電力ブラウンアウトリセット(LPBOR_OFF) #pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) // アナログ値の入力処理 unsigned int adconv() { unsigned int temp; GO_nDONE = 1 ; // PICにアナログ値読取り開始を指示 while(GO_nDONE) ; // PICが読取り完了するまで待つ temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です return temp ; } // メインの処理 void main() { unsigned int num ; OSCCON = 0b01110010 ; // 内部クロックは8MHzとする ANSELA = 0b00000000 ; // AN0-AN3は使用しない全てデジタルI/Oとする ANSELC = 0b00001000 ; // アナログはAN7を使用し、AN4-AN6は使用しないデジタルI/Oとする TRISA = 0b00000000 ; // ピン(RA)は全て出力に割当てる(RA3は入力専用) TRISC = 0b00001000 ; // RC3(AN7)だけ入力その他のピンは出力に割当てる PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // RC出力ピンの初期化(全てLOWにする) // A/Dの設定 ADCON1 = 0b10010000 ; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスに ADCON0 = 0b00011101 ; // アナログ変換情報設定(AN7から読込む) __delay_us(5) ; // アナログ変換情報が設定されるまでとりあえず待つ // PWM3の設定 RC2PPS = 0b00001110 ; // RC2(8)ピンをPWM3OUT出力に割り当てる PWM3CON = 0b11000000 ; // PWM3機能を使用する(output is active-high) PWM3DCH = 0 ; // デューティ値は0で初期化 PWM3DCL = 0 ; T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート while(1) { num = adconv() ; // 7番ピン(AN7)から半固定抵抗の値を読み込む PWM3DCH = num/4 ; // アナログ値からのデータでデューティ値を設定 } } ---------------------------------------------------------------------
RC2PPS = 0b00001110 ; // RC2(8)ピンをPWM3OUT出力に割り当てる PWM3CON = 0b11000000 ; // PWM3機能を使用する(output is active-high) PWM3DCL = 0 ; // デューティ値は0で初期化 PWM3DCH = 0 ; T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 124 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート PWM3DCH = num/4 ; この行でPWMのデューティ値を変更しています。PWM4を利用する場合は、レジスター"PWM3"の文字を"PWM4"に書き換えます。
ピン番号 | 2 | 3 | 4 | 11 | 12 | 13 |
デジタル入出力ビット名 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
アナログ入力ピン名 | AN3 | AN2 | AN1 | AN0 | ||
CCP/PWM割付レジスタ名 | RA5PPS | RA4PPS | RA2PPS | RA1PPS | RA0PPS |
ピン番号 | 5 | 6 | 7 | 8 | 9 | 10 |
デジタル入出力ビット名 | RC5 | RC4 | RC3 | RC2 | RC1 | RC0 |
アナログ入力ピン名 | AN7 | AN6 | AN5 | AN4 | ||
CCP/PWM割付レジスタ名 | RC5PPS | RC4PPS | RC3PPS | RC2PPS | RC1PPS | RC0PPS |
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.