Настройка портов ввода-вывода
Автор: Ну чего? Давай писать прогу, что-ли??? У нас уже есть папка tutorial c файлом code.asm и двумя настроенными батниками. Можете писать прямо в этот файл, а можете скопировать папочку tutorial под другим именем. Нопример, у меня папка с этим проектом называется runfire (типа, бегущий огонек :)).
Структура новой папки должна остаться такой же, как у tutorial. Начинаем программить :) Я помнится уже где-то говорил, что любая программа начинается с настройки портов. Я от своих слов не отказываюсь. Кстати говоря, кроме этого, в начале программы обычно прописывается указатель СТЕКа. Но мы еще не знаем, что такое стек, и он нам сегодня не понадобится - так шо, иди он лесом. Но самым первым делом, мы должны объявить о начале текста программы и назначить адрес ПЗУ для первой команды. Поэтому мы пишем:
.include "d:avravrasmappnotes2313def.inc"
CSEG - обозначает начало программного сегмента
Кроме программного сегмента, бывает сегмент данных - DSEG. Итак, как вы помните, в нашем контроллере 16 РОН (регистров общего назначения): R16…R31. С любым из них мы можем сделать все что угодно. Просто полная анархия! Однако, я бы не рекомендовал злоупотреблять количеством используемых регистров. Это очень усложняет процесс написания программы. Я обычно использую 4 или 5 регистров - только самое необходимое в данный момент. Остальное - в оперативке (ОЗУ). Чтобы не запутаться, я по-своему обзываю эти регистры: Temp, Temp1, …, Temp4. И вам того же желаю. Делается это так: до начала программного сегмента необходимо прописать примерно следующее:
.def Temp=R16 Напишем:
.include "d:avravrasmappnotes2313def.inc" Все, теперь нам станет проще… Ах да! Мы ж настраиваем порты… :) Ну ладно - настраиваем!
Я уже говорил, что каждый порт ввода-вывода (ПВВ) состоит из скольки-то каналов.
PortB - 8 каналов (к нему подключены светодиоды) Порты устроены очень хитроумно. Для работы с любым портом используется три регистра:
PortX
PortX содержит информацию, предназначенную для вывода.
То есть, DDRX определяет, грубо говоря, какая ножка микросхемы будет подключена к PinX, какая - к PortX:
Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX,
поскольку оно не будет выведено. По умолчанию, все каналы порта настроены на ввод. Нам же надо, чтобы порт B был целиком настроен на вывод. Значит, все биты DDRB должны равняться 1. То есть, в DDRB надо записать "11111111". Мы не можем напрямую записать константу в регистр, не являющийся РОН. Но мы можем вывести значение из РОНа в этот регистр. Знакомимся с первыми операторами:
out - оператор вывода данных из РОН в другие регистры
ldi - оператор присвоения константы РОН
Итак, операция настройки портов происходит в два шага:
.include "d:avravrasmappnotes2313def.inc"
Все! Порты настроены, я вас поздравляю.
Теперь можно вывести какое-нибудь число и проверить как работает наша схема.
.cseg
Компилируем. Шьем. Смотрим. Должны загореться соответствующие светодиоды. <<--Вспомним пройденное----Поехали дальше-->>
|
|
|||||||||||||||
|
||||