Консультация № 185455
16.02.2012, 22:02
0.00 руб.
0 5 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Как по считать время между двумя событиями? Используется микроконтроллер AVR ATMega 16. Необходимо осуществить счетчик через таймер. При нажатии на кнопку, подключенную к Int0 запустить и при нажатии на другую Int1 - остановить.
Время необходимо отсчитывать в микросекундах
Диапазон измерения времени 1миллисек-1сек.
Помогите пожалуйста написать машинный си код для данного счетчика.

Обсуждение

Неизвестный
16.02.2012, 22:12
общий
это ответ
Здравствуйте, Дебелов Владимир Валентинович!
Если использовать встроенный генератор на 8 MHz, то на C как-то так:

Код:

volatile unsigned long latch=0;

ISR(INT0_vect)
{
if(TCCR==0)//debounce
{
TCNT0=0;
//start timer 0
TCCR0=0x02;//clkio/8
}
}

ISR(INT1_vect)
{
if(TCCR!=0)//debounce
{
//stop timer
TCCR0=0;
latch|=TCNT0;
}
}

ISR(TIMER0_OVF_vect)
{
latch+=0x100;
}

void main()
{
....

MCUCR&=0xf0;
//falling edge will trigger interrupts
MCUCR|=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);
//enable interrupts
GICR|=(1<<INT0)|(1<<INT1);
TIMSK|=(1<<TOIE0);

....



Корректное значение в latch будет не сразу после прерывания INT1, так как в очереди может стоять прерывание по переполнению таймера.
Длительность должна измеряться достаточно точно в пределах от примерно 30 микросекунд (надо считать инструкции, чтобы оценить точнее)и до 4294967295 микросекунд, так как задержки до старта таймера/захвата значения должны получиться одинаковыми.
Можно использовать и другой таймер, но с 16-битным задержка при чтении будет немного больше.
5
Спасибо! Начинаю понемногу разбираться в работе внешних прерываний с вашей помощью
давно
Мастер-Эксперт
680
2811
16.02.2012, 22:47
общий
мини-форум вопроса
Прикрепленные файлы:
bb6ce7ce0e75c40f76c4f0e79b968299.rar
Неизвестный
19.02.2012, 20:49
общий
Здравствуйте, vladisslav!
Спасибо за помощь в написании кода
Напишите пожалуйста комментарий к коду
Какой оператор что делает, не могу разобраться.
Неизвестный
19.02.2012, 23:30
общий
Если необходима очень высокая точность. то просто считывайте состояние пинов в обработчике прерывания таймера!!! И время съэкономите и размер кода. А главное не будет возникать вопроса с приоритетом прерывания.
Неизвестный
20.02.2012, 21:02
общий
Приведите пожалуйста пример кода для ATmega16
Как это делается объясните пожалуйста?
Форма ответа