Страница 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
}