Большинство наиболее часто используемых РСН также отображаются на все банки памяти. Типичным примером может служить регистр STATUS, который одновременно расположен и по адресу h’03’, и по адресу h’83’. Это сделано из-за того, что к флагам и битам регистра STATUS приходится обращаться очень часто, и постоянное переключение банков было бы неэффективным. В самом деле, когда в коде, приведенном выше, мы сбрасываем бит RP0 для перехода от 1-го банка к 0-му, мы предполагаем, что регистр STATUS присутствует в обоих банках. В противном случае мы никогда бы не смогли переключить бит RP0 и сменить банк памяти.
Большинство РСН микроконтроллера PIC16F84 встречаются во всех представителях семейств среднего уровня, более того, они, как правило, и размещаются по тем же самым адресам. Так, регистр STATUS расположен по адресам h’03’/h’83’.
Формально мы не будем в этой главе рассматривать никакие РСН, за исключением регистра STATUS и регистров, имеющих отношение к счетчику команд. Однако будет удобнее, если все эти регистры будут кратко описаны в одном месте. Поэтому мы просто перечислим их здесь, а подробно об их назначении поговорим в соответствующих главах книги.
Косвенная адресация
При непосредственной адресации адрес операнда содержится в коде команды. В микроконтроллерах среднего уровня для этого зарезервировано 7-битное поле, показанное на Рис. 3.5 (стр. 68). В сфере встраиваемых устройств, когда коды команд хранятся в ПЗУ какого-либо типа, такие адреса являются фиксированными и, соответственно, не могут модифицироваться.
Альтернативным способом, используемым в том или ином виде всеми вычислительными устройствами, является хранение адреса операнда в каком-либо регистре. В случае PIC этот адрес содержится в регистре FSR (File Select Register), располагающемся по адресу h’04’ памяти данных. Для переключения в режим косвенной адресации внутренняя логика отслеживает обращение по нулевому адресу памяти данных. Когда в команде указывается этот нулевой адрес, на шину адреса памяти данных выставляется содержимое регистра FSR, как показано на Рис. 5.6 (стр. 124).
При косвенной адресации местоположение операндов является не константой в памяти программ, а переменной в регистре FSR. То есть положение операнда может изменяться в процессе выполнения программы. В качестве примера можно взглянуть на Программу 5.2, приведенную на стр. 125.
К режиму косвенной адресации имеют отношение следующие регистры:
∙ INDF (h’00’)
Нулевой адрес памяти данных обозначается как INDF (INDirect File). Поскольку этот регистр используется исключительно для включения режима косвенной адресации, то его не стали реализовывать как настоящий регистр. То есть вы не можете хранить данные в регистре INDF, поскольку он физически не существует!
∙ FSR (h’04’)
В индексном регистре FSR содержится 8-битный адрес, который используется при обращении команды по нулевому адресу (к регистру INDF).
Таймер
Большинство микроконтроллеров имеют возможность измерения временных интервалов и/или формирования прямоугольных импульсов заданной длительности. Как правило, для этого используется один или более счетчиков, инкрементирование которых происходит либо по внешним импульсам, либо по внутреннему тактовому сигналу Например, если в автоматической упаковочной машине необходимо осуществлять подсчет консервных банок, движущихся по конвейеру, то в качестве входного сигнала таймера может использоваться сигнал от фотоэлектрического датчика. Если в одну коробку помещается 24 банки, то во внутренний 8-битный счетчик необходимо загрузить значение h’E8’ (-24). При переполнении счетчика с h’FF’ до h’00’ будет сгенерировано прерывание (см. главу 7) и микроконтроллер начнет выполнять соответствующие действия.