--------------------------------------------------------------------- #include <xc.h> #define _XTAL_FREQ 16000000 // delay用に必要(クロック16MHzを指定) // コンフィギュレーションの設定(ここの記述に無い設定はデフォルト値での動作) // 外部クロックは使用しない(PRICLKEN_OFF) // 動作クロックを4倍では動作させない(PLLCFG_OFF):内部部クロックを使用する(INTIO67) #pragma config PRICLKEN=OFF,PLLCFG=OFF,FOSC=INTIO67 // CONFIG1H // 電源電圧降下常時監視機能ON(BOREN_NOSLP):監視電圧は(2.85V)に設定 // 電源ONから後65.6msにプログラムを開始する(PWRTEN_ON) #pragma config BOREN=NOSLP,BORV=285,PWRTEN=ON // CONFIG2L // ウオッチドッグタイマー無し(WDTEN_OFF) #pragma config WDTEN=OFF // CONFIG2H // 外部リセット信号は使用せずにデジタル入力(RE3)ピンとする(MCLRE_INTMCLR) // オシレータが安定するのを待ってシステムクロックを供給する(HFOFST_OFF) #pragma config MCLRE=INTMCLR,HFOFST=OFF // CONFIG3H // 低電圧プログラミング機能使用しない(LVP_OFF) #pragma config LVP=OFF // CONFIG4L // 指定した時間(num x 10ms)だけウエイトを行う処理関数 void Wait(unsigned int num) { int i ; // numで指定した回数だけ繰り返す for (i=0 ; i < num ; i++) { __delay_ms(10) ; // 10msプログラムの一時停止 } } // メインの処理 void main() { OSCCON = 0b01110010 ; // 内部クロックとする(16MHz) ANSELA = 0b00000000 ; // AN0-4 アナログは使用しない、デジタルI/Oに割当 ANSELB = 0b00000000 ; // AN8-13アナログは使用しない、デジタルI/Oに割当 ANSELC = 0b00000000 ; // AN14-19アナログは使用しない、デジタルI/Oに割当 TRISA = 0b00000000 ; // RA0-RA7全て出力に設定、1で入力 0で出力 TRISB = 0b00000000 ; // RB0-RB7全て出力に設定 TRISC = 0b00000000 ; // RC0-RC7全て出力に設定 PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) PORTB = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) while(1) { LATB0 = 1 ; // 21番ピン(RB0)にHIGH(5V)を出力する(LED ON) Wait(100) ; // 1秒ウエイト LATB0 = 0 ; // 21番ピン(RB0)にLOW(0V)を出力する(LED OFF) Wait(100) ; // 1秒ウエイト } } ---------------------------------------------------------------------AコンパイルとPIC書き込みを実行して下さい。 *1)
--------------------------------------------------------------------- #include <xc.h> #define _XTAL_FREQ 16000000 // delay用に必要(クロック16MHzを指定) // コンフィギュレーションの設定(ここの記述に無い設定はデフォルト値での動作) // 外部クロックは使用しない(PRICLKEN_OFF) // 動作クロックを4倍では動作させない(PLLCFG_OFF):内部部クロックを使用する(INTIO67) #pragma config PRICLKEN=OFF,PLLCFG=OFF,FOSC=INTIO67 // CONFIG1H // 電源電圧降下常時監視機能ON(BOREN_NOSLP):監視電圧は(2.85V)に設定 // 電源ONから後65.6msにプログラムを開始する(PWRTEN_ON) #pragma config BOREN=NOSLP,BORV=285,PWRTEN=ON // CONFIG2L // ウオッチドッグタイマー無し(WDTEN_OFF) #pragma config WDTEN=OFF // CONFIG2H // 外部リセット信号は使用せずにデジタル入力(RE3)ピンとする(MCLRE_INTMCLR) // オシレータが安定するのを待ってシステムクロックを供給する(HFOFST_OFF) #pragma config MCLRE=INTMCLR,HFOFST=OFF // CONFIG3H // 低電圧プログラミング機能使用しない(LVP_OFF) #pragma config LVP=OFF // CONFIG4L // アナログ値の変換と読込み処理 unsigned int adconv() { unsigned int temp; GO_nDONE = 1 ; // アナログ値読取り開始指示 while(GO_nDONE) ; // 読取り完了まで待つ temp = ADRESH ; temp = ( temp << 8 ) | ADRESL ; return temp ; } // メインの処理 void main() { unsigned int num ; OSCCON = 0b01110010 ; // 内部クロックとする(16MHz) ANSELA = 0b00000000 ; // AN0-4 アナログは使用しない、デジタルI/Oに割当 ANSELB = 0b00000000 ; // AN8-13アナログは使用しない、デジタルI/Oに割当 ANSELC = 0b00001000 ; // AN14-19アナログは使用しない、AN15のみアナログで使用 TRISA = 0b00000000 ; // RA0-RA7全て出力に設定、1で入力 0で出力 TRISB = 0b00000000 ; // RB0-RB7全て出力に設定 TRISC = 0b00001000 ; // RC3のみ入力、それ以外RC0-RC7は出力に設定 PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) PORTB = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) PORTC = 0b00000000 ; // 出力ピンの初期化(全てLOWにする) // アナログ入力の設定 ADCON1 = 0b00000000 ; // VDDをリファレンスとする ADCON2 = 0b10010101 ; // 読取値は右寄せ、A/D変換クロックはFOSC/16、4TAD後に変換開始 ADCON0 = 0b00111101 ; // アナログ変換情報設定(AN15から読込む) __delay_us(8) ; // アナログ変換情報が設定されるまでとりあえず待つ // CCP4(PWM)の設定 CCPTMRS1 = 0b00000000 ; // CCP4機能はTimer2を使用する CCP4CON = 0b00001100 ; // PWM機能(モジュール)を使用する T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 CCPR4L = 0 ; // デューティ値は0で初期化 CCPR4H = 0 ; TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 249 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート while(1) { num = adconv() ; // 14番ピン(AN15)から半固定抵抗の値を読み込む CCPR4L = num/4 ; // アナログ値からのデータでデューティ値を設定 } } ---------------------------------------------------------------------AコンパイルとPIC書き込みを実行して下さい。 *1)
LEDには極性が有ります、
CCPTMRS1 = 0b00000000 ; // CCP4機能はTimer2を使用する CCP4CON = 0b00001100 ; // PWM機能(モジュール)を使用する T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定 CCPR4L = 0 ; // デューティ値は0で初期化 CCPR4H = 0 ; TMR2 = 0 ; // タイマー2カウンターを初期化 PR2 = 249 ; // PWMの周期を設定(1000Hzで設定) TMR2ON = 1 ; // TMR2(PWM)スタート CCPR4L = num/4 ; // アナログ値からのデータでデューティ値を設定尚、CCP5でTimer4を使用する場合は
CCPTMRS1 = 0b00000100 ; // CCP5機能はTimer4を使用する CCP5CON = 0b00001100 ; // PWM機能を使用する T4CON = 0b00000010 ; // TMR4プリスケーラ値を16倍に設定 CCPR5L = 0 ; // デューティ値は0で初期化 CCPR5H = 0 ; TMR4 = 0 ; // タイマー4カウンターを初期化 PR4 = 249 ; // PWMの周期を設定(1000Hzで設定) TMR4ON = 1 ; // TMR4(PWM)スタート CCPR5L = num/4 ; // アナログ値からのデータでデューティ値を設定なのでぇ、CCP4とCCP5を2個同時に使用可能ですね。
ピン番号 | 9 | 10 | 7 | 6 | 5 | 4 | 3 | 2 |
デジタル入出力ビット名 | RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
アナログ入力ピン名 | AN4 | AN3 | AN2 | AN1 | AN0 | |||
PWM 出力ピン名 | CCP5 |
ピン番号 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 |
デジタル入出力ビット名 | RB7 | RB6 | RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
アナログ入力ピン名 | AN13 | AN11 | AN9 | AN8 | AN10 | AN12 | ||
PWM 出力ピン名 | CCP4 |
ピン番号 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 |
デジタル入出力ビット名 | RC7 | RC6 | RC5 | RC4 | RC3 | RC2 | RC1 | RC0 |
アナログ入力ピン名 | AN19 | AN18 | AN17 | AN16 | AN15 | AN14 |
リンクの見直し(*1) 2017/01/13
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.