реклама на сайте
подробности

 
 
> Кто разъяснит прикол IAR C
SasaVitebsk
сообщение Jul 12 2006, 16:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Объявлено следующее:

#define FCLK 14745600 // ×àñòîòà êîíòðîëëåðà
#define TCLK 68 // ×àñòîòà êîíòðîëëåðà â íñ
....
#define FREGENER 75 // ×àñòîòà ðåãåíåðàöèè ïàííî
#define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä
....
OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862
....

Компилятор генерит следующее

168 // Инициализация таймера 1 (Исполнение активных комманд)
169 // TCCR1A = 0; // Запустить таймер 1 в режиме сравнения
170 OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Гц = 862
\ 00000100 EA08 LDI R16, 168
\ 00000102 EF1D LDI R17, 253
\ 00000104 93100089 STS 137, R17
\ 00000108 93000088 STS 136, R16


Если вместо 40 для константы FSHOWACT поставить 31 и меньше, то всё класс. Точно также всё правильно если поставить 40.0!
Что я не учёл?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sz36
сообщение Jul 12 2006, 17:41
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 26-01-06
Пользователь №: 13 668



Цитата
#define FSHOWACT 40 // ×àñòîòà èñïîëíåíèÿ êîìàíä
OCR1A = FCLK/(1024*FSHOWACT); // FCLK/1024/16.7 Ãö = 862


Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2006, 17:53
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(sz36 @ Jul 12 2006, 20:41) *
Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jul 13 2006, 07:03
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Сергей Борщ @ Jul 12 2006, 20:53) *
Цитата(sz36 @ Jul 12 2006, 20:41) *

Не учел, что 40*1024 превышает максимальное значение для int (32767), и, соответственно, результат умножения получается отрицательным
Имеено так. Препроцессор по умолчанию считает все данные как int. Во избежание подобных недоразумений следует писать #define FCLK 14745600ULL, т.е объявлять константу типа unsigned long long или 14745600UL, т.е. unsigned long

Все правильно, только препроцессор здесь ни при чем. Препроцессор тупо заменяет один текст другим, а все остальное делает компилятор.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.02377 секунд с 7
ELECTRONIX ©2004-2016