Atmega8 использование HC-SR05 без прерываний

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Использую мегу8, не могу использовать прерывания int0 и int1, как читать длину импульса с датчика?
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Захват от таймера и это лучше int.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3510365#p3510365"]Захват от таймера[/uquote]
Как это реализовать?
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Я не очень по-русски выразился :oops: .
Почитайте про режимы таймера, в частности режим захват.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Не фурычит, вот так инициализирую

Код: Выделить всё

DDRB |= (1<<DDRB1);
TCCR1B |= (1<<ICNC1)|(1<<CS11)|(1<<CS10);
TIMSK |= (1<<TICIE1);
sei();
Вот так отлавливаю

Код: Выделить всё

ISR(TIMER1_CAPT_vect)
{
	static int tickStart = 0, tickFinish = 0;
	if(tickStart == 0)
		tickStart = ICR1;
	else
	{
		tickFinish = ICR1;
		pulse = (tickFinish-tickStart)*4; // tick = 0.000004s = 0.004ms = 4us
		tickFinish = tickStart = 0;
		cli();
	}
}
То есть в pulse должно лежать сколько микро секунд был импульс, но датчик вообще не адекватно работает, хотя на осциллографе всё вроде как хорошо
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Код: Выделить всё

#define MAX_PULSE 1000 /* тут надо указать предельно возможную длительность импульса в тиках таймера */
ISR(TIMER1_CAPT_vect){
   static unsigned int tickStart, tickFinish;
   tickFinish = ICR1;
   pulse = tickFinish-tickStart; 
   if(pulse > MAX_PULSE) pulse = 0x10000-pulse;
   pulse *= 4;// tick = 0.000004s = 0.004ms = 4us
   tickStart = tickFinish;
}
первый "замер", естественно, даст ошибочный результат, все последующие - правильный.

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

daaar
PB0/ICP1- лапа для захвата. Не понимаю в этих кыржиках, но не вижу настройки захвата на фронт в начале импульса и захват спада импульса в конце переключением бита ICES1 регистра TCCR1B
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

Проще было поставить мегу 328, что и сделал
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Там же никаких глобальных отличий в плане архитектуры
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 920
Зарегистрирован: Пн июн 13, 2016 19:37:24
Откуда: Perm

Сообщение daaar »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3516515#p3516515"]Там же никаких глобальных отличий в плане архитектуры[/uquote]
Есть общее прерывание для ножек PCINT с ним жить проще
Контактная информация:
Ответить

Вернуться в «AVR»