Что находится во внешней памяти данных микроконтроллера 80с52 при прямой адресации в ячейку 0x10000h
Несмотря на то, что внутренняя память данныхимеет самое маленькое адресное пространство из рассматриваемых, оно устроено наиболее сложным образом. Распределение памяти данных микроконтроллеров серии MCS-51 приведено на рис. 20.12.
Регистры специальных функцийзанимают адреса внутренней памяти данных с 080h по 0FFh. Так как адреса регистров специальных функций совпадают со старшими адресами внутреннего ОЗУ данных, то имеются особенности их использования.
MOV A, 80h ;Скопировать сигналы с внешних выводов порта P0 в
;аккумулятор
MOV A, @R0 ;ячейки внутреннего ОЗУ с адресом 80h
Десятичный адрес ячейки | Шестнадцатеричный адрес ячейки | |
Регистры специальных функций SFR (прямая адресация) | ОЗУ (косвенная адресация) | FFh |
80h | ||
7Fh | ||
ОЗУ (прямая и косвенная адресация) | ||
30h | ||
2Fh | ||
Битовое пространство | ||
20h | ||
R7''' | 1Fh | |
RB3 (PSW=18h) | ||
R0''' | 18h | |
R7'' | 17h | |
RB2 (PSW=10h) | ||
R0'' | 10h | |
R7' | 0Fh | |
RB1 (PSW=08h) | ||
R0' | 08h | |
R7 | 07h | |
RB0 (PSW=00h) | ||
R0 | 00h |
Рис. 20.12. Адресное пространство внутренней памяти данных.
Все четыре банка регистров объединены с 32 младшими байтами внутреннего ОЗУ данных (см. рис. 20.12). Так как физически регистры и ячейки внутреннего ОЗУ объединены, то команды программы могут обращаться к регистрам используя или их имена R0-R7 (регистровая адресация):
MOV A, R0 ;Скопировать содержимое регистра R0 в аккумулятор
MOV R7, A ;Скопировать содержимое регистра R7 в аккумулятор
или их адрес во внутренней памяти данных (прямая байтовая адресация):
MOV A, 0 ;Скопировать содержимое нулевой ячейки ОЗУ в аккумулятор
MOV 7, A ;Скопировать содержимое аккумулятора в седьмую ячейку ОЗУ
Следующие после банков регистров 16 ячеек внутреннего ОЗУ данных (адреса 20Н-2FH) образуют область памяти, к которой возможна как байтовая, так и битовая адресация. В этих ячейках располагаются 128 программных флагов (битовых ячеек памяти). Обращение к отдельным битам этих ячеек возможно по их битовым адресам. Например, команды:
SETB 15 ;Запомнить во флаге 15 логическую единицу
JB 15, Metka ;Если во флаге 15 записана логическая единица, то перейти
;по адресу Metka
обращаются к флагу 15, расположенному в старшем бите байтовой ячейки памяти 21h. Использование однобитовых ячеек памяти позволяет сократить необходимый для работы программы объем памяти данных, так как для хранения битовых переменных выделяется один бит в памяти данных, а не машинное слово, как это делается в универсальных микропроцессорах (компьютерах).
В битовой области сосредоточено только 128 флагов. Битовая адресация возможна также в области регистров специальных функций.(см. табл. 20.4) Наиболее яркий пример использования битовой адресации в данной области — это обращение к отдельным выводам параллельных портов:
CPL 92 ;Проинвертировать второй бит порта P1
Выше адреса 128 (080h) располагаются регистры специальных функций, которые будут рассмотрены позже. Некоторые из регистров специальных функций допускают битовую адресацию к каждому из восьми своих битов. Оставшаяся область внутренней памяти данных используется как обычное ОЗУ, без особенностей.
Следует отметить, что в современных микроконтроллерах данного семейства эту память следует рассматривать как встроенные 256 регистров сверхоперативного ОЗУ. Основной памятью постепенно становится внутренняя память микроконтроллера, доступная при помощи команд MOVX @DPTR, A.
При трансляции программы по частям возникает вопрос, как с этими частями работать. Иначе говоря, дает о себе знать проблема сегментов. Справедливости ради необходимо отметить, что даже когда мы не задумываемся о сегментах, в программе присутствует два сегмента: сегмент кода и сегмент данных. Если внимательно присмотреться к программе, то можно обнаружить, что кроме кодов команд в памяти программ хранятся константы, то есть в памяти программ микроконтроллера располагаются, по крайней мере, два сегмента: код и данные. Чередование кода и данных может привести к нежелательным последствиям. Вследствие каких-либо причин данные могут быть случайно выполнены в качестве машинных команд или наоборот коды машинных команд могут быть восприняты и обработаны как данные.
Рис. 23.4.Разбиение памяти программ и памяти данных на сегменты
Перечисленные выше причины приводят к тому, что желательно явным образом выделить, по крайней мере, четыре сегмента:
И лучше, если эти сегменты будут перемещаемыми. Тогда редактор связей сможет автоматически скомпоновать программу наилучшим способом.
Пример размещения сегментов в адресном пространстве памяти программ и внутренней памяти данных приведен на рис. 23.4. На этом рисунке видно, что при использовании нескольких сегментов переменных во внутренней памяти данных редактор связей может разместить меньший из них на месте неиспользованных банков регистров. Под сегмент стека обычно отводится вся область внутренней памяти, не занятая переменными. Это позволяет создавать программы с максимальным уровнем вложенности подпрограмм. Сегмент переменных, расположенный на рис. 23.4 во внешней памяти данных, при использовании современных микросхем, таких как AduC842, может находиться в ОЗУ, расположенном на кристалле микроконтроллера.
Наиболее простой способ определения сегментов — это использование абсолютных сегментов памяти. При этом способе распределение памяти ведется вручную точно так же, как это делалось при использовании директивы EQU. В этом случае начальный адрес сегмента жестко задается программистом, и он же следит за тем, чтобы сегменты не перекрывались друг с другом в памяти микроконтроллера. Использование абсолютных сегментов позволяет более гибко работать с памятью данных, так как теперь байтовые переменные в памяти данных могут быть назначены при помощи директивы резервирования памяти DS, а битовые переменные при помощи директивы резервирования битов DBIT.
Для определения абсолютных сегментовпамяти используются следующие директивы:
q BSEG - абсолютный сегмент в области битовой адресации;
q CSEG - абсолютный сегмент в области памяти программ;
q DSEG - абсолютный сегмент в области внутренней памяти данных;
q ISEG - абсолютный сегмент в области внутренней памяти данных с косвенной адресацией;
q XSEG - абсолютный сегмент в области внешней памяти данных.
Директива bsegпозволяет определить абсолютный сегмент во внутренней памяти данных с битовой адресацией по определенному адресу. Эта директива не назначает имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Использование битовых переменных позволяет значительно экономить внутреннюю память программ микроконтроллера. Пример использования директивы BSEG для объявления битовых переменных приведен в листинге 23.24.
Листинг 23.24. Пример использования директивы BSEG перед определениями битовых переменных
BSEG AT 8 ;Сегмент начинается с восьмого бита
RejInd DBIT 1 ;Флаг режима индикации
RejPriem DBIT 1 ;Флаг режима приема
Flag DBIT 1 ;Флаг общего назначения
Директива csegпозволяет определить абсолютный сегмент в памяти программ по определенному адресу. Директива не назначает имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы CSEG для размещения подпрограммы обслуживания прерывания от таймера 0 приведен в листинге 23.25.
Листинг 23.25. Пример использования директивы cseg для размещения подпрограммы обслуживания прерывания
CSEG AT 0bh ;Вектор прерывания от таймера 0
Директива dsegпозволяет определить абсолютный сегмент во внутренней памяти данных по определенному адресу. Предполагается, что к этому сегменту будут обращаться команды с прямой адресацией. Эта директива не назначает имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы DSEG для объявления байтовых переменных приведен в листинге 23.26.
Листинг 23.26. Пример использования директивы DSEG перед определением байтовых переменных
DSEG AT 20 ;Разместить сегмент в битовом пространстве микроконтроллера
;(для возможности одновременно битовой и байтовой адресации)
RejInd DS 1 ;Переменная, отображающая состояние программ обслуживания
Rejim DS 1 ;Переменная, отображающая режимы работы
Massiv DS 10 ;Десятибайтовый массив
Последний пример связан с примером, приведенным в листинге 23.24. То есть команды, изменяющие битовые переменные RejInd, RejPriem или Flag, одновременно будут изменять содержимое переменной Rejim, и наоборот команды, работающие с переменной Rejim, одновременно изменяют содержимое флагов RejInd, RejPriem или Flag. Такое объявление переменных позволяет написать наиболее эффективную программу управления контроллером и подключенными к нему устройствами.
Директива isegпозволяет определить абсолютный сегмент во внутренней памяти данных с косвенной адресацией по определенному адресу. Напомню, что адресное пространство внутренней памяти с косвенной адресацией в два раза больше адресного пространства памяти с прямой адресацией. Именно в этой области памяти размещается стек. ДирективаISEG не назначает имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. Пример использования директивы ISEG для объявления байтовых переменных приведен в листинге 23.27.
Листинг 23.27. Пример использования директивы iseg для объявления байтовых переменных
ISEG AT 80 ;Разместить сегмент в диапазоне адресов, совмещенных с SFR
Bufer DS 10 ;Десятибайтовый массив
Stack DS 245 ;Стек
Директива xsegпозволяет определить абсолютный сегмент во внешней памяти данных по определенному адресу. Эта директива не назначает имени сегменту, то есть объединение сегментов из различных программных модулей невозможно. Для определения конкретного начального адреса сегмента применяется атрибут AT. Если атрибут AT не используется, то начальный адрес сегмента предполагается равным нулю. До недавнего времени использование внешней памяти не имело смысла, так как это значительно увеличивало габариты и цену устройства. Однако в последнее время ряд фирм стал размещать на кристалле значительные объемы ОЗУ, доступ к которому осуществляется как к внешней памяти. Так как эта директива применяется так же, как DSEG, то отдельный пример приводиться не будет.
Использование абсолютных сегментов позволяет облегчить работу программиста по распределению памяти микроконтроллера для различных переменных. Однако в большинстве случаев абсолютный адрес переменной нас совершенно не интересует. Исключение составляют только регистры специальных функций. Так зачем же вручную задавать начальный адрес сегментов?
Одна из ситуаций, когда нас не интересует начальный адрес сегмента — это программные модули. Как уже говорилось ранее, в программные модули обычно выносятся подпрограммы. Естественно, что конкретные адреса, по которым будут находиться эти подпрограммы в адресном пространстве микроконтроллера, нас тоже мало интересует.
Если абсолютные адреса переменных или участков программ не интересны, то можно воспользоваться перемещаемыми сегментами. Имя перемещаемого сегмента задается директивой segment.
Директива segmentпозволяет определить имя сегмента и область памяти, где будет размещаться данный сегмент памяти. Для каждой области памяти определено ключевое слово:
q data – размещает сегмент во внутренней памяти данных с прямой адресацией;
q idata – размещает сегмент во внутренней памяти данных с косвенной адресацией;
q bit – размещает сегмент во внутренней памяти данных с битовой адресацией;
q xdata – размещает сегмент во внешней памяти данных;
q code – размещает сегмент в памяти программ.
После определения имени сегмента можно использовать этот сегмент при помощи директивы rseg.
Директива rsegпозволяет поместить в конкретный перемещаемый сегмент переменные или фрагмент кода программы. Обращение к одному и тому же сегменту может осуществляться в разных местах исходного текста программы (даже в разных файлах) При этом все участки сегмента будут находиться в соседних участках области памяти микроконтроллера, выделенного для этого сегмента.
Использование сегмента зависит от области памяти, для которой он предназначен. Если это память данных, то в сегменте объявляются байтовые или битовые переменные. Если это память программ, то в сегменте размещаются константы или участки кода программы. Пример использования директив segment и rseg для определения байтовых переменных во внутренней памяти данных с косвенной адресацией приведен в листинге 23.28.
Листинг 23.28. Пример использования директив segment и rseg для определения байтовых переменных
_data segment idata
В этом примере объявлен массив buferKlav, состоящий из восьми байтовых переменных. Кроме того, в данном примере объявлена переменная VershSteka, соответствующая последней ячейке памяти, используемой для хранения переменных. Переменная VershSteka может быть использована для начальной инициализации указателя стека для того, чтобы отвести под стек максимально доступное количество ячеек внутренней памяти. Это необходимо для того, чтобы избежать переполнения стека при вложенных вызовах подпрограмм.
Объявление и использование сегментов данных в области внутренней или внешней памяти данных не отличается от приведенного в последнем примере за исключением ключевого слова, определяющего область памяти данных.
Еще один пример использования директив segment и rseg приведен в листинге 23.29. В этом примере директива segment используется для определения сегмента битовых переменных.
Листинг 23.29. Пример использования директив segment и rseg для определения битовых переменных
_bits segment bit
Наибольший эффект от применения сегментов можно получить при написании основного текста программы с использованием модулей. Обычно каждый программный модуль оформляется в виде отдельного перемещаемого сегмента. Это позволяет редактору связей скомпоновать программу оптимальным образом. При использовании абсолютных сегментов памяти программ пришлось бы это делать вручную, а так как в процессе написания программы размер программных модулей постоянно меняется, то пришлось бы вводить защитные области неиспользуемой памяти между программными модулями.
Пример использования перемещаемых сегментовв исходном тексте программы содержится в листинге 23.30. В этом примере приведен начальный участок основной программы микроконтроллера, на который производится переход с нулевой ячейки памяти программ. Использование такой структуры программы позволяет в любой момент времени при необходимости использовать любой из векторов прерывания, доступный в конкретном микроконтроллере, для которого пишется эта программа. Достаточно разместить определение этого вектора с использованием директивы cseg.
В приведенном примере использовано имя перемещаемого сегмента _code. Оно было объявлено в самой первой строке исходного текста программы. Конкретное имя перемещаемого сегмента может быть любым, но как уже говорилось ранее оно должно отображать ту задачу, которую решает данный конкретный модуль.
Листинг 23.30. Пример использования директив segment и rseg в программном модуле
_code segment code
CSEG AT 0 ;Вектор рестарта процессора
;Начало основной программы микроконтроллера -------------------------
call init ;Настроить микроконтроллер
Итак, подведем итоги
В данной главе рассмотрены основные средства языка программирования ASM-51, достаточные для написания довольно сложных программ, однако в процессе работы может потребоваться дополнительная информация, которую можно получить в описании языка программирования, поставляемом вместе с самой программой-транслятором.
Язык программирования ассемблер позволяет разрабатывать самые компактные и эффективные программы, однако процесс создания программ на этом языке трудоемкий, а это значит, что он занимает достаточно длительное время. В то же время в настоящее время предлагаются, причем по приемлемой цене, микросхемы с внутренними ресурсами, достаточными для размещения и выполнения программ, написанных на языке высокого уровня. Поэтому в настоящее время программы все чаще создаются на языке С как наиболее распространенном для микроконтроллеров. В следующей главе мы рассмотрим один из таких языков программирования — C-51.
Можно выделить три основных вида памяти, используемой в микроконтроллерах:
● память программ, которая представляет собой постоянную память, предназначенную для хранения программного кода и констант. Эта память не изменяет своего содержимого в процессе выполнения программы;
● память данных, предназначенная для хранения переменных (результатов) в ходе выполнения программы;
● регистровая память, состоящая из внутренних регистров микроконтроллера. Рассмотрим особенности каждого из перечисленных видов памяти.
О внешней памяти.
В тех случаях, когда для разрабатываемых приложений не хватает резидентной памяти программ и памяти данных, к микроконтроллеру подключается дополнительная внешняя память. Известны два основных способа:
● подключение внешней памяти с использованием шинного интерфейса (как в микропроцессорных системах). Для такого подключения многие микроконтроллеры имеют специальные аппаратные средства;
● подключение памяти к устройствам ввода–вывода, При этом обращение к памяти осуществляется через эти устройства программными средствами. Такой способ позволяет использовать простые устройства ввода/вывода без реализации сложных шинных интерфейсов. Выбор способа зависит от конкретного приложения.
Рис. Обозначение микросхем памяти
Работа с подобными микросхемами должна осуществляться следующим образом. Положим, мы хотим записать число 145D = 10010001В в ячейку с адресом 84D = 54Н = 1010100В. Для этого МК должен установить записываемое число на линиях данных D0-D7 микросхемы (D0=D4=D7=1, D1=D2-D3=D5=D6=0), а адрес ячейки – на адресных линиях (А2=А4=А6=1, А0=А1=АЗ=А5=0; А7, А8 и последующие старшие адреса вплоть до А10 для микросхем объемом 2К* 8 или до А12 для микросхем 8К*8 также должны быть установлены в 0). Установив адресную информацию и данные, МК одновременно с этим или чуть позже должен установить 0 на входе WE микросхемы (будет запись) и 0 на СЕ (знак того, что мы обращаемся именно к этой микросхеме). Как только после этого на входе ОЕ микросхемы памяти МК установит 0, осуществится запись числа 145 в ее 84-ю ячейку.
Соответственно, если мы хотим прочитать данные из все той же, к примеру, 84-й ячейки, мы должны, как и в предыдущем случае, установить адрес ячейки на адресных линиях, и одновременно с этим или чуть позже установить 1 на входе WE микросхемы (будет чтение) и 0 на СЕ (знак того, что мы обращаемся именно к этой микросхеме). Как только после этого на входе ОЕ микросхемы памяти МК установит 0, осуществится чтение числа из выбранной ячейки, и оно появится на линиях данных D 0- D 7 микросхемы памяти. Сказанное поясняется временными диаграммами, приведенными на рисунке далее.
Рис. Диаграммы чтения и замиси микросхем памяти
2. Пример подключения внешней памяти данных к микропроцессору Z 80
У Z 80 есть выводы трех так называемых шин – адреса, данных и управления.
Шестнадцать выводов Z 80 (А0, Al , А2. А14 и А15) называются адресными выходами, их соединяют с адресными входами микросхем памяти. Совокупность линий, осуществляющих эти соединения, и есть шина адреса. Соответственно, шина данных, состоящая из 8 проводников, соединяет выводы данных микросхем памяти и микропроцессора (у него, как и у микросхем памяти, их тоже 8, и обозначаются они также– D 0, D 1. D 7).
Из сигналов управления у Z 80 нас интересуют только два – eq \x \to ( RD ) ( Read - Чтение) и eq \x \to ( WR ) ( Write - Запись). С их помощью, как показано на рисунке 9, осуществляется управление памятью.
Рис. Подключение микросхем памяти к микропроцессору Z80
При обращении к памяти Z 80 формирует на своих выводах А0-А15 адрес ячейки, к которой будет происходить обращение (запись или чтение). Как будет показано чуть ниже, соответствующая комбинация сигналов на А13-А15 сформирует при помощи дешифратора DD 3 нулевой сигнал на входе СЕ той или иной микросхемы.
При записи на выводах данных D 0- D 7 процессора появится байт, который предстоит записать в память, и чуть-чуть позже его появления – нулевой сигнал на выходе WR ( RD при этом останется в 1). Как нетрудно догадаться, микросхема DD 2 в любом цикле обращения (как чтения, когда RD =0, так и записи, когда WR =0) сформирует нуль на входах ОЕ микросхем ОЗУ.
Соответственно при чтении выводы данных превращаются во входы, и на них процессор ничего не выводит, а после установки адреса он переводит в 0 сигнал RD ( WR при этом остается в 1).
Для обращения к 84-ой ячейки DD 5 процессор должен установить на адресной шине 0010000001010100В=2054Н=8276. Иначе говоря, 84-я ячейка памяти микросхемы DD 5 является 8276-й ячейкой системы памяти.
3. Пример подключения внешней памяти данных к микрокронтроллеру семейства x 51
Рис. Подключение микросхем памяти к микроконтроллеру семейства х51
Таким образом, работа МК с внешней памятью данных осуществляется следующим образом. Прочитав команду обращения к внешней памяти, микроконтроллер выводит по линиям порта Р2 старшие 8 бит адреса, а по линиям Р0 – младшие. Одновременно с этим он устанавливает в 1 сигнал на выходе ALE . Когда эта 1 поступает на вход STB регистра-защелки DD 3, информация с его входов D 0- D 7 напрямую поступает на выходы Q 0- Q 7, соединенные с младшими 8 линиями шины адреса. Спустя некоторое время ALE устанавливается в 0. Перепад из 1 в 0 на входе STB DD 3 приводит к защелкиванию в регистрах выходов Q 0- Q 7 поступающей на них информации, и защелкнутые младшие 8 бит адреса остаются неизменными на выходах Q 0- Q 7 до следующего цикла обмена с внешней памятью. Старшие 8 бит, выводимые через Р2, также не меняются до завершения текущего цикла работы с внешним ОЗУ.
Поскольку А0-А7 запомнены в регистре-защелке, они снимаются с выводов порта Р0, и последние превращаются в выводы шины данных. Если МК записывает данные во внешнее ОЗУ, записываемый байт выводится им на Р0.0-Р0.7, и устанавливается в 0 сигнал на его выходе WR (РЗ.6). Появление же нулевых сигналов на входах WE и ОЕ, соответствующей микросхемы памяти приводит к записи в нее байта, поданного на ее входы D 0- D 7. Нулевой сигнал на ОЕ, формирует микросхема DD 2. Сказанное иллюстрируется временными диаграммами на рисунке 11.
Рис. Временные диаграммы циклов обмена МК с внешней памятью данных
Процесс чтения информации микроконтроллером аналогичен только что рассмотренному процессу записи с той лишь разницей, что МК устанавливает в 0 не WR , a RD , и данные на шину данных поступают не с него, а с соответствующей микросхемы памяти.
Описанный способ выдачи адресной информации по выводам шины данных очень распространен (он применялся, например, в процессорах 8086/8088, на которых были выполнены первые IBM PC ), и называется мультиплексированием шин адреса/данных.
4. Подключения внешней памяти программ к микрокронтроллеру семейства x 51
Микроконтроллеры семейства х51 допускают работу с внешней памятью программ, в качестве которой выступают микросхемы ПЗУ объемом до 64 кбайт. Их подключение и работа аналогичны подключению и работе в режиме чтения микросхем памяти данных ОЗУ. В качестве сигнала чтения используется сигнал вывода eq \x \to ( PSEN) вместо сигнала eq \x \to ( RD) .
Микроконтроллеры (МК) семейства PIC16C5X построены по гарвардской архитектуре, в которой память программ и память данных разделены и имеют собственные адресные пространства.
Масочная память.
Масочные ПЗУ (Mask–ROMили просто ROM) изготавливаются на этапе производства микроконтроллеров для полностью отлаженной программы. На стеклянном фотошаблоне при использовании программы создается рисунок маски. Полученный фотошаблон с маской используется для формирования соединений между элементами, из которых состоит память программ.
Первые масочные ПЗУ появились в начале 1960–х годов и находят применение до настоящего времени благодаря таким достоинствам как низкая стоимость при массовом производстве изделий и высокая надежность хранения программ.
Недостатки масочных ПЗУ — любое изменение прикладной программы связано со значительными затратами средств и времени на создание нового комплекта фотошаблонов и их внедрение в производство.
Однократно программируемая память.
Эта память (One–Time Program mable ROM — OTPROM ) программируется пользователем и в исходном состоянии содержит ячейки с единичными битами. Программированию подлежат только те ячейки памяти, содержимое которых должно принять значение 0. Для этого на ячейку памяти подают последовательность импульсов повышенного напряжения.
Уровень напряжения, число импульсов и их временные параметры должны строго соответствовать техническим условиям. После записи нуля восстановить единичное значение невозможно. По этой причине память получила название однократно программируемых ПЗУ. Однако следует указать на возможность допрограммирования (не тронутых) ячеек с единичными битами.
Микроконтроллеры с однократно программируемым ПЗУ используются в изделиях, выпускаемых небольшими партиями.
Репрограммируемая память с ультрафиолетовым стиранием.
Ячейка памяти с ультрафиолетовым стиранием (Erasable Programmable ROM — EPROM) представляет собой ЛИПЗМОП (лавинно–инжекционный с плавающим затвором) транзистор. В исходном состоянии (до записи) при обращении к ячейке считывается логическая единица. Программирование памяти сводится к записи в соответствующие ячейки логических нулей. Память ЕР ROM допускают многократное программирование, технология которого подобна технологии однократно программируемых ПЗУ.
Перед каждым сеансом программирования выполняется операция стирания для восстановления исходного состояния ячеек памяти. Для этого в корпусе микроконтроллера предусмотрено специальное окно, которое облучается ультрафиолетовыми лучами. Число сеансов стирания/программирования ПЗУ составляет 25–100 раз при соблюдении технологии программирования (заданные значения питающих напряжений, число и длительность импульсов) и технологии стирания (волновой диапазон источника ультрафиолетового излучения).
Микроконтроллеры с памятью EPROM из–за высокой стоимости применяются в опытных образцах разрабатываемых приложений.
Для уменьшения цены микросхемы EPROM заключают в корпус без окошка (версия EPROM с однократным программированием). Благодаря снижению стоимости версии EPROM часто используются вместо масочно–программируемых ROM.
Регистровая память.
Микроконтроллеры (как и компьютерные системы) имеют множество регистров, которые используются для управления различными внутренними узлами и внешними устройствами. К ним относятся:
● регистры процессорного ядра (аккумулятор, регистры состояния, индексные регистры);
● регистры управления (регистры управления прерываниями, регистры управления таймером);
● регистры ввода/вывода данных (регистры данных и регистры управления параллельным, последовательным или аналоговым вводом/выводом).
По способу размещения регистров в адресном пространстве можно выделить:
● микроконтроллеры, в которых все регистры и память данных располагаются в одном адресном пространстве, т. е. регистры совмещены с памятью данных. В этом случае устройства ввода–вывода отображаются на память;
● микроконтроллеры, в которых устройства ввода/вывода отделены от общего адресного пространства памяти. Основное достоинство способа размещения регистров ввода–вывода в отдельном пространстве адресов — упрощается схема подключения памяти программ и данных к общей шине. Отдельное пространство ввода–вывода дает дополнительное преимущество процессорам с Гарвардской архитектурой, обеспечивая возможность считывать команду во время обращения к регистру ввода–вывода.
Способы обращения к регистрам оказывают существенное влияние на их производительность. В процессорах с RISC–архитектурой все регистры (часто и аккумулятор) располагаются по явно задаваемым адресам, что обеспечивает более высокую гибкость при организации работы процессора.
Репрограммируемая память с электрическим стиранием.
В качестве элемента памяти с электрическим стиранием (Electrically Erasable Pro grammable ROM — EEPROM или E2 PROM) используется транзистор со структурой МНОП (Металл, Нитрид кремния, Окисел кремния, Полупроводник), благодаря чему ПЗУ имеет сравнительно низкую стоимость (по отношению к EPROM) и допускает максимальное число циклов стирания/программирования 10 4 –10 6 . Кроме того, технология программирования памяти EEPROM позволяет реализовать побайтное стирание и побайтное программирование, не снимая контроллер с платы, что позволяет периодически обновлять его программное обеспечение.
Несмотря на указанные достоинства, этот тип памяти не получил широкого распространения для хранения программ по двум причинам:
● ПЗУ типа EEPROM имеют ограниченную емкость;
● появились ПЗУ типа FLASH , которые имеют близкие пользовательские характеристики, но более низкую стоимость.
Способы адресации
Для обращения к памяти данных (специальным регистрам и регистрам общего назначения) используется косвенная и прямая (относительная) адресация (рис.6.3.4).
Косвенная адресация реализуется с помощью псевдорегистра INDF (физически не существующего, но имеющего адрес 00h) и регистра косвенной адресации FSR (рис.6.3.3, а).
Псевдорегистр INDF служит указателем регистра FSR, в котором находится адрес запрашиваемого регистра данных: биты 6, 5 задают номер банка (00 — банк 0, 01 — банк 1,10 — банк 2, 11 — банк 3), биты 4.
0 используются для адресации регистра данных внутри банка, при этом:
● бит 4 переключает адрес между 16–ю регистрами первой и второй групп;
● биты 3.
0 адресуют регистры в пределах каждой группы.
Так как в банках 1, 2 и 3 отсутствуют регистры по 16 младшим адресам, при обращении по этим адресам реализуется доступ только к группе регистров банка О с младшими адресами 00h.
Например, при обращении по адресам 23h, 43h, 63h обеспечивается доступ к регистру STATUS, имеющему адрес 03h.
В этих случаях бит 4 регистра FSR автоматически устанавливается в 0, а состояние битов 6 и 5 FSR игнорируется.
При обращении по старшим адресам 10h.
1Fh биты 6 и 5 FSR задают номер банка, а бит 4 устанавливается в единичное состояние (рис.6.3.4).
Прямая адресация обеспечивает доступ только к регистрам банка 0 с помощью младших разрядов кода команд (рис.6.3.4), поступающих по 5–битной шине из дешифратора команд (рис.6.2.1).
Поскольку биты 6 и 5 псевдорегистра FSR действуют постоянно, по сути дела при обращении к страницам 1, 2, 3 осуществляется способ относительной адресации.
Память типа FLASH.
Электрически программируемая и электрически стираемая память типа FLASH (FLASH ROM) создавалась как альтернатива между дешевыми однократно программируемыми ПЗУ большой емкости и дорогими EEPROM ПЗУ малой емкости. Память FLASH (как и EEPROM) сохранила возможность многократного стирания и программирования.
Из схемы ПЗУ изъят транзистор адресации каждой ячейки, что, с одной стороны, лишило возможности программировать каждый бит памяти отдельно, с другой стороны, позволило увеличить объем памяти. Поэтому память типа FLASH стирается и программируется страницами или блоками.
Таким образом, функционально FLASH –память мало отличается от EEPROM. Основное отличие состоит в способе стирания записанной информации: если в EEPROM–памяти стирание производится отдельно для каждой ячейки, то во FLASH –памяти — целыми блоками. В микроконтроллерах с памятью EEPROM приходится изменять отдельные участки программы без необходимости перепрограммирования всего устройство.
В настоящее время МК с FLASH начинают вытеснять МК с однократно программируемым (и даже масочным) ПЗУ.
Память программ.
Максимальный объем памяти программ MК PIC16C5X составляет 2048 ячеек по 12 бит. Память программ разбивается на страницы, каждая из которых содержит 512 слов (ячеек). Ранние модели МК имеют всего 512 ячеек памяти программ, относящихся к нулевой странице адресного пространства (рис.6.3.1).
Поэтому разрядность счетчика команд PC равна 9 (А8–А0). В поздних моделях память программ содержит 4 страницы.
Память программ.
Необходимость такой памяти вызвана тем, что микроконтроллер не содержит таких устройств памяти, как винчестер в компьютере, с которого загружается исполняемая программа. Поэтому код программы должен постоянно храниться в микроконтроллере.
Все типы памяти программ относятся к энергонезависимой памяти, или постоянной памяти (ПЗУ), содержимое которой сохраняется после выключения питания микроконтроллера.
В процессе выполнения программа считывается из этой памяти, а блок управления (дешифратор команд) обеспечивает ее декодирование и выполнение необходимых операций. Содержимое памяти программ не может меняться (перепрограммироваться) во время выполнения программы. Поэтому функциональное назначение микроконтроллера не может измениться, пока содержимое его памяти программ не будет стерто (если это возможно) и перепрограммировано (заполнено новыми командами).
Следует обратить внимание, что разрядность микроконтроллера (8, 16 или 32 бит) указывается в соответствии с разрядностью его шины данных.
Когда говорится, что устройство является 8–разрядным, это означает разрядность данных, которые способен обрабатывать микроконтроллер.
В Гарвардской архитектуре команды могут иметь большую разрядность, чем данные, чтобы дать возможность считывать за один такт целую команду. Например, микроконтроллеры PIC в зависимости от модели используют команды с разрядностью 12, 14 или 16 бит. В микроконтроллерах AVR команда всегда имеет разрядность 16 бит. Однако все эти микроконтроллеры имеют шину данных разрядностью 8 бит.
В устройствах с Принстонской архитектурой разрядность данных обычно определяет разрядность (число линий) используемой шины. В микроконтроллерах Motorola 68НС05 24–разрядная команда размешается в трех 8–разрядных ячейках памяти программ. Для полной выборки такой команды необходимо произвести три цикла считывания этой памяти.
Выделим и рассмотрим пять типов энергонезависимой резидентной памяти, или постоянных запоминающих устройств (ПЗУ), используемых для хранения программ.
Особенности стека.
В микроконтроллерах для организации вызова подпрограмм и обработки прерываний выделяется часть памяти ОЗУ, именуемая стеком. При этих операциях содержимое программного счетчика и основных регистров (аккумулятора, регистра состояния, индексных и других регистров) сохраняется, а при возврате к основной программе восстанавливается. Напомним, что стек работает по принципу: последний пришел — первый ушел (Last In , First Out—LIFO).
В Принстонской архитектуре ОЗУ используется для реализации многих аппаратных функций, включая функции стека. В адресном пространстве памяти выделены отдельные области для команд, регистров общего назначения, регистров специальных функций и др. Это снижает производительность контроллера, так как обращения к различным областям памяти не могут выполняться одновременно.
Микропроцессоры с Гарвардской архитектурой могут параллельно (одновременно) адресовать память программ, память данных (включающую пространство ввода–вывода) и стек.
Например, при активизации команды вызова подпрограммы CALL выполняется несколько действий одновременно.
В Принстонской архитектуре при выполнении команды CALL следующая команда выбирается только после того, как в стек будет помещено содержимое программного счетчика.
Из–за небольшой емкости ОЗУ в микроконтроллерах обеих архитектур могут возникнуть проблемы при выполнении программы:
● если выделен отдельный стек, то после его заполнения происходит циклическое изменение содержимого указателя стека, в результате чего указатель стека начинает ссылаться на ранее заполненную ячейку стека. Поэтому после слишком большого количества команд CALL в стеке окажется неправильный адрес возврата, который был записан вместо правильного адреса;
● если микропроцессор использует общую область памяти для размещения данных и стека, то при переполнении стека произойдет затирание данных. Рассмотрим особенности сохранения в стеке содержимого регистров, обусловленные отсутствием команд загрузки в стек (PUSH) и извлечения из стека (POP). В таких микроконтроллерах вместо команды PUSH и POP используются две команды и индексный регистр, который явно указывает на область стека. Последовательность команд должна быть такой, чтобы прерывание между первой и второй командой не привело к потере данных. Ниже приведена имитация команд PUSH и POP с учетом указанного требования.
PUSH ; Загрузить данные в стек decrement index; Перейти к следующей ячейке стека move [ index], асе ; Сохранить содержимое аккумулятора в стеке POP ; Извлечь данные из стека move асе, [index]; Поместить значение стека в аккумулятор increment index ; Перейти к предыдущей ячейке стека
Если после первой команды программа будет прервана, то после выполнения обработки прерывания содержимое стека не будет потеряно.
Память данных.
В качестве резидентной памяти данных используется статическое оперативное запоминающее устройство (ОЗУ), позволяющие уменьшать частоту тактирования до сколь угодно малых значений. Содержимое ячеек ОЗУ (в отличие от динамической памяти) сохраняется вплоть до нулевой частоты. Еще одной особенностью статического ОЗУ является возможность уменьшения напряжения питания до некоторого минимально допустимого уровня, при котором программа управления микроконтроллером не выполняться, но содержимое в ОЗУ сохраняется.
Уровень напряжения хранения имеет значение порядка одного вольта, что позволяет для сохранения данных при необходимости перевести МК на питание от автономного источника (батарейки или аккумулятора). Некоторые МК (например, DS5000 фирмы Dallas Semiconductor) имеют в корпусе автономный источник питания, гарантирующий сохранение данных в ОЗУ на протяжении 10 лет.
Характерной особенностью микроконтроллеров является сравнительной небольшой объем (сотни байт) оперативной памяти (ОЗУ), используемой для хранения переменных. Это можно объяснить несколькими факторами:
● стремлением к упрощению аппаратных средств МК;
● использованием при написании программ некоторых правил, направленных на сокращение объема памяти ОЗУ (например, константы не хранятся как переменные);
● распределением ресурсов памяти таким образом, чтобы вместо размещения данных в ОЗУ максимально использовать аппаратные средства (таймеры, индексные регистры и др.);
● ориентацией прикладных программы на работу без использования больших массивов данных.
Программирование ПЗУ.
Отметим, что Mask ROM –память программируется только в заводских условиях при изготовлении МК. Память типа OTPROM и EPROM предоставляет разработчику возможности программирования с использованием программатора и источника повышенного напряжения, которые подключаются к соответствующим выводам МК.
Память EEPROM и FLASH относится к многократно программируемой, или репрограммируемой, памяти. Необходимое для стирания/программирования повышенное напряжение питания создается в модулях EEPROM и FLASH –памяти современных контроллеров с помощью встроенных схем усиления напряжения, называемых генераторами накачки. Благодаря реализации программного управления включением и отключением генератора накачки появилась принципиальная возможность осуществить программирование или стирание ячеек памяти FLASH и EEPROM в составе разрабатываемой системы. Такая технология программирования получила название программирования в системе (In System Programming — ISP).
Она не требует специального оборудования (программаторов), благодаря чему сокращаются расходы на программирование. Микроконтроллеры с ISP–памятью могут быть запрограммированы после их установки на плату конечного изделия.
Рассмотрим, как реализуется (и используется) возможность программирования EEPROM–памяти под управлением прикладной программы. Если программу с алгоритмом программирования хранить в отдельном модуле памяти с номинальным питающим напряжением, а EEPROM–память снабдить генераторами накачки, то можно произвести ISP–программирование EEPROM –памяти. Данное обстоятельство делает EEPROM –память идеальным энергонезависимым запоминающим устройством для хранения изменяемых в процессе эксплуатации изделия настроек пользователя. В качестве примера можно привести современный телевизор, настройки каналов которого сохраняются при отключении питания.
Поэтому одной из тенденций совершенствования резидентной памяти 8–разрядных МК стала интеграция на кристалл МК двух модулей энергонезависимой памяти: FLASH (или OTP ) — для хранения программ и EEPROM — для хранения перепрограммируемых констант.
Рассмотрим технологию (ре)программирования FLASH –памяти с встроенным генератором накачки под управлением прикладной программы. Прежде всего, отметим два обстоятельства:
● если для хранения перепрограммируемых констант в МК встроена память EEPROM, то попрограммирование нескольких бит FLASH –памяти при эксплуатации готового изделия не имеет смысла. При необходимости лучше сразу использовать режим репрограммирования;
● не следует программу программирования FLASH –памяти хранить в самой FLASH –памяти, так как переход в режим программирования приведет к невозможности дальнейшего ее считывания. Программа программирования должна располагаться в другом модуле памяти.
Для реализации технологии программирования в системе выбирается один из оследовательных портов МК, обслуживание которого осуществляет специальная программа монитора связи, расположенная в резидентном масочном ПЗУ МК. Через последовательный порт персональный компьютер загружает в ОЗУ МК программу программирования и прикладную программу, которая затем заносится в память FLASH. Так как резидентное ОЗУ МК имеет незначительный объем, то прикладная программа загружается отдельными блоками (порциями). Если в МК установлен модуль масочной памяти с программой программирования, в ОЗУ загружается только прикладная программа.
Микроконтроллеры, реализующие технологию программирования в системе, часто имеют в своем составе четыре типа памяти:
FLASH –память программ, Mask ROM –память монитора связи, EEPROM –память для хранения изменяемых констант и ОЗУ промежуточных данных.
Технология программирования в системе в настоящее время все шире используется для занесения прикладных программ в микроконтроллеры, расположенные на плате конечного изделия. Ее достоинство — отсутствие программатора и высокая надежность программирования, обусловленная стабильностью заданных внутренних режимов МК.
В качестве примера приведем показатели резидентной FLASH –памяти МК семейства НС08 фирмы Motorola:
● гарантированное число циклов стирания/программирования — 10 5 ;
● гарантированное время хранения записанной информации — 10 лет, что практически составляет жизненный цикл изделия; модули FLASH –памяти работают и программируются при напряжении питания МК от 1,8 до 2,7 В;
● эквивалентное время программирования 1 байта памяти — 60 мкс.
Память данных
В регистровой памяти МК выделяются две группы регистров:
● специальные регистры, к которым относятся:
• адресуемые 8–разряные регистры (рис.6.3.3, а): псевдорегистр (INDF), регистр таймера/счетчика реального времени (TMR0), регистр счетчика команд (А10, А9, А8, PCL), регистр состояния (STATUS), регистр косвенной адресации (FSR) и регистры ввода/вывода (PORTA, PORTA, PORTC);
• рабочий регистр W, регистр состояния OPTION, регистры управления портами TRISA, TRISB, TRISC (рис.6.3.3, б), доступ к которым осуществляется с помощью специальных команд;
• регистр конфигурации CONFIG, не имеющий доступа.
Информация (выбранный тип генератора, разрешение/запрещение сторожевого таймера и включение/выключение бита защиты от считывания программного кода) в этот регистр заносится на этапе программирования микроконтроллера;
● регистры общего назначения, которые используются программой для хранения переменных по усмотрению пользователя.
Эти 8–разрядные регистры, разделенные на 4 банка по 16 регистров в каждом, и составляют основной объем памяти данных (рис.6.2.2).
Адресное пространство памяти данных объединяет регистры специальных функций и регистры общего назначения.
Специальные регистры и часть регистров общего назначения с адресами 00h.
1Fh отнесены к банку 0.
Поэтому он содержит 32 8–разрядных регистра, в то время как остальных три банка — по 16 регистров.
Для обращения к регистрам в банках 1, 2, 3 выделены соответственно адреса ЗОh.ЗFh, 50h.5Fh, 70h.7Fh.
Таким образом, адресное пространство памяти данных имеет «дыры».
Отметим, что каждый бит любого адресуемого регистра доступен 4 битным командам.
Адресация памяти программ
Прямая адресация памяти возможна только в пределах одной страницы, при этом:
● команда GOTO k (0 ≤ k ≤ 511 ) позволяет обратиться по всем адресам страницы (рис.6.3.2, а);
● команда CALL k (0 ≤ k ≤ 255) и команды, изменяющие содержимое счетчика команд PC, обеспечивают доступ к младшим адресам (0–7) страницы, 8–й бит сбрасывается (рис.6.3.2, б).
Для доступа к памяти свыше 512 ячеек используется, указатель страницы, представляющий собой биты 6 (РА1) и 5 (РА0) регистра состояния (признаков) STATUS процессора (рис.6.2.1).
Указатель переключается под управлением программы и реализует по сути дела относительную адресацию.
Читайте также: