Как быть, если в дополнение к подключению внешней памяти необходимо организовать передачу полутора — двух десятков управляющих сигналов от микроконтроллера к внешним устройствам? Возможный вариант — использование необходимого количества 8-разрядных регистров (буферов) с обращением к ним, как к ячейкам памяти, расположенным в общем адресном пространстве внешней памяти. На рис. 6.26 — фрагмент схемы, реализующий такое подключение. Данный фрагмент и фрагмент, изображенный на рис. 6.20, являются частями одной схемы, а шина BUS1 является общей для обоих рисунков.
Три адресные линии А13…А15 остались свободными при подключении внешней памяти объемом 8Кх8, используем их для записи данных в три 8-разрядных регистра DD6…DD8.
Использование дополнительной микросхемы дешифратора адреса А13…А15 позволило бы подключить до восьми (23) регистров.
Входные контакты D0…D7 регистров DD6…DD8 подключены к порту А микроконтроллера (линии A/D0…A/D7). К выходным контактам 00…07 регистров можно подключить до 24-х линий внешних устройств (линии В0…В23). Выходы регистров всегда активны и не переводятся в третье состояние, поэтому контакты ЕО регистров соединены с общим проводом.
Рис. 6.26.
Запись данных в регистры происходит при появлении высокого уровня на их контактах С. Микроконтроллер же формирует низкий уровень записи во внешнюю память (сигнал WR). В схеме для формирования сигнала записи высокого уровня применены элементы ИЛИ-HE (микросхема DD4).
В этой схеме сигнал высокого уровня на линии WB3 для записи данных в регистр DD6 образуется при низких уровнях сигналов на линиях А15 и WR. То есть, чтобы запись произошла в один регистр DD6, необходимо, чтобы на линиях WR и А15 был низкий уровень, на линиях А13 и А14 — высокие уровни.
Одновременное присутствие низких уровней на всех четырех линиях (WR, А13…А15) вызовет параллельную запись данных в три регистра.
Приведенная схема подключения регистров требует тщательного подхода к выбору адресов при написании программы.
Запись в регистр DD6 должна происходить при А15=0, А14=1 и А13=1, то есть, в двоичном коде адрес
регистра DD6: 011х хххх хххх хххх,
регистра DD7: 101х хххх хххх хххх,
регистра DD8: 110х хххх хххх хххх.
Для того, чтобы данные не записывались в регистры, адрес должен иметь вид:
111х хххх хххх хххх, где х — состояние бита (0 или 1) не имеет значения.
Хотя состояния битов х не имеют значения, они должны быть определены. Это значит, что при записи в какой-либо регистр на контактах А0…А12 микросхемы памяти (рисунок bvn_Pic1.gif) будет сформирован адрес, а в ячейку с этим адресом будет произведена запись того же значения, которое посылается в регистр. Надо позаботиться, чтобы ячейка с таким адресом не использовалась для хранения данных.
Удобно определить все биты х равными единице. Тогда адреса регистров примут вид:
адрес DD6: 0111 1111 1111 1111 или $7FFF,
адрес DD7: 1011 1111 1111 1111 или SBFFF,
адрес DD6: 1101 1111 1111 1111 или SDFFF,
а в ячейке памяти с адресом xxx1 1111 1111 1111 нельзя хранить данные, линии адреса А13…А15, соответствующие битам ххх в этом адресе, к микросхеме памяти не подключены.
Поэтому, какими бы они ни были, запись производится в одну и ту же ячейку. Однако при записи в память ххх следует определить как 111 для того, чтобы не произошло параллельной записи в регистры. Значит, данные нельзя хранить в ячейке 1111 1111 1111 1111 или SFFFF.
Для хранения данных доступны ячейки памяти с адресами
1110 0000 0000 0000… 1111 1111 1111 1110 или $E000…$FFFE.
В разделе «Интерфейс микроконтроллера AT90S8515 для подключения внешней памяти» была обозначена нижняя граница доступной для безопасного хранения данных области памяти: адрес $0060.
С учетом этого ограничения для безопасного хранения данных доступны ячейки памяти с адресами $E060…$FFFE.
Есть более привлекательный вариант распределения памяти: при записи в регистр параллельно производить запись в соответствующую этому регистру ячейку памяти. При этом всегда можно проверить, что именно записывалось в регистр, считав данные из ячейки памяти.
Выберем для регистров следующие адреса:
адрес DD6: 0111 1111 1111 1101 или $7FFD,
адрес DD7: 1011 1111 1111 1110 или $BFFE,
адрес DD6: 1101 1111 1111 1111 или $DFFF.
Теперь для безопасного хранения данных доступны ячейки памяти с адресами $E060…$FFFC, а из ячеек с адресами $FFFD, $FFFE и $FFFF можно считать данные, которые были записаны в регистры DD8, DD7 и DD6 соответственно.