Главная » Статьи » Программирование » Программирование в BascomAVR

Порты ввода/вывода данных. Подключение кнопки к мк.
   Мы уже с вами рассмотрели простой пример программы моргания светодиодом в BascomAVR. Теперь давайте разберёмся подробно как настраивать порты ввода/вывода мк более точно. Для примера, попробуем подключить кнопку. Берём наш контроллер+модуль к нему. На нём уже есть 2 кнопки. Задействуем и ту и другую. Опять же написав пару программ.

   Рассмотрим структуру мк. Порт имеете три части:

  • DDRx - регистр направления передачи данных - определяет, является тот или иной вывод порта входам или выходом; если некоторый разряд регистра DDRx содержит логический 0, то соответствующий вывод порта сконфигурирован как вход, в противном случаи - как выход;
  • PORTx - регистр порта - если вывод выполняет роль выхода, то в соответствующий разряд записывается значение, предназначенное для вывода; если вывод выполняет роль входа, то логический 0 в некотором разряде регистра PORTx соответствует высокоомный вход, а логическая 1 - вход, нагруженный подтягивающим сопротивлением;
  • PINx - регистр выводов порта - в отличие от регистров DDRx и PORTx доступен только для чтения и позволяет считать входные данные порта на внутреннюю шину мк.
Code
Config PORTA.0 = Input     'здесь ножку PA0  мы назначили на вход
Config PORTA.0 = Output   'здесь ножку PA0  мы назначили на выход
Config PORTA = Input        'здесь все порты PA  мы назначили на вход
Config PORTA = Output      'здесь все порты PA  мы назначили на выход

    Если выполнить команду так:

Code
Config PORTA = Output      'здесь все порты PA  мы назначили на выход
Config PORTA.0 = Input     'здесь ножку PA0  мы назначили на вход

   Если попробовать считать состояние порта PORTA.0, то ни чего не получится. Потому что PORTA.0 не соединен электрически внутри МК со схемой входа, он может работать только в режиме «выход». Если вы хотите считать состояние вывода порта, то это надо делать из PINA.0, так как именно через него осуществляется считывание данных в МК.

   Теперь напишем программу. На плате нашего модуля для универсального контроллера воспользуемся кнопкой, которая подключена на PORTC.2 и светодиодом, который подключён на PORTB.0.

Code
$regfile = "m16def.dat"                                     ' используем ATmega16 (с универсальным модулем)

$crystal = 16000000                                         ' частота установленного кварца 16 mHz

Config Portb.0 = Output : Красный0 Alias Portb.0            ' назначаем вывод PB0 на выход и присваиваем имя Красный0
Config Portb.1 = Output : Красный1 Alias Portb.1            ' назначаем вывод PB1 на выход и присваиваем имя Красный1
Config Portb.2 = Output : Красный2 Alias Portb.2            ' назначаем вывод PB2 на выход и присваиваем имя Красный2

Config Pinc.2 = Input : Кнопка0 Alias Pinc.2                ' назначаем вывод PC2 на вход и присваиваем имя Кнопка0
Config Pinc.3 = Input : Кнопка1 Alias Pinc.3                ' назначаем вывод PC3 на вход и присваиваем имя Кнопка1

Do                                                          ' начало цикла программы
If Кнопка0 = 0 Then                                         ' УСЛОВИЕ - если на 2-й ножке порта С низкий логический уровень то...
Красный0 = 1                                                ' устанавливаем на ножке 0 порта В высокий логический уровень (светодиод горит)
Else                                                        ' в противном случае...
Красный0 = 0                                                ' устанавливаем на ножке 0 порта В низкий логический уровень (светодиод не горит)
End If                                                      'конец условия
Loop                                                        ' конец цикла программы
End                                                         ' конец программы



Теперь давайте напишем ещё одну программу. По нажатию кнопки все светодиоды начнут по очереди загораться, потом гаснуть. Остановить это можно с помощью 2 кнопки, удерживая её в нажатом состояние.

Code
$regfile = "m16def.dat"                                     ' используем ATmega16 (с универсальным модулем)

$crystal = 16000000                                         ' частота установленного кварца 16 mHz

Config Portb.0 = Output : Красный0 Alias Portb.0            ' назначаем вывод PB0 на выход и присваиваем имя Красный0
Config Portb.1 = Output : Красный1 Alias Portb.1            ' назначаем вывод PB1 на выход и присваиваем имя Красный1
Config Portb.2 = Output : Красный2 Alias Portb.2            ' назначаем вывод PB2 на выход и присваиваем имя Красный2

Config Pinc.2 = Input : Кнопка0 Alias Pinc.2                ' назначаем вывод PC2 на выход и присваиваем имя Кнопка0
Config Pinc.3 = Input : Кнопка1 Alias Pinc.3                ' назначаем вывод PC3 на выход и присваиваем имя Кнопка1

Dim T As Integer                                            ' объявляем переменную T

T = 250                                                     ' Назначаем число для переменной

Do                                                          ' начало основного цикла программы
If Кнопка0 = 0 Then : Gosub 1 : End If                      'если подаётся логический 0, то переходим на метку 1
Loop                                                        ' конец основного цикла программы

1:                                                          'метка
Do                                                          'начало цикла с условием
Waitms T : Красный0 = 1
Waitms T : Красный1 = 1
Waitms T : Красный2 = 1
Waitms T : Красный0 = 0
Waitms T : Красный1 = 0
Waitms T : Красный2 = 0
Loop Until Кнопка1 = 0                                      'конец цикла с условием. Если удерживается кнопка1, то заканчиваем цикл программы, иначе продолжаем выполнять этот цикл
Return                                                      'возврат к основному циклу программы
End                  ' конец программы



И теперь последнее о чём нужно тоже упомянуть. Предположим порты нужно назначить следующим образом:

Code
Config Portb.0 = Output             ' назначаем вывод PB0 на вход
Config Portb.1 = Output             ' назначаем вывод PB1 на выход
Config Portb.2 = Output             ' назначаем вывод PB2 на выход
Config Portb.3 = Output             ' назначаем вывод PB3 на выход
Config Portb.4 = Output             ' назначаем вывод PB4 на вход
Config Portb.5 = Output             ' назначаем вывод PB5 на вход
Config Portb.6 = Output             ' назначаем вывод PB6 на выход
Config Portb.7 = Output             ' назначаем вывод PB7 на вход

То есть у нас получается 4 порта на вход и 4 порта на выход, но это не удобно, куда проще сделать тоже самое так:

Code
DDRB = &B01110010         

0 - это вход
1 - это выход

   Тем самым мы сделали тоже самое в одну строчку.

   Исходники и прошивки для 2 примеров скачать можно по ссылке. Удачи!

Ссылка на предыдущую статью.

Ссылка на следующую статью.
















Источник: www.enore.ru
Категория: Программирование в BascomAVR | Добавил: Space (23.01.2011) | Автор: Кирилл E W
Просмотров: 1987 | Теги: порты ввода/вывода, подключение кнопки, порты вывода, Порты ввода
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]