Электронные устройства на микроконтроллерах.
Самоделки для радиолюбителей.
Константа представляет из себя обычный байт данных, число в диапазоне 0x00…0xFF (0…255), которое управляет работой генератора. Тут вроде бы все просто, но вот беда, расположенно это число в основной памяти программ микроконтроллера, т.е. в той самой памяти куда мы заливаем прошивку. Более того это число идет вместе с командой возврата из подпрограммы. Физически константа размещается в самой последней (нижней) ячейки памяти программ и выглядит, как команда возврата из подпрограммы с неким значением в рабочем регистре.
При включении питания, в микроконтроллере запускается тактовый генератор, пока еще не используя константу, т.е. его частота немного отличается от нужной. Далее запускается программа, зашитая в микроконтроллер. Программа начинает работу с самой верхней ячейки памяти, имеющая нулевой адрес (привыкаем, что в программах счет идет не с 1, а с нуля). Называется это вектор сброса, т.е. при любом виде сброса - внутренний указатель указывает именно на нулевую ячейку.
Первым делом программа делает вызов подпрограммы из этой самой последней ячейки. Подпрограмма возвращает нашу константу. Далее программа используя эту константу подстраивает точность частоты тактового генератора. Вот и все, теперь частота генератора имеет максимальную точность.
Микроконтроллер так же запустится и так же сделает вызов подпрограммы из последней ячейки. Но последняя ячейка затерта и там, например, записаны нули или некое случайное значение.
Нули соответствуют команде NOP (нет операции). Т.е. такая подпрограмма ничего не вернет, а просто отработает холостой цикл и т.к. это последняя ячейка - программа вновь перейдет вверх, на вектор сброса, где опять произойдет вызов подпрограммы из последней ячейки и так до бесконечности. То есть наша программа зациклится и нормально работать не будет. Если же ячейка затерта не нулями, а некими случайными значениями то работа программы вообще будет непредсказуемой.
Обратите внимание, что константа влияет только на работу внутреннего RC-генератора и никак не затрагивает работу генератора с кварцем или внешней RC-цепочки. И тут часто всплывает один подводный камень. Казалось бы, с кварцем можно работать и с затертой константой. И это действительно так! Но как всегда есть одно большое НО - зачастую программисты используют готовый шаблон инициализации микроконтроллера с процедурой чтения константы, по этому даже с кварцем программа не запускается.
Как мы уже выяснили, сохранять константу нужно обязательно. Т.е. прошивка никак не должна затирать последнюю ячейку, как жы быть… И вот тут самое приятное, большинство прошивающих программ делают это автоматически, некоторые с выдачей предупреждения, а некоторы делают это так, что вы об этом даже не узнаете, т.е. просто прошиваем микроконтроллер и все работает само по себе. Если же программа выдает вопрос, использовать константу из микроконтроллера или прошивки - выбрать нужно, естественно, использовать константу из микроконтроллера.
Если ваша программа не выполняет автосохранение константы, лучшим решением будет найти другую программу. Проверить сохранение можно так: вставляем новый микроконтроллер в программатор и считываем его. Смотрим, какое число находится в самой нижней ячейке и запоминаем его. Далее прошиваем микроконтроллер и вновь смотрим в самый низ. Если значение в этой ячейке не изменилось - значит программа сохраняет константу корректно.
Официальные программы от MicroChip® сохраняют константу без проблем, причем даже при полном стирании памяти программ.
К сожалению такие ситуации иногда бывают. Самым простым решением будет записать в последнюю ячейку команду RETLW с средним значением 0x7F. Конечно, точность частоты будет намного хуже, но для программ не критичных к частоте это вполне допустимо. Процесс выглядит так: открываем прошивку, дописываем вручную в последнюю ячейку код 0x347F и прошиваем микроконтроллер. Так же существуют специальные схемы, позволяющие подобрать правильное значение константы, но это уже совсем другая история… Не теряйте константы!