2016-12-16 12 views
0

Я работаю над созданием ультразвукового дальномера. В настоящее время я тестирую датчик, чтобы убедиться, что он работает правильно. Я подключил эхо-штырь и триггерный штырь к PC4 и PC5 соответственно. Когда я запускаю этот код, в идеале он отправит 6 на мой экран. Тем не менее, он отображает 0. Это заставляет меня думать, что код неправильно взаимодействует с датчиком. Пожалуйста помоги.Ультразвуковой датчик в AVR

#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); 
    } 

} 

ответ

0

PINC и PORTC такие же регистр.

PORTC = 0x00; устанавливает содержимое этого регистра в 0 перед его чтением.

+0

Так как это исправить, потому что мне нужно очистить, что для того, чтобы остановить запуск? –

+2

Вам нужно будет отредактировать свой вопрос, указав тип датчика. Это HC-SR04? В этом случае вы слишком рано читаете эхо. См. Временную диаграмму. Запустить импульс; дождитесь отправки импульса; Время, когда длина штыря высока. Вы читаете штифт перед отправкой импульсов. Вот почему он по-прежнему низкий. Для этого датчика доступно множество учебников и примеров кода. У Sparkfun есть простой код для Arduino, который вы можете адаптировать, а также техническое описание. – UncleO

0

Я не знаю, какой ультразвуковой датчик вы использовали. Но я предполагал, что это потому, что вы не дождались, пока датчик не получит сигнал эха. На основании ультразвукового датчика я когда-либо использовал, SRF04, имеет временную диаграмму, как это:

enter image description here

я изменить свой код, он будет иметь возможность печатать «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 
}