I
МИКРОКОНТРОЛЛЕРЫ
- необходимо их восстановить!
Еще раз обращаем внимание на
порядок следования команд
push
и
pop
- команды
pop
следуют в
порядке, обратном следованию ко-
манд
push!
2. Следующие команды
Idr
под-
готавливают к работе соответству-
ющие сегментные регистры. Сег-
мент
при этом будет использо-
ван для рабочих ячеек памяти, а
через сегментный регистр #С будет
виден сегмент одного из автома-
тов. Сразу же с помощью команды
movl
подготавливаем и перемен-
ную цикла - нам надо будет прове-
рить четыре автомата.
3.
Команда
mov %а1,% М
счи-
тывает состояние линий порта А, а
следующая за ней команда - копи-
рует это же состояние в ячейку
%а2.
4. Первый раз в наших приме-
рах мы используем команду
хог -
исключающее ИЛИ. Это очень “хит-
рая" команда: она определяет, ка-
кие биты в одном байте отличны от
битов другого байта. Если читатель
помнит, в ячейке %а0 у нас храни-
лось начальное (точнее говоря,
предыдущее) состояние кнопок.
Выполнив команду
хог
над теку-
щим и предыдущим состоянием
кнопок, мы узнаем, состояние ка-
ких кнопок
изменилось
с момента
последнего прерывания от порта А!
5. А вот теперь - необходимо
проверить, относится ли изменив-
шаяся кнопка к нашему автомату.
Для этого мы переписываем байт,
содержащий биты изменившихся
линий, во временную ячейку
%аЗ,
после чего выполняем операцию И
(команда
and)
над этой ячейкой и
ячейкой
%с0
из текущего автома-
та (вспомните - там расположен
бит, указывающий, какая кнопка
относится к нашему автомату).
Если в результате операции полу-
чится ненулевой результат, значит,
изменившаяся кнопка относится к
нашему автомату! Байт, хранящий-
ся в ячейке
%с0,
носит в програм-
мистской литературе название
маски,
потому что налагая этот байт
(с помощью команды
and)
на байт
состояний кнопок, мы
маскируем
с
помощью него все ненужные биты,
4 6 | ----------------------------------------------------------------
оставляя только те которые в дан-
ном случае имеют для нас интерес
(все ненужные биты после выполне-
ния команды
and
будут сброшены,
а нужные - останутся в исходном
состоянии). Нужные биты в маске
выделяются единицами, ненужные
- нулями.
Техника применения
масок
- это типовой прием програм-
мирования, и им следует хорошо
владеть.
6. Итак, изменившаяся кнопка
относится к нашему автомату, и мы
должны обработать факт ее изме-
нения. Прежде, чем это делать, не-
обходимо определить, как именно
изменилось ее состояние (была ли
кнопка нажата или отпущена). Для
этого мы вновь переписываем во
временную ячейку
%аЗ
ячейку
%а0
(в ней у нас хранится текущее со-
стояние линий порта А), после чего
выполняем операцию И над этой
ячейкой и той же самой
маской,
что
и в предыдущем случае. Если ре-
зультат операции ненулевой - кноп-
ка была отпущена, если нулевой -
нажата. Именно это и выполняют в
программе следующие за
and
четы-
ре команды (попытайтесь разоб-
раться, что они делают). Кстати го-
воря, вместо четырех команд в дан-
ном случае можно было бы обой-
тись тремя:
movl
%c3,TERM_DOWN
/ /
jz
$3 //
movl
%c3,TERM_UP (поду-
майте, почему).
7. И, наконец, вызов интерпре-
татора автомата - команда
jsr.
8. После окончания работы ин-
терпретатора автомата необходи-
мо перейти к следующему автома-
ту. Для этого сегментный регистр
#С необходимо сдвинуть на следу-
ющий сегмент. Делается это с по-
мощью трех команд -
mfpr,
addl и
mtpr.
Первая из них сохраняет со-
держимое сегментного регистра в
ячейке памяти, вторая увеличива-
ет его содержимое на единицу, а
третья - возвращает новое значе-
ние обратно в сегментный регистр.
Логичный вопрос:
почему именно
на единицу?
- ведь сегменты в мик-
роконтроллере имеют размер 8
байт, т.е. для перехода к следующе-
му сегменту надо именно на столько
и сдвинуть адрес! Нет, ошибки
здесь нет, уважаемый читатель -
I
на самом деле в сегментных реги-
страх хранятся только старшие 5
бит адреса
{см.
рис. 1
к статье “Об-
щее устройство микроконтроллера
КР1878ВЕ1" - “Радиолюбитель",
№6/2005, с. 44 или
врезку
к статье
“Первая программа для микрокон-
троллера” - “Радиолюбитель", №7/
2005, с. 47)! Хранить в сегментных
регистрах младшие три бита адре-
са необходимости нет - они для
сегментного регистра всегда заве-
домо равны нулю. Поэтому, когда
мы пишем у себя в программе, на-
пример, команду загр узки Id r
#A,18h, компилятор tessa на самом
деле заменяет ее командой Idr
#A,03h, т.е. 18h, сдвинутым на 3
бита вправо (чтобы избавить нас от
утомительного пересчета). Если же
мы начинаем изменять содержи-
мое сегментных регистров в про-
цессе работы программы самосто-
ятельно, компилятор tessa нам тут
уже не поможет, и мы должны сами
учитывать тот факт, что хранятся
в сегментных регистрах только 5
бит адреса.
9. И, наконец, команды органи-
зации цикла
subi
и
jnz.
10. После окончания работы
цикла анализа необходимо заме-
нить данные в ячейке с прежними
состояниями кнопок на новое их
состояние. Делается это командой
mov.
11. Теперь мы сбрасываем сиг-
нал прерывания от порта А, чтобы
получать от него прерывания и в
дальнейшем. При любом обраще-
нии к управляющему регистру пор-
та А сигнал прерывания от порта А
сбрасывается - именно это и дела-
ет команда
movl,
“попутно” взводя
бит разрешения новых прерыва-
ний. Таким действием должен за-
канчиваться
любой
обработчик
прерываний от портов, независимо
от того, кто и с какой целью его
написал.
12. А вот теперь - завершение
обработчика: команды
pop
для
восстановления испорченных реги-
стров и команда
rti
для возврата из
обработчика.
| Радиолюбитель - 01 /2 0 0 6
предыдущая страница 45 Радиолюбитель 2006-01 читать онлайн следующая страница 47 Радиолюбитель 2006-01 читать онлайн Домой Выключить/включить текст