今回使用するピン番号は、
16F1827は右上が1番ピンでNJM4580Dは左下が1番ピンです。
センサーはブレッドボードには刺さりません、なので、左図の様な物を作りました。
---------------------------------------------------------------------
#include <xc.h>
#include "skMonitorLCD.h"
#define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定)
#define TIME_OVER 30000 // 超音波センサーから無返答時のタイムアウト時間(30ms)
#define T1COUT 35536 // タイマー1用カウントの初期値(65536-30000:30msカウント)
unsigned int UMS_info ;
// コンフィギュレーション1の設定
#pragma config FOSC = INTOSC // 内部クロックを使用する(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF)
// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
// 割り込みの処理
void interrupt InterFunction( void )
{
// コンパレータ関連の割込み処理
// センサーから返答があった場合の処理(物体からの反射有り)
if (C2IF == 1) {
TMR1ON = 0 ; // TMR1カウント停止
UMS_info = TMR1L ; // カウント値を記録する
UMS_info = UMS_info | (TMR1H << 8) ;
UMS_info = UMS_info - T1COUT ;
TMR1H = (T1COUT >> 8) ; // カウント値の再設定
TMR1L = (T1COUT & 0x00ff) ;
C2IF = 0 ; // コンパレータ割込フラグをリセット
}
// タイマー1の割込み処理
// センサーから返答がない場合の処理(物体からの反射がない、近くに物体が無い)
if (TMR1IF == 1) {
TMR1ON = 0 ; // TMR1カウント停止
UMS_info = TIME_OVER ; // カウント値は時間切れ
TMR1H = (T1COUT >> 8) ; // カウント値の再設定
TMR1L = (T1COUT & 0x00ff) ;
TMR1IF = 0 ; // タイマー1割込フラグをリセット
}
}
// 超音波センサーから距離を読込む処理
// temp:現在の温度を設定する correction:距離補正
int UsonicMeasurRead(int temp,int correction)
{
unsigned long t ;
int ans ;
ans = 0 ;
// 超音波センサーの送信側に40KHzPWM信号を200us出力を行う
TMR4ON = 1 ; // TMR4(PWM)スタート
__delay_us(200) ;
TMR4ON = 0 ; // TMR4(PWM)ストップ
// 超音波センサーの受信側からの返答を待つ
TMR1ON = 1 ; // TMR1カウント開始
UMS_info = 0 ;
while(UMS_info == 0) ; // 反射波の受信を待つ
// 返答時間から距離を求める
if (UMS_info < TIME_OVER) {
t = 331500 + (600 * temp) ; // 音波の伝搬する速度を求める
t = (t * UMS_info) / 1000000 ;// 距離の計算
ans = t / 2 ; // 往復なので÷2
ans = ans + correction ; // 距離の補正値を加える
}
return ans ; // mmの距離を返す
}
// メインの処理関数
void main()
{
int val ;
OSCCON = 0b01110010 ; // 内部クロックは8MHzとする
ANSELA = 0b00000010 ; // AN0-AN4はAN1のみ使用、他は全てデジタルI/Oとする
ANSELB = 0b00000000 ; // AN5-AN11は使用しない全てデジタルI/Oとする
TRISA = 0b00000010 ; // ピン(RA)はRA1のみ入力、他は全て出力に割当てる(RA5は入力専用)
TRISB = 0b00000000 ; // ピン(RB)は全て出力に割当てる
PORTA = 0b00000000 ; // RA出力ピンの初期化(全てLOWにする)
PORTB = 0b00000000 ; // RB出力ピンの初期化(全てLOWにする)
// 反射波時刻カウント用タイマー1の設定(1カウントは1us)
T1CON = 0b01110000 ; // クロックソースはFosc、プリスケーラ1/8、
TMR1H = (T1COUT >> 8) ;// 30000(30ms)までカウントさせる
TMR1L = (T1COUT & 0x00ff) ;
TMR1IF = 0 ; // TIMER1のフラグを0にする
TMR1IE = 1 ; // TIMER1の割込みを許可する
// PWMの設定(CCP2でシングル出力:タイマー4使用)
CCP2CON = 0b00001101 ; // PWM機能(シングル出力:相補を行う)を使用
CCP2SEL = 0 ; // P2Aは12番ピンのRB6を使用する
P2BSEL = 0 ; // P2Bは13番ピンのRB7を使用する
PSTR2CON= 0b00000011 ; // P2AをPWM出力する、P2Bは反転出力
CCPTMRS = 0b00000100 ; // ECCP2機能はTimer4を使用する
T4CON = 0b00000000 ; // TMR4プリスケーラ値を1倍に設定
CCPR2L = 24 ; // デューティ値はは50%ほどで初期化
CCPR2H = 0 ;
TMR4 = 0 ; // タイマー4カウンターを初期化
PR4 = 49 ; // PWMの周期を設定(40KHzで設定)
// DACの設定(約2.0Vをコンパレータの閾値とする)
DACCON0 = 0b11000000 ; // VDD/VSSを使用、DACOUTピン(RA2)使わない
DACCON1 = 13 ; // 約2.0Vを出力( 5V*(13/2^5)=2.03125 )
// コンパレータ2の設定(割込みで利用)
CM2CON0 = 0b10010110 ; // −>+でON、高速モード、出力は反転、ヒステリシス有効
CM2CON1 = 0b10010001 ; // 立上りで割込み利用、+はDAC入力、−はRA1から入力
C2IF = 0 ; // コンパレータ2割込フラグを0にする
C2IE = 1 ; // コンパレータ2割込みを許可する
// 周辺装置全体の割り込みを許可
PEIE = 1 ; // 周辺装置割り込み有効
GIE = 1 ; // 全割込み処理を許可する
// LCDモニターに送信出来る様に初期化する
MonitorInit() ;
while(1) {
// LCDモニター画面の消去を行う
MonitorPutc(0x11) ;
MonitorPuts(" ") ;
MonitorPutc(0x11) ;
// 20℃と言う事でセンサーから距離を読込む、20mm程誤差が有るので足して置く
val = UsonicMeasurRead(20,20) ;
// モニターにcmで表示を行う
MonitorPutd((unsigned char)(val/10)) ;
MonitorPuts("cm") ;
// 1秒後に繰り返す(連続で行う場合でも最低50msは空ける事)
__delay_ms(1000) ;
}
}
---------------------------------------------------------------------
CコンパイルとPIC書き込みを実行して下さい。
MPLAB X用に記事変更(*3) 2015/10/10
回路図の追加(*2) 2014/02/06
"skMonitorLCD.c"変更によりサンプルプログラム変更(*1) 2014/02/01
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.