![]() |
Главная Микроконтроллеры [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [ 82 ] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] В предыдущем примере рассматривалось подключение внещней памяти к AT90S8515. Из четырех портов микроконтроллера порты А и С, а также два контакта порта D заняты обслуживанием внещней памяти. Как быть, если в дополнение к подключению внещней памяти необходимо организовать передачу полутора - друх десятков управляющих сигналов от микроконтроллера к внещним устройствам? Возможный вариант - использование необходимого количества 8-разрядных регистров (буферов) с обращением к ним, как к ячейкам памяти, расположенным в общем адресном пространстве внещней памяти. На рис. 6.26 - фрагмент схемы, реализующий такое подключение. Данный фрагмент и фрагмент, изображенный на рис. 6.20, являются частями одной схемы, а щина BUS1 является общей для обоих рисунков. Три адресные линии А13...А15 остались свободными при подключении внещней памяти объемом 8Кх8, используем их для записи данных в три 8-разрядных регистра DD6...DD8. Использование дополнительной микросхемы дешифратора адреса А13...А15 позволило бы подключить до восьми (23) регистров. Входные контакты D0...D7 регистров DD6...DD8 подключены к порту А микроконтроллера (линии A/D0...A/D7). К выходным контактам О0...О7 регистров можно подключить до 24-х линий внешних устройств (линии В0...В23). Выходы регистров всегда активны и не переводятся в третье состояние, поэтому контакты ЕО регистров соединены с общим проводом. ![]()
АЛЗО 2 DD7 КР1533ИРЗЗМ A/D1 3 A/D2 4 A/D3 5 АЮ4 6 Ams 7 АЮ6 8 A/D7 9 WB211 19 В8 18 В9 17 BIO 16 В11 15В12 14В13 13В14 12В15 A/D2 4 A/D3 5 DD8 КР1533ИРЗЗМ АЛ30 2„„-, l„„119B16 A/D1 3 АЛ>4 6 A/D5 7 A/D6 8 A/D7 9 WB1 11 18В17 17 В18 18 В19 15 В20 14В21 13В22 12 В23 Запись данных в регистры происходит при появлении высокого уровня на их контактах С. Микроконтроллер же формирует низкий уровень записи во внешнюю память (сигнал WR). В схеме для формирования сигнала записи высокого уровня применены элементы ИЛИ-НЕ (микросхема DD4). В этой схеме сигнал высокого уровня на линии WB3 для записи данных в регистр DD6 образуется при низких уровнях сигналов на линиях А15 и WR. То есть, чтобы запись произошла в один регистр DD6, необходимо, чтобы на линиях WR и А15 был низкий уровень, на линиях А13 и А14 - высокие уровни. Одновременное присутствие низких уровней на всех четырех линиях (WR, А13...А15) вызовет параллельную запись данных в три регистра. Приведенная схема подключения регистров требует тщательного подхода к выбору адресов при написании программы. Запись в регистр DD6 должна происходить при А 15=0, А 14=1 и А 13=1, то есть, в двоичном коде адрес регистра DD6: 011х хххх хххх хххх, регистра DD7: lOlx хххх хххх хххх, регистра DD8: 110х хххх хххх хххх. Для того, чтобы данные не записывались в регистры, адрес должен иметь вид: 111х хххх хххх хххх, где X - состояние бита (О или 1) не имеет значения. Хотя состояния битов X не имеют значения, они должны быть определены. Это значит, что при записи в какой-либо регистр на контактах А0...А12 микросхемы памяти (рисунок bvn Picl.gif) будет сформирован адрес, а в ячейку с этим адресом будет произведена запись того же значения, которое посылается в регистр. Надо позаботиться, чтобы ячейка с таким адресом не использовалась для хранения данных. Удобно определить все биты х равными единице. Тогда адреса регистров примут вид: адрес DD6: 1101 1111 1111 1111 или SDFFF, а в ячейке памяти с адфесом xxxl 1111 1111 1111 нельзя хранить данные, линии адреса А13...А15, соответствующие битам ххх в этом адресе, к микросхеме памяти не подключены. Поэтому, какими бы они ни были, запись производится в одну и ту же ячейку. Однако при записи в память ххх следует определить как 111 для того, чтобы не произошло параллельной записи в регистры. Значит, данные нельзя хранить в ячейке 1111 1111 1111 1111 или $FFFF. Для хранения данных доступны ячейки памяти с адресами 1110 0000 0000 0000 ... 1111 1111 1111 1110 или $EOOO...$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 соответственно. Считывая данные из ячеек, соответствующих регистрам, мы получаем информацию о том, что записывалось в эти регистры. Следовательно, считывание данных правомерно только после первой записи в регистры. Поэтому рекомендую в начале программы записать исходные данные в регистры. [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [ 82 ] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] 0.0014 |