ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
281461 Топик полностью
rezident (02.11.2011 11:37, просмотров: 241) ответил Механик08 на Вот полный текст программы:
Прошу пояснений. У вас все-таки используется внешний кварц 7,3728МГц или вы планируете работать от DCO, настроенный на 8МГц? Если внешний кварц, то почему функция настройки в прерывании по вектору NMI вызывается только один раз при старте программы? Ведь при вызове функции по вектору NMI биты NMIIE, OFIE и ACCVIE автоматически сбрасываются.
The NMI interrupt is a multiple-source interrupt. An NMI interrupt automatically resets the NMIIE, OFIE and ACCVIE interrupt-enable bits. The user NMI service routine resets the interrupt flags and re-enables the interrupt-enable bits according to the application needs as shown in Figure 2-5.
Так что, если вы хотите обрабатывать ошибки кварцевых генераторов, то в конце функции обработчика прерывания нужно программно устанавливать бит OFIE. Если же вы хотите тактировать систему от DCO, то почему нет функции, выполняющей калибровку DCO от часового кварца? Предполагается, что работа вашего устройства будет происходить только в комнатных условиях и частота DCO меняться не будет что ли? Для нормальной работы часового кварца должен быть проинициализирован регистр BCSCTL3, а у вас почему-то сначала анализируется ошибка бита LFXT1OF и только потом инициализируется этот регистр. Ну и другие мелочи вроде отсутствия квалификатора volatile у переменных, которые изменяются в прерывании, а значение их анализируется в основном цикле (rfstate). Или автоинкремент индекса без предварительной проверки его на выход за границы массива. Кстати зачем индексную переменную объявлять как unsigned char? Ведь индекс все равно будет расширен до размерности адреса (16 или 20 бит). К тому же, если она у вас используется только в прерывании, то нет смысла объявлять ее как глобальную. Объявите ее внутри функции обработчика прерывания как static, чтобы значение ее сохранялось при выходе.