Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Как в Си определить выход за приделы кода (переполнение) результата операции ?

Непрочитано 24.04.2013, 00:30  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

А если так
Код:
sumADC+=temp16;
if (sumADC‹temp16)
Я думаю Yurkin2007 это имел в виду.
Реклама:
alvadep вне форума  
Непрочитано 24.04.2013, 00:44  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от alvadep Посмотреть сообщение
Я думаю Yurkin2007 это имел в виду.
Не, совсем не так.
Но можно и так, как Вы предлагаете. Вот, интересно, что при переполнении результат получается меньше, чем до сложения! Тогда проверка может быть такой

Код:
temp16 += sumADC; // новая сумма
if(sumADC›temp16)// сравнение старого и нового результата
{
// произошло переполнение
// Отключение АЦП !! И сохраняем неиспорченную сумму sumADC
 ADCSRA=(1‹‹ADEN);
}
else
{
  sumADC=temp16;//переполнения не было, кладём новую сумму в накопление
}
Yurkin2007 вне форума  
Непрочитано 24.04.2013, 02:42  
_Артём_
Гражданин KAZUS.RUN
 
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
_Артём_ на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от MaxiMuz79 Посмотреть сообщение
Ara41, Спасибо !
Код:
if (SREG & (1‹‹5))
похоже сделать чтото приличнее этого в 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  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от _Артём_ Посмотреть сообщение
Или
Код:
// Отключение АЦП !!
ADCSRA=(0‹‹ADEN);}
?
Ну, тогда уж так:
Код:
// переключаем АЦП !!
 ADCSRA^=(1‹‹ADEN);
//################
//или просто выключаем АЦП
 ADCSRA&=~(1‹‹ADEN);
electroTrash вне форума  
Непрочитано 24.04.2013, 04:59  
electroTrash
Прописка
 
Регистрация: 05.01.2013
Сообщений: 195
Сказал спасибо: 11
Сказали Спасибо 24 раз(а) в 21 сообщении(ях)
electroTrash на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от _Артём_ Посмотреть сообщение
К тому же, если суммировать пока не переполнится, то как узнать среднее значение АЦП? Поделить полученную сумму на количество отсчетов? Так это ещё деление. Или задача другая?
Надо просто после каждого удачного суммирования сдвигать полученную сумму направо.

Последний раз редактировалось electroTrash; 24.04.2013 в 05:28.
electroTrash вне форума  
Непрочитано 24.04.2013, 08:10  
AJScorp
Почётный гражданин KAZUS.RUN
 
Аватар для AJScorp
 
Регистрация: 10.05.2005
Адрес: Саратов.ru
Сообщений: 1,550
Сказал спасибо: 384
Сказали Спасибо 735 раз(а) в 416 сообщении(ях)
AJScorp на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от electroTrash Посмотреть сообщение
Надо просто после каждого удачного суммирования сдвигать полученную сумму направо.
По такому алгоритму у Вас усреднённое значение только случайно сможет получиться.
Пардон, не учёл, что первый отсчет не делится пополам.
Тем не менее, любая помеха по АЦП будет сдвигать усреднённое значение на дельта/2, а потом плавно приближаться к среднему. Не гуд.

Я обычно делаю количество суммирований 2^n в пределах выбранной разрядности, а потом сдвиг вправо на n. Или медианный фильтр, по необходимости.

Последний раз редактировалось AJScorp; 24.04.2013 в 09:31. Причина: Upd
AJScorp вне форума  
Непрочитано 24.04.2013, 08:34  
alvadep
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
alvadep на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

При переполнении результат однозначно будет меньше любого из слагаемых.
Вернее если результат суммирования меньше любого слагаемого, то однозначно было переполнение.

Последний раз редактировалось alvadep; 24.04.2013 в 08:47.
alvadep вне форума  
Непрочитано 24.04.2013, 10:54  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Честно говоря, не совсем понимаю зачем таким способом задачу решать.
Если хотите делать усреднение, то обычно делается просто. Например результат у вас 10 бит. Соответственно, до 16 бит у вас 5 не хватает - или 32 сложения. И вам надо сделать 32 сложения и сдвинуть результат на 5 бит вправо. Чаще всего правда используют 256 сложений с отбрасыванием младшего байта.
Но в принципе существуют достаточно простые фильтра. Я как-то ими обычно обхожусь. Правда для разных задач разные фильтра применяю.
SasaVitebsk вне форума  
Непрочитано 24.04.2013, 14:40  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от SasaVitebsk Посмотреть сообщение
Честно говоря, не совсем понимаю зачем таким способом задачу решать.
Если хотите делать усреднение, то обычно делается просто. Например результат у вас 10 бит. Соответственно, до 16 бит у вас 5 не хватает - или 32 сложения. И вам надо сделать 32 сложения и сдвинуть результат на 5 бит вправо. Чаще всего правда используют 256 сложений с отбрасыванием младшего байта.
Но в принципе существуют достаточно простые фильтра. Я как-то ими обычно обхожусь. Правда для разных задач разные фильтра применяю.
На малых количествах замеров делаю один из самых простых фильтров. Выполняю 40 замеров. Сортирую. Пусть даже пузырьком. На таком к-ве элементов массива разница почти незаметна. Нет смысла в быстрых методах. Затем накапливаю с 4 по 35 элементы, сумму делю на 32 простыми сдвигами. Таким образом отсекаю "выбросы". Если они меня не интересуют.
__________________
С уважением,
Vic / ut1wpr
ut1wpr вне форума  
Непрочитано 24.04.2013, 15:50  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Просто обычный фильтр по ресурсам меньше жрёт чем скользящее среднее. Могу привести пример, если надо.
SasaVitebsk вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Измерение времени выполнения куска кода в Протеусе. Как? tems-ya Proteus 4 21.01.2010 21:41
ATmega128 PORTF как инициализировать на выход lzrvt Микроконтроллеры, АЦП, память и т.д 3 07.10.2007 17:07
Как уменьшить прошивку кода написанного на С? graham Микроконтроллеры, АЦП, память и т.д 30 14.01.2006 21:03
[Решено] Порт А неработает как выход LDA Коллекция глюков 2 06.12.2004 20:25
переполнение TMR2 ??? Picallka Микроконтроллеры, АЦП, память и т.д 2 11.02.2004 21:32


Часовой пояс GMT +4, время: 20:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.