2015-12-26 2 views
0

Я пытаюсь понять, как использовать таймеры с моим ATMEGA168A, однако пример, который у меня есть (link), похоже, не работает, так как он возвращает 0 все время.ATMEGA168A - Использование таймера

Моя идея - сделать работу ультразвукового датчика HC-SR04 (link).

#define F_CPU 1000000UL 
#include <avr/io.h> 
#include <util/delay.h> 

long measure(){ 
    //Setting up the timer 
    TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10); 

    //Setting trigger as output 
    DDRD |= (1 << PD1); 

    //Setting echo as input 
    PORTD |= (1 << PD2); 

    //Triggering the hardware 
    PORTD ^= (1 << PD1); 
    _delay_us(10); 
    PORTD ^= (1 << PD1); 

    //Waiting until echo goes low 
    TCNT1 = 0; 
    while(bit_is_clear(PIND, PD2)); 
    long timer_value = TCNT1; 

    //Calculating and returning the distance 
    long distance = timer_value/58.82; 
    return distance; 
} 

Как я могу успешно измерить время, в течение которого PD2 был высоким?

+1

Каким образом это, кажется, не работает? Сбой? Неправильное время? Не начинается? Ловит огонь? –

+1

Вы уверены, что для таймера установлен тактовый сигнал? – MikeCAT

ответ

0

Чтобы измерить время, в течение которого PD2 был высоким, напишите некоторый код, чтобы сделать это, скомпилируйте, запишите его на свой микроконтроллер и включите его.

Не тестировался, попробуйте следующее:

#define F_CPU 1000000UL 
#include <avr/io.h> 
#include <util/delay.h> 

long measure(){ 
    //Setting up the timer 
    TCCR1B |= (1 << CS12) | (1 << CS11) | (1 << CS10); 

    //Setting trigger as output 
    DDRD |= (1 << PD1); 

    //Setting echo as input 
    PORTD |= (1 << PD2); 

    //Triggering the hardware 
    PORTD ^= (1 << PD1); 
    _delay_us(10); 
    PORTD ^= (1 << PD1); 

    //Waiting until echo goes low (after Initiate) 
    while(!bit_is_clear(PIND, PD2)); 
    //Waiting until echo goes high (Echo back starts) 
    while(bit_is_clear(PIND, PD2)); 
    TCNT1 = 0; 
    //Waiting until echo goes low (Echo back ends) 
    while(!bit_is_clear(PIND, PD2)); 
    long timer_value = TCNT1; 

    //Calculating and returning the distance 
    long distance = timer_value/58.82; 
    return distance; 
} 
+0

Спасибо, Майк. К сожалению, «while (! Bit_is_clear (PIND, PD2)); это бесконечный цикл – Bob

+0

Я написал два 'while (! bit_is_clear (PIND, PD2));'. Что ты имеешь в виду? – MikeCAT

+0

Первый уже Mike – Bob