Например TDA7294

Добавить ссылку на форум

РадиоКот >Обучалка >Микроконтроллеры и ПЛИС >Микроконтроллеры AVR - пишем, компилируем, прошиваем... >

Настройка портов ввода-вывода

Внимание! Порядок добавления тегов имеет значение! Начинайте добавлять с наиболее важного. По возможности пользуйтесь уже существующими тегами


Ну чего? Давай писать прогу, что-ли???

У нас уже есть папка tutorial c файлом code.asm и двумя настроенными батниками. Можете писать прямо в этот файл, а можете скопировать папочку tutorial под другим именем. Нопример, у меня папка с этим проектом называется runfire (типа, бегущий огонек :)).

Структура новой папки должна остаться такой же, как у tutorial.
Открываем code.asm (правой кнопкой по файлу -> Правка). Стираем все кроме самой первой строки, в которой написано .include тра-ля-ля…

Начинаем программить :)

Я помнится уже где-то говорил, что любая программа начинается с настройки портов. Я от своих слов не отказываюсь. Кстати говоря, кроме этого, в начале программы обычно прописывается указатель СТЕКа. Но мы еще не знаем, что такое стек, и он нам сегодня не понадобится - так шо, иди он лесом.

Но самым первым делом, мы должны объявить о начале текста программы и назначить адрес ПЗУ для первой команды. Поэтому мы пишем:

.include "d:avravrasmappnotes2313def.inc"

.cseg
.org 0

CSEG - обозначает начало программного сегмента
ORG - задает начальный адрес. В данном случае он = 0.

Кроме программного сегмента, бывает сегмент данных - DSEG.
В нем инициализируется оперативная память. Но об этом мы будем говорить в дальнейшем.

Итак, как вы помните, в нашем контроллере 16 РОН (регистров общего назначения): R16…R31. С любым из них мы можем сделать все что угодно. Просто полная анархия! Однако, я бы не рекомендовал злоупотреблять количеством используемых регистров. Это очень усложняет процесс написания программы. Я обычно использую 4 или 5 регистров - только самое необходимое в данный момент. Остальное - в оперативке (ОЗУ).

Чтобы не запутаться, я по-своему обзываю эти регистры: Temp, Temp1, …, Temp4. И вам того же желаю. Делается это так: до начала программного сегмента необходимо прописать примерно следующее:

.def     Temp=R16
.def     Temp1=R17
и т.д.

Напишем:

.include "d:avravrasmappnotes2313def.inc"

.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Temp4=R20

.cseg
.org 0

Все, теперь нам станет проще…

Ах да! Мы ж настраиваем порты… :) Ну ладно - настраиваем!

Я уже говорил, что каждый порт ввода-вывода (ПВВ) состоит из скольки-то каналов.
Каждый канал может быть настроен на вход или на выход.
В нашем контроллере два порта:

PortB - 8 каналов (к нему подключены светодиоды)
PortD - 7 каналов (к нему пока ничего не подключено)

Порты устроены очень хитроумно. Для работы с любым портом используется три регистра:

PortX
PinX
DDRX
(где X - буква порта, например PortB, PinD и т.д.)

Устройство портов ввода-вывода в микроконтроллерах AVR Atmel

PortX содержит информацию, предназначенную для вывода.
PinX содержит вводимую информацию
DDRX содержит информацию о том, какой канал настроен на ввод, какой - на вывод.

То есть, DDRX определяет, грубо говоря, какая ножка микросхемы будет подключена к PinX, какая - к PortX:

0 - ввод
1 - вывод

Соответственно, если, скажем, PX3 настроен на ввод, то бесполезно писать что-либо в 3-й бит PortX, поскольку оно не будет выведено.
И наоборот, если например, PX5 настроен на вывод, то прочитав 5-й бит PinD, мы всегда обнаружим 0.
Порты - дело тонкое…

По умолчанию, все каналы порта настроены на ввод.

Нам же надо, чтобы порт B был целиком настроен на вывод. Значит, все биты DDRB должны равняться 1. То есть, в DDRB надо записать "11111111".

Мы не можем напрямую записать константу в регистр, не являющийся РОН. Но мы можем вывести значение из РОНа в этот регистр.

Знакомимся с первыми операторами:

out - оператор вывода данных из РОН в другие регистры

Пример:
out DDRB,Temp1

ldi - оператор присвоения константы РОН

Примеры:
ldi Temp1,14 - присвоение десятеричной константы (14)
ldi Temp1,0x0E - присвоение шестнадцатеричной константы (0E)
ldi Temp1,0b00001110 - присвоение двоичной константы (00001110)

Итак, операция настройки портов происходит в два шага:
1.Присваиваем РОН константу
2.Выводим данные из РОН в DDRx

.include "d:avravrasmappnotes2313def.inc"

.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Temp4=R20

.cseg
.org 0

ldi Temp, 0b11111111  ;присвоение константы
out DDRB,Temp         ;вывод

Все! Порты настроены, я вас поздравляю.
А шуму то было! :)

Теперь можно вывести какое-нибудь число и проверить как работает наша схема.
Выведем двоичное число 11010010

.cseg
.org 0

ldi Temp, 0b11111111  ;присвоение константы
out DDRB,Temp         ;вывод

;выводим число 11010010 на светодиоды

ldi Temp,0b11010010  ;присвоение константы
out PortB,Temp         ;вывод на индикацию

Компилируем. Шьем. Смотрим. Должны загореться соответствующие светодиоды.
Загорелись?
Кричим УРА, идем дальше… :)

<<--Вспомним пройденное----Поехали дальше-->>




Как вам эта статья?

Заработало ли это устройство у вас?

38 4 0
19 2 1