本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

締切済み
※ ChatGPTを利用し、要約された質問です(原文:PIC12F675、HC-SR04のプログラム)

PIC12F675、HC-SR04のプログラム

2023/10/20 08:22

このQ&Aのポイント
  • PIC12F675にプログラムを書き込み、HC-SR04の距離が5cm以下の時にブザーが鳴るようにしたいです。
  • 現在のプログラムでは、距離に関わらず出力が一定になっています。
  • プログラムに間違いがあれば教えていただけませんか。
※ 以下は、質問の原文です

PIC12F675、HC-SR04のプログラム

2020/03/17 12:00

PIC12F675にプログラムをMPLABX IPEで書き込んで、超音波センサ HC-SR04の距離が5cm以下の時にブザーが鳴る(出力が5Vになる)ようにしたいです。
以下のプログラムで出力は、距離に関わらず5Vか0Vで一定になっています。
プログラムに間違いがあれば、教えていただけないでしょうか。

#include <xc.h>
#include <stdio.h> //12F675
#include <stdlib.h>

#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)

#define _XTAL_FREQ 32000000

#define TX_UART_SIZE 3

#define SONIC_TRIG GPIO5
#define SONIC_ECHO GPIO4
#define SONIC_TEMP GPIO2
#define SONIC_BUZZ GPIO1

#define IO_OFF 0
#define IO_ON 1

#define TIME_OFF -1
#define TIME_UP 0
#define TIME_START_H 0xD8
#define TIME_START_L 0xF0
#define TIME_LED_CNT_MAX 5
#define TIME_LED_CNT2_MAX 15

unsigned char cnt10ms;
char TimerLed1;
char TimerLed2;

int main(int argc, char** argv)
{
long echo_time;
long dist;

OSCCAL = 0b00110000 ; // 内部クロック8MHz

ANSEL = 0x00 ; // AN未使用、デジタルI/Oに割当てる
CMCON = 0x07; // コンパレータ未使用
TRISIO = 0b00011100 ; // RA2,3,4を入力にし、他は出力に割当てる
GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)

T1CON = 0b01110000 ; // ゲート有効、Hiでカウント、単一パルス、T1Gピン
TMR1ON = 1; // タイマー1開始
while(1)
{
// タイマ1のカウンタ準備
TMR1 = 0; // カウンタの初期化TMR1 = 0;
// トリガ送信
SONIC_TRIG = IO_ON;
__delay_us( 10 );
SONIC_TRIG = IO_OFF;

// エコー信号のON待ち
while( SONIC_ECHO == IO_OFF )
{

}

// エコー信号のOFF待ち
while( SONIC_ECHO == IO_ON )
{

}

// 超音波の往復時間を取得
echo_time = TMR1;

// 往復時間から片道の時間にする
echo_time /= 2;

// パルス時間から距離(cm)に変更
dist = echo_time * 34 / 1000;

if( dist <= 5 ) //距離5cm以下でブザー出力
{

(SONIC_BUZZ = 1);

}
else
{
(SONIC_BUZZ = 0);
}

__delay_ms( 1000 );
}

return (EXIT_SUCCESS);
}

回答 (2件中 1~2件目)

2020/03/18 15:46
回答No.2

PICに接続される外部回路が分からないので、
内部のみに関して見れば、クロックに関する
設定などが何か所か間違っていると思います。
・PIC12F675の内部クロックは4MHz固定で
 ないのか。
・それなのに距離計算は32MHzクロック想定
 のままでよいのか。
etc....

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。