Вычитание целых чисел, от меньшего отнимаем большее

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
forgid
Родился
Сообщения: 15
Зарегистрирован: Вт фев 16, 2010 15:50:00

Вычитание целых чисел, от меньшего отнимаем большее

Сообщение forgid »

Есть кусок кода определение длительности импульса с помощью 16бит счетчика

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

unsigned int x, y,z;
unsigned int time;
ISR (TIMER1_CAPT_vect)
{ z=ICR1;
        if(bit_is_set(PIND, PD4))
	{
	   x = z;          
		TCCR1B &= ~(1<<ICES1);  		
	}
	else                   
	{
	    y = z;         
		TCCR1B |= (1<<ICES1);   
		time = (y-x);
	}	
корректно ли вычислять длительность простым вычитанием из начального значения счетчика конечного ?
ведь может получится что y>x , а так же может быть X до переполнения а Y после переполнения .
Последний раз редактировалось forgid Чт апр 10, 2014 13:29:37, всего редактировалось 1 раз.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение pyzhman »

Это забота программиста, писавшего приведенный код. Сдирайте думая. :)) Вы бы хоть тэги подправили что-ли.
Docendo discimus
Реклама
forgid
Родился
Сообщения: 15
Зарегистрирован: Вт фев 16, 2010 15:50:00

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение forgid »

теги остались мои, с другого форума свое сообщение скопировал не перепроверил.
програмист написал другой код , я убрал то что мне не нужно , но теперь загвоздка что будет в перемменой Z если второе значение счетчика будет после переполнения,тоисть меньше первого , напрмер 0x00AA-0x00FD=0xFFAD или 0x00AA-0x00FD=0x0053 и флаг C=1
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25259
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение КРАМ »

Преодолеть переполнение счетчика несложно, если результат вычитания отрицательный - нужно инвертировать биты и прибавить единицу (или просто найти дополнение).
Проблема только в том, что при интервале счета более половины разрядности счетчика получится ошибка....
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение zero648 »

А если будет не одно переполнение, а больше, нужна переменная - счетчик переполнений.
Реклама
forgid
Родился
Сообщения: 15
Зарегистрирован: Вт фев 16, 2010 15:50:00

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение forgid »

16 бит счетчика в два раза больше необходимого , так что не будет превышать
Реклама
Аватара пользователя
c2n
Сверлит текстолит когтями
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара
Контактная информация:

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение c2n »

пишется же на Си?.

Используйте переменную типа int или даже long int - тип знаковый, он понимает +/-.
Соответственно, если вы получаете отрицательное значение, то скорее всего было переполнение.

Так же есть регистр в АВРке, (не помню какой) но там флаг отрицательного числа имеется.

я бы в таймере инкрементил бы некоторую переменную... по каждому тику... только в этом случае нужно иметь ввиду, что на инкремент может уходить 2(и более) такта ЦП. Тут прийдется с логическим анализатором потыкать.

А вобще для подобного рода задач - есть устройство - Часы реального времени. Посмотрите в эту сторону, опрос хоть SPI, хоть i2c(TWI)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Вычитание целых чисел, от меньшего отнимаем большее

Сообщение urry »

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

        unsigned long l;
	if(!strCapt.iOverT1)
	{
		l=iE-iB; //если переполнения не было, вычитаем от конечного начальный 
	}
	else
	{
		l=65536-iB; // иначе получаем количество импульсов до переполнения
		l+=iE;  // складываем с конечным 
		strCapt.iOverT1--;  // уменьшаем количество переполнений на 1 
		l+=strCapt.iOverT1*65536; // к результату добавляем количество переполнений, умноженное на 65536
	}

Ответить

Вернуться в «Разные вопросы по МК»