Код
#define F_CPU 8000000u
#define MB_BAUD_RATE 38400
#define MB_TIMER_PRESCALER 64
#if MB_BAUD_RATE > 19200
// не растет кокос :(
#define MB_OCR_T25 (F_CPU / MB_TIMER_PRESCALER * (11 / MB_BAUD_RATE + 0.00075))
#define MB_OCR_T45 (F_CPU / MB_TIMER_PRESCALER * (11 / MB_BAUD_RATE + 0.00175))
#else
// тут я вроде как разобрался как на форуме советовали: сперва умножать побольше и потом делить поменьше
#define MB_OCR_T25 (F_CPU / MB_TIMER_PRESCALER * 11 * 25 /10 / MB_BAUD_RATE)
#define MB_OCR_T45 (F_CPU / MB_TIMER_PRESCALER * 11 * 45 /10 / MB_BAUD_RATE)
#endif
#define MB_BAUD_RATE 38400
#define MB_TIMER_PRESCALER 64
#if MB_BAUD_RATE > 19200
// не растет кокос :(
#define MB_OCR_T25 (F_CPU / MB_TIMER_PRESCALER * (11 / MB_BAUD_RATE + 0.00075))
#define MB_OCR_T45 (F_CPU / MB_TIMER_PRESCALER * (11 / MB_BAUD_RATE + 0.00175))
#else
// тут я вроде как разобрался как на форуме советовали: сперва умножать побольше и потом делить поменьше
#define MB_OCR_T25 (F_CPU / MB_TIMER_PRESCALER * 11 * 25 /10 / MB_BAUD_RATE)
#define MB_OCR_T45 (F_CPU / MB_TIMER_PRESCALER * 11 * 45 /10 / MB_BAUD_RATE)
#endif
Компилятор считает не то, что хочется. Результат выходит буд-то "11 / MB_BAUD_RATE" вообще нет
Код
код
volatile uint8_t ocr25 = (uint8_t)MB_OCR_T25;
листинг после препроцессора
volatile uint8_t ocr25 = (uint8_t)(8000000u / 64 * (11 / 38400 + 0.00075));
и асм
// 48 volatile uint8_t ocr25 = (uint8_t)MB_OCR_T25;
LDI R16, 93 !!! а должно быть 129
ST Y, R16
volatile uint8_t ocr25 = (uint8_t)MB_OCR_T25;
листинг после препроцессора
volatile uint8_t ocr25 = (uint8_t)(8000000u / 64 * (11 / 38400 + 0.00075));
и асм
// 48 volatile uint8_t ocr25 = (uint8_t)MB_OCR_T25;
LDI R16, 93 !!! а должно быть 129
ST Y, R16
Ещё препроцессору не нравится вот это:
Код
#if mb_ocr_test < MB_OCR_T25 || mb_ocr_test < MB_OCR_T45
#Error[Pe031]: expression must have integral type
#Error[Pe031]: expression must have integral type
Во втором варианте расчета было "* 2.5". После замены на " * 25 / 10" ругаться перестал. На сим сделал вывод, что препроцессор знает только целочисленную математику.
Компилятор ещё намекает, что не всё в порядке с вычислением:
Код
uint8_t ocr25 = MB_OCR_T25;
#Warning[Pa092]: implicit conversion to integer does not preserve the value
OCR0A = TCNT0 + MB_OCR_T45;
#Warning[Pa093]: implicit conversion from floating point to integer
Здесь, я так понял, надо приведение типа, ибо компилятор все же считает не целочисленно. Но проблему с ошибкой вычисления это не решает :(
OCR0A = TCNT0 + (uint8_t)MB_OCR_T45; // ругаться перестал
#Warning[Pa092]: implicit conversion to integer does not preserve the value
OCR0A = TCNT0 + MB_OCR_T45;
#Warning[Pa093]: implicit conversion from floating point to integer
Здесь, я так понял, надо приведение типа, ибо компилятор все же считает не целочисленно. Но проблему с ошибкой вычисления это не решает :(
OCR0A = TCNT0 + (uint8_t)MB_OCR_T45; // ругаться перестал
Подскажите, пжлст, где про это почитать подробней (сколько листал - не нахожу по теме)?
Может встречал кто утилиты/онлайн сервисы для просмотра "и что нам насчитают"? Довольно неудобно лазить по листингам.