Как в Си определить выход за приделы кода (переполнение) результата операции ?
24.04.2013, 00:30
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
А если так
|
Код:
|
sumADC+=temp16;
if (sumADC‹temp16) |
Я думаю Yurkin2007 это имел в виду.
|
|
|
|
24.04.2013, 00:44
|
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от alvadep
|
|
Я думаю Yurkin2007 это имел в виду.
|
Не, совсем не так.
Но можно и так, как Вы предлагаете. Вот, интересно, что при переполнении результат получается меньше, чем до сложения! Тогда проверка может быть такой
|
Код:
|
temp16 += sumADC; // новая сумма
if(sumADC›temp16)// сравнение старого и нового результата
{
// произошло переполнение
// Отключение АЦП !! И сохраняем неиспорченную сумму sumADC
ADCSRA=(1‹‹ADEN);
}
else
{
sumADC=temp16;//переполнения не было, кладём новую сумму в накопление
} |
|
|
|
|
24.04.2013, 02:42
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от MaxiMuz79
|
Ara41, Спасибо !
похоже сделать чтото приличнее этого в avr-gcc неудастся
|
И что в этом способе приличного? У вас наверное какие-то свои правила приличия...
Непонятен смысл такого кода.
|
Код:
|
uint16_t temp16;
uint16_t sumADC;
if ((sumADC+=temp16)›0xffff)
{ // Отключение АЦП !!
ADCSRA=(1‹‹ADEN);} |
Возможно, лучше будет суммировать так, чтобы переполнения не возникало?
|
Код:
|
AdcSum+=ADC;
if (++AdcSumCnt›=64) {
AdcSumCnt=0;
OffAdc();
UpdateResult();
} |
К тому же, если суммировать пока не переполнится, то как узнать среднее значение АЦП? Поделить полученную сумму на количество отсчетов? Так это ещё деление. Или задача другая?
P.S.
|
Код:
|
// Отключение АЦП !!
ADCSRA=(1‹‹ADEN);} |
?
Или
|
Код:
|
// Отключение АЦП !!
ADCSRA=(0‹‹ADEN);} |
?
Последний раз редактировалось _Артём_; 24.04.2013 в 02:47.
|
|
|
|
24.04.2013, 04:39
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от _Артём_
|
Или
Код:
// Отключение АЦП !!
ADCSRA=(0‹‹ADEN);}
?
|
Ну, тогда уж так:
|
Код:
|
// переключаем АЦП !!
ADCSRA^=(1‹‹ADEN);
//################
//или просто выключаем АЦП
ADCSRA&=~(1‹‹ADEN); |
|
|
|
|
24.04.2013, 04:59
|
|
|
Прописка
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от _Артём_
|
|
К тому же, если суммировать пока не переполнится, то как узнать среднее значение АЦП? Поделить полученную сумму на количество отсчетов? Так это ещё деление. Или задача другая?
|
Надо просто после каждого удачного суммирования сдвигать полученную сумму направо.
Последний раз редактировалось electroTrash; 24.04.2013 в 05:28.
|
|
|
|
24.04.2013, 08:10
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,550
Сказал спасибо: 384
Сказали Спасибо 735 раз(а) в 416 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от electroTrash
|
|
Надо просто после каждого удачного суммирования сдвигать полученную сумму направо.
|
По такому алгоритму у Вас усреднённое значение только случайно сможет получиться. 
Пардон, не учёл, что первый отсчет не делится пополам.
Тем не менее, любая помеха по АЦП будет сдвигать усреднённое значение на дельта/2, а потом плавно приближаться к среднему. Не гуд.
Я обычно делаю количество суммирований 2^n в пределах выбранной разрядности, а потом сдвиг вправо на n. Или медианный фильтр, по необходимости.
Последний раз редактировалось AJScorp; 24.04.2013 в 09:31.
Причина: Upd
|
|
|
|
24.04.2013, 08:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
При переполнении результат однозначно будет меньше любого из слагаемых.
Вернее если результат суммирования меньше любого слагаемого, то однозначно было переполнение.
Последний раз редактировалось alvadep; 24.04.2013 в 08:47.
|
|
|
|
24.04.2013, 10:54
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Честно говоря, не совсем понимаю зачем таким способом задачу решать.
Если хотите делать усреднение, то обычно делается просто. Например результат у вас 10 бит. Соответственно, до 16 бит у вас 5 не хватает - или 32 сложения. И вам надо сделать 32 сложения и сдвинуть результат на 5 бит вправо. Чаще всего правда используют 256 сложений с отбрасыванием младшего байта.
Но в принципе существуют достаточно простые фильтра. Я как-то ими обычно обхожусь. Правда для разных задач разные фильтра применяю.
|
|
|
|
24.04.2013, 14:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от SasaVitebsk
|
Честно говоря, не совсем понимаю зачем таким способом задачу решать.
Если хотите делать усреднение, то обычно делается просто. Например результат у вас 10 бит. Соответственно, до 16 бит у вас 5 не хватает - или 32 сложения. И вам надо сделать 32 сложения и сдвинуть результат на 5 бит вправо. Чаще всего правда используют 256 сложений с отбрасыванием младшего байта.
Но в принципе существуют достаточно простые фильтра. Я как-то ими обычно обхожусь. Правда для разных задач разные фильтра применяю.
|
На малых количествах замеров делаю один из самых простых фильтров. Выполняю 40 замеров. Сортирую. Пусть даже пузырьком. На таком к-ве элементов массива разница почти незаметна. Нет смысла в быстрых методах. Затем накапливаю с 4 по 35 элементы, сумму делю на 32 простыми сдвигами. Таким образом отсекаю "выбросы". Если они меня не интересуют.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
24.04.2013, 15:50
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Просто обычный фильтр по ресурсам меньше жрёт чем скользящее среднее. Могу привести пример, если надо.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:39.
|
|