我正在使用带有AVR ATmega32A的超声波测距/声纳传感器(HCSR-04)。我已经编写了代码,了解了传感器如何工作的概念,但是虽然程序编译正确,但设备并没有给出任何结果。
液晶显示屏显示超出范围"这意味着PINC1并不高。我的方法是检查一个位是高还是低正确?我应该使用bit_is_set(PORTC,PINC1)
功能吗?我使用的默认频率为1 MHz。 PINC0连接到trig,PINC1是回声输入。这是代码:
#include<avr/io.h>
#include<util/delay.h>
#include"lcd.h"
int main(void){
ini_lcd();
TCCR1B|=1<<CS10;
DDRC|=1<<PINC0;
int a=0,b=0;
while(1){
TCNT1=0;
PORTC|=1<<PINC0;
while(TCNT1<100);
PORTC&=~(1<<PINC0);
TCNT1=0;
while(!(PORTC&(1<<PINC1))) && TCNT1<30000) ; // checking if echo has become high and not exceeding the time for max range i.e 5 m
///send_string("out");
b=TCNT1;
if(b<30000){
TCNT1=0;
while(PORTC&(1<<PINC1)); // waiting until the echo become low again
a=TCNT1;
go_to_pos(1,5);
send_int(a/58);
} else {
go_to_pos(1,5);
send_string("out of range");
}
_delay_ms(20);
}
}
答案 0 :(得分:1)
我在代码中看到的重复几次的主要问题是你是如何尝试读取输入I / O行的,例如:
while(PORTC&(1<<PINC1)); // waiting until the echo become low again
应该成为:
while(PINC&(1<<PINC1)); // waiting until the echo become low again
PORT
寄存器是输出锁存器,将包含写入它们的最后一个值或上电默认值为零。您需要使用PIN
寄存器来读取I / O引脚的当前状态。
答案 1 :(得分:0)
当检查Echo引脚时,你需要在TCNT1 = 300000而不是30000时进行滴答计数,因为你的时钟是1000000 HZ然后每个0.1us TCNT1增加1所以300000滴答你得到30000 us(等待时间)等于回波在5米处返回所需的时间(HCSR04的最大范围)