Я написал функцию, в которой вы должны ввести число, а затем функция вычисляет значение для записи в регистр. Однако похоже, что он записывает «неправильное» значение в регистр. Я использовал калькулятор и wolframalpha, чтобы убедиться, что я не нарушаю порядок операций. Функция указана ниже:
void SetFrequency_Hz(int Freq) {
PR4 = ((41667000 / (4 * 16 * Freq)) - 1);
}
Когда я пытаюсь установить частоту на 20 кГц (20 000 Гц), мне нужно установить регистр PR4 на 32. Теоретически, если я введу значение 20000 в функцию, должно быть выплевывается, НО это выплевывает 179 для некоторых причина. Есть предположения, почему?
MCU: PIC18F67J60 IDE: MP LAB X
32
подходит. Это размер типаint
C. Если это 16 бит, расчет не будет работать, вам нужно использовать 32-битный тип. Например((41667000UL / (64UL * Freq)) - 1);
- person Weather Vane   schedule 24.03.2019printf("%zu\n", sizeof(int));
, что должно дать 2, 4 или 8 (байт). - person Weather Vane   schedule 24.03.2019printf
? В любом случае, поместите его в переменнуюsize_t
и проверьте отладчиком. Или на ЖК-дисплее, или как вы получаете вывод! - person Weather Vane   schedule 24.03.2019#include <stdint.h>
и четко укажите свои целочисленные размеры, т.е. используйтеint32_t
илиint16_t
и убедитесь, что вы понимаете ширину операндов, 2) обратите внимание на ваше фактическое требуемое разрешение и динамический диапазон - если 20000 сопоставляется с 32, укажите, какое число сопоставляется с 30 или 31 и нужно ли вам вообще разрешение. - person Groo   schedule 25.03.2019