Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 2. Общее устройство, организация памяти, тактирование, сброс 39 Отметим еще для галочки, что в некоторых моделях (ATmega8, ATmega8535 и др.) имеются внутренние конденсаторы 36 пФ, которые можно подключить, если запи- сать логический ноль в конфигурационную ячейку CKPOT . Они оказываются под- ключенными между выводами XTAL1 и XTAL2 и «землей», подобно конденсато- рам на схеме рис. 2.3, а . Иными словами, их можно использовать в схемах с низко- частотным кварцем или в схеме с внешней RC-цепочкой, а вот в основной схеме с кварцевым резонатором их лучше не употреблять, т. к. номинал их почти вдвое выше рекомендуемого (от этого может заметно возрасти потребление и генератор будет перегружаться). Способ этот не универсальный (во многих моделях контрол- леров эти конденсаторы отсутствуют), да и сами способы тактирования, где он при- годен, достаточно экзотичные, поэтому мы его употреблять не будем. Неправильным будет также не упомянуть, что во многих моделях (из «наших» это ATtiny2313) имеется предделитель тактовой частоты, управляемый программно битами CLKPS (не путать с fuse-битами CKDIV8 и CKSEL , управляющими собственно значением частот генератора и устанавливаемыми до загрузки программы). В ATtiny2313 можно поделить частоту генератора по всему двоичному ряду от 1 до 256. Такое может понадобиться, например, если от внутреннего генератора, ко- торый обычно сам по себе работает на частоте 8 МГц, захочется получить некую частоту тактирования, отличную от «умолчательной» 1 МГц. Возможно, у кого-то возникнет искушение попробовать работу на супернизких частотах — при исход- ных 8 мегагерцах деление на 256 позволяет получить тактовую частоту меньше 32 кГц. Для КМОП-схем это означает практическое выключение: потреблять будет только сам генератор, что, впрочем, может быть тоже немало — при 5 вольтах пи- тания он потребляет около 50 мкА. Сброс Сбросом (RESET) называется установка начального режима работы МК (аппарат- ная или, как это раньше называли, «холодная» перезагрузка). При этом все РВВ устанавливаются в состояние по умолчанию — как правило, это нули во всех раз- рядах за небольшим исключением. На практике то же самое относится и к РОН (как и к ячейкам SRAM) — они по сбросу обнуляются, но не случайно этот момент никак не оговорен официально. В некоторых случаях (например, после выхода из «сна» — об этом см. главу 14 ) РОН и ячейки SRAM после сброса могут принимать произвольные значения, поэтому при необходимости обязательно начинать с ка- кой-то определенной величины переменные следует устанавливать в начале про- граммы принудительно. Программа после аппаратного сброса начинает выполняться не сразу, а с некоторой задержкой (см. описание fuse-битов SUT0 и SUT1 в главе 5 ). Выполнение происходит с заданного начального адреса (по умолчанию это адрес $0000 ), что позволяет при желании организовать софтверную («горячую») перезагрузку изнутри программы, просто организовав безусловный переход на нулевой адрес. При этом все регистры и память сохраняют свое состояние на момент сброса. Правда, зачем такое может понадобиться, я так и не придумал — сторожевой таймер в этом качестве задейст- вовать куда удобнее.

RkJQdWJsaXNoZXIy MTExODQxMg==