Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать #define PAUSE_FREM 65535-(CLOCK_VALUE / (BAUD_RATE / 4 * 11))
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
_Алекс
Как сделать #define PAUSE_FREM 65535-(CLOCK_VALUE / (BAUD_RATE / 4 * 11))
При подстановке:
#define BAUD_RATE 57600
#define CLOCK_VALUE 21600

unsigned int val;

val = PAUSE_FREM получаю в переменной вместо желаемого 64831, савсем другое значение.
не округляет до ближайшего целого что ли
rezident
Как минимум указать тип констант и переменной unsigned long. А лучше так
Код
#define PAUSE_FREM(clock, baud) (65535UL-(clock/(baud*11UL/4UL)))

unsigned long val;
val = PAUSE_FREM(21600, 57600);


P.S. кстати при целочисленной арифметике и указанных значениях clock и baud число 64831 никак не получается.
_Алекс
Цитата(rezident @ Jul 31 2007, 12:42) *
Как минимум указать тип констант и переменной unsigned long. А лучше так
Код
#define PAUSE_FREM(clock, baud) (65535UL-(clock/(baud*11UL/4UL)))

unsigned long val;
val = PAUSE_FREM(21600, 57600);


P.S. кстати при целочисленной арифметике и указанных значениях clock и baud число 64831 никак не получается.


Точно и не нужно максимально близко к точному целочисленному значению
Дальше у меня так
TCNT1H = (unsigned char)(PAUSE_FREM >> 8);
TCNT1L = (unsigned char)PAUSE_FREM;

val - пример
KRS
Цитата(_Алекс @ Jul 31 2007, 13:26) *
не округляет до ближайшего целого что ли

Чтобы округляла надо либо в float считать +0.5
#define PAUSE_FREM (unsigned)(65535.5 - ((double)CLOCK_VALUE / ((double)BAUD_RATE / 4.0 * 11.0)))

или перед делением прибавить половину делителя
#define PAUSE_FREM 65535-((CLOCK_VALUE + ((BAUD_RATE / 4 * 11)>>1) / (BAUD_RATE / 4 * 11))
_Алекс
И так и так не работает 05.gif
rezident
Цитата(_Алекс @ Jul 31 2007, 17:22) *
И так и так не работает 05.gif

Дык вы на виндовом калькуляторе посчитайте, даже с плавучкой ваше число никак не получается! Чтобы получить искомое 64831 при BAUD_RATE=57600 CLOCK_VALUE должно быть 111513600. Или ваша формула неверна.
KRS
Цитата(_Алекс @ Jul 31 2007, 15:22) *
И так и так не работает 05.gif

Что меня смущает в формуле так это делитель!
Вы уверены что надо считать
(BAUD_RATE / 4 * 11)
а не
(BAUD_RATE / (4 * 16))
_Алекс
Цитата(KRS @ Jul 31 2007, 14:37) *
Что меня смущает в формуле так это делитель!
Вы уверены что надо считать
(BAUD_RATE / 4 * 11)
а не
(BAUD_RATE / (4 * 16))


Блин операции * / равнозначные 01.gif , на Windows калькуляторе у меня было все нормально, я ведь сам считал
rezident
Цитата(_Алекс @ Jul 31 2007, 17:58) *
Блин операции * / равнозначные 01.gif , на Windows калькуляторе у меня было все нормально, я ведь сам считал

Дык даже с учетом этой промашки CLOCK_VALUE 921600, а не 21600 должно быть smile.gif Поскольку это число больше 65535, то и записывать его в макросе нужно как 921600UL.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.