Страница 1 из 1

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

Добавлено: Ср апр 09, 2014 16:37:36
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 после переполнения .

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

Добавлено: Ср апр 09, 2014 18:14:43
pyzhman
Это забота программиста, писавшего приведенный код. Сдирайте думая. :)) Вы бы хоть тэги подправили что-ли.

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

Добавлено: Чт апр 10, 2014 13:35:47
forgid
теги остались мои, с другого форума свое сообщение скопировал не перепроверил.
програмист написал другой код , я убрал то что мне не нужно , но теперь загвоздка что будет в перемменой Z если второе значение счетчика будет после переполнения,тоисть меньше первого , напрмер 0x00AA-0x00FD=0xFFAD или 0x00AA-0x00FD=0x0053 и флаг C=1

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

Добавлено: Чт апр 10, 2014 13:44:50
КРАМ
Преодолеть переполнение счетчика несложно, если результат вычитания отрицательный - нужно инвертировать биты и прибавить единицу (или просто найти дополнение).
Проблема только в том, что при интервале счета более половины разрядности счетчика получится ошибка....

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

Добавлено: Чт апр 10, 2014 19:06:25
zero648
А если будет не одно переполнение, а больше, нужна переменная - счетчик переполнений.

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

Добавлено: Пт апр 11, 2014 12:19:24
forgid
16 бит счетчика в два раза больше необходимого , так что не будет превышать

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

Добавлено: Ср июл 09, 2014 13:18:11
c2n
пишется же на Си?.

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

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

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

А вобще для подобного рода задач - есть устройство - Часы реального времени. Посмотрите в эту сторону, опрос хоть SPI, хоть i2c(TWI)

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

Добавлено: Ср июл 09, 2014 16:53:39
urry

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

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