
左図は18F25K22での配線図ですが、
---------------------------------------------------------------------
#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)
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.