Ультразвуковой датчик в AVR
Я работаю над созданием детектора ультразвукового диапазона. В настоящее время я проверяю датчик, чтобы убедиться, что он работает нормально. Я подключил контакт эха и триггера к ПК4 и ПК5 соответственно. Когда я запускаю этот код, в идеале он отправляет 6 на мой дисплей. Тем не менее, он отображает 0. Это приводит меня к мысли, что код неправильно взаимодействует с датчиком. Пожалуйста помоги.
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void DisplayIt(int i);
int main(void)
{
while(1)
{
DDRC = 0xFF;
int i = 0;
PORTC = 0b00000000;
_delay_us(2);
PORTC = 0b00100000;
_delay_us(10);
PORTC = 0x00;
DDRC = 0x00;
if (PINC == 0b00010000)
{
i = 6;
}
DisplayIt(i);
}
}
2 ответа
Я не знаю, какой ультразвуковой датчик вы использовали. Но я предположил, что это потому, что вы не подождали, пока датчик не получит эхо-сигнал. Основанный на ультразвуковом датчике, который я когда-либо использовал, SRF04, он имеет временную диаграмму:
Я изменяю ваш код, чтобы он мог печатать "6", когда датчик обнаружит перед ним объект (который мы знаем по прибытию эхо-сигнала).
Вот код:
while(1) {
DDRC = 0xFF; // Configure all Port C pins as an output
int i = 0;
PORTC = 0b00100000; // Write 1 (high) to PORTC.5 (trigger pin)
_delay_us(10); // Keep PORTC.5 to give high signal output for 10us
PORTC = 0x00; // Write 0 (low) to PORTC.5
// The code above completes Trigger Input To Module (see Timing Diagram image)
DDRC = 0x00; // Configure all Port C pins as an input
while (PINC.4 == 0); // Wait until PINC.4 (echo pin) has 1 (high) value
if(PINC.4 == 1) i = 6; // Once PINC.4 is high, while loop will break and this line will be executed
DisplayIt(i);
_delay_ms(10); // Allow 10ms from End of Echo to Next Trigger Pulse
}
PINC
а также PORTC
один и тот же регистр.
PORTC = 0x00;
устанавливает содержимое этого регистра на 0 непосредственно перед тем, как вы его прочитаете.