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

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

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

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

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

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


 
Опции темы
Непрочитано 23.04.2013, 23:23  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Как в Си определить выход за приделы кода (переполнение) результата операции ?

Элементарная ситуация: Имеется два 16-битных числа , при их сложении нужно отслеживать ситуацию переполнения результата.
Пробую:
Код:
uint16_t temp16;
uint16_t sumADC;

if ((sumADC+=temp16)›0xffff)
     { // Отключение АЦП  !!
         ADCSRA=(1‹‹ADEN);}
- не работает
Нужно как можно короче превести это к коду (для AVR):
Код:
add rd_l,rs_l
adc rd_h,rs_h
brcs m1
....
Как это сделать на Си ?
Реклама:
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:31  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 327
Сказал спасибо: 104
Сказали Спасибо 105 раз(а) в 69 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Может складывать надо как 32 бита.
Djakovskij вне форума  
Непрочитано 23.04.2013, 23:45  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Флаг переноса в SREG можно проверять
Ara41 вне форума  
Непрочитано 23.04.2013, 23:47  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от Djakovskij Посмотреть сообщение
Может складывать надо как 32 бита.
избыточно получится, слишком много регистров
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:48  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от Ara41 Посмотреть сообщение
Флаг переноса в SREG можно проверять
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:49  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Можно так проверить

Код:
 uint16_t temp16;
 uint16_t sumADC; 

if (sumADC›~temp16)
 { // Отключение АЦП !!
 ADCSRA=(1‹‹ADEN);
}

Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:27.
Yurkin2007 вне форума  
Непрочитано 23.04.2013, 23:58  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от MaxiMuz79 Посмотреть сообщение
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
if (SREG & (1‹‹0)) ADCSRA=(1‹‹ADEN);
как-то так..
Ara41 вне форума  
Сказали "Спасибо" Ara41
MaxiMuz79 (24.04.2013)
Непрочитано 24.04.2013, 00:05  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Yurkin2007, не понимаю каким образом условие а›(-b) может стать проверкой на переполнение ?
вот что получилось:
Цитата:
sumADC+=temp16;
216: 80 91 60 00 lds r24, 0x0060
21a: 90 91 61 00 lds r25, 0x0061
21e: 84 0f add r24, r20
220: 95 1f adc r25, r21
222: 90 93 61 00 sts 0x0061, r25
226: 80 93 60 00 sts 0x0060, r24
if (sumADC›~temp16)
22a: 40 95 com r20
22c: 50 95 com r21
22e: 48 17 cp r20, r24
230: 59 07 cpc r21, r25
232: 78 f4 brcc .+30 ; 0x252 ‹__vector_9+0x6e›
//if ((sumADC+=temp16)›0xffff)
{
// Отключение АЦП !!
ADCSRA=(1‹‹ADEN);
234: 80 e8 ldi r24, 0x80 ; 128
236: 86 b9 out 0x06, r24 ; 6
думаю что это не то
MaxiMuz79 вне форума  
Непрочитано 24.04.2013, 00:18  
MaxiMuz79
Гражданин KAZUS.RU
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Ara41, Спасибо !
получилось:
Цитата:
if (SREG & (1‹‹5))
22a: 0f b6 in r0, 0x3f ; 63
22c: 05 fe sbrs r0, 5
похоже сделать чтото приличнее этого в avr-gcc неудастся
MaxiMuz79 вне форума  
Непрочитано 24.04.2013, 00:24  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Получилось - ну, и славно !
Вдогонку поясню свой способ. Вот есть число temp16. Сколько ещё места до 0xFFFF осталось? Это как раз ~temp16. И если значение sumADC больше этого зазора, то при сложении произойдёт переполнение.
То есть можно узнать результат, не производя само сложение и не портя уже накопленную сумму sumADC переполнением.

Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:32.
Yurkin2007 вне форума  
Эти 2 пользователя(ей) сказали Спасибо Yurkin2007 за это сообщение:
MaxiMuz79 (25.04.2013), robert777 (26.04.2013)
 

Закладки
Опции темы

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

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 21:25
переполнение TMR2 ??? Picallka Микроконтроллеры, АЦП, память и т.д 2 11.02.2004 21:32


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot