Главная Микроконтроллеры [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] на 6 часов 55 минут, после чего запускает цикл сканирования индикатора и цикл счета времени. Вся дальнейшая работа программы состоит в реализации пустого цикла, из которого ее выводят запросы прерываний от таймеров-счетчиков и в который она снова возвращается после завершения обработчика. Основой программы являются два обработчика прерываний от таймеров. Обработчик прерывания от таймера-счетчика Т/СО используется для динамической индикации, а обработчик от таймера-счетчика Т/С1 считает время. Естественно, можно было бы организовать сканирование индикатора и без привлечения прерывания от таймера и применить более дешевый кристалл, например AT90S1200. Но непривычность работы с аппаратным стеком (автор много лет до этого занимался 80X86), недостаточный объем памяти и незначительное отличие между этими контроллерами в цене говорят явно не в пользу такого решения. Обработчик счета времени вызывается каждую секунду. Он является более приоритетным, чем обработчик сканирования индикатора. В этом обработчике также выполняется определение состояния клавиш часов и при необходимости - перевод времени, переход в режим часов/будильника, а также проверяется равенство текущего времени установкам будильника. Обработчик сканирования индикатора вызывается около 1600 раз в секунду и по очереди отображает каждую из цифр текущего времени, т. е. каждая цифра появляется на индикаторе примерно 400 раз в секунду. Кстати, изменяя в разумных пределах частоту сканирования, легко регулировать яркость свечения индикатора. Дальнейшие пояснения работы программы вы сможете получить, просмотрев ее текст с подробными комментариями. Резюме К сожалению, автору не удалось численно определить точность хода часов. Можно сказать лишь одно - за месяц часы отстали примерно на минуту, что, согласитесь, вполне приемлемо для устройства такого класса. Файлы, относящиеся к проекту, находятся на компакт-диске, прилагаемом к книге. Автор: Игорь Коваль (E-mail: kovigor@yahoo.com). 6.17. Подключение внешнего статического оперативного запоминающего устройства Разработчики устройств на микроконтроллерах постоянно сталкиваются с задачей временного хранения данных, однако объема внутреннего SRAM (Static Random Access Memory - статическое запоминающее устройство с произвольным доступом, далее - память) зачастую недостаточно. Для облегчения решения такой задачи микроконтроллер AT90S8515 (AT90LS8515) снабжен интерфейсом для подключения внешней памяти объемом до 64 Кбайт. Интерфейс для подключения внешней памяти Интерфейс включает в себя: • порт А: шина младшего байта адреса / шина данных; • порт С: шина старшего байта адреса; • контакт ALE (Address Latch Enabled): разрешение фиксации адреса; • контакты RD и WR: стробы записи и считывания. Для инициализации работы интерфейса надо установить (в единицу) бит SRE (Static RAM Enable - разрешение работы с внешней памятью) регистра MCUCR (MCU Control Register - регистр управления микроконтроллера). Теперь при использовании стандартных команд работы с памятью (команды LD, LDD, LDS, ST, STD и STS) микроконтроллер может обращаться к ячейкам памяти, адреса которых лежат в диапазоне $0060...$FFFF (знак «$» используется в тексте для обозначения шестнадцатеричных чисел, так же, как это должно быть записано в программе на Ассемблере для AVR Studio; указанный диапазон адресов в десятичной форме будет иметь вид 96...65535). Свободно размещать данные в памяти микроконтроллера AT90S8515 можно, начиная с адреса $0060, как при работе с внутренней оперативной памятью, так и при использовании интерфейса внешней памяти, поскольку адреса оперативной памяти $0000...$001F заняты регистрами общего назначения г0...г31 (десятичное число 31 равно шестнадцатеричному числу $001F), адреса $0020...$005F отведены для регистров ввода-вывода. Замечание. Если до инициализации интерфейса линии порта А, порта С и контакты PD6 (WR) и PD7 (RD) порта D были запрограммированы как линии ввода или вывода, установка бита SRE перепрограмлшрует эти линии для работы с внешней памятью. Если бит SRE сбросить (в ноль), работа с внешней памятью прекращается, устанавливается обычный режим работы портов А, С и контактов PD6 и PD7 порта D, а область оперативной памяти, к которой может обращаться микроконтроллер AT90S8515 ограничивается диапазоном $0060...$025F (всего 512 байт). Примечание. При работе в диапазон адресов, например, $2220...$222F количество адресуемых ячеек не 15 ($222F-$2220=$F), а 16 ($F+1), так как обращение происходит и к ячейке с адресом $2220. Порт А служит как для формирования младшего байта адреса, так и для передачи данных, в то время, как порт С поддерживает на своих линиях старший байт адреса в течение всего цикла обращения к внешней памяти. Для фиксации младшего байта адреса необходимо использовать дополнительный элемент хранения с записью положительным уровнем. Для этого подойдет 8-разрядный регистр 74HCT573N. При высоком уровне сигнала на контакте ALE младший байт адреса, сформированный на восьми линиях порта А, записывается в регистр. При низком уровне на контакте ALE через порт А передаются данные. Сигналы на контактах WR и RD микроконтроллера активны только во время обращения к внешней памяти. Обращение к внутренней памяти происходит за три цикла микроконтроллера. Обращение к внешней памяти происходит за три цикла микроконтроллера, однако можно удлинить время обращения на один дополнительный цикл, установив бит SRW (External SRAM Wait State - состояние ожидания внешней памяти) в регистре MCUCR. [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.0012 |