В предыдущей статье мы рассмотрели простой пример моргания светодиодом и научились пользоваться встроенным программатором в BASCOM AVR. Теперь настало время подробнее ознакомится с настройкой портов микроконтроллера на примере работы с кнопкой. Для этого используем наш контроллер MRC40(ATmega32) с установленным экспериментальным модулем.
Для начала кратко и упрощенно рассмотрим внутреннюю структуру микроконтроллера... Порт имеет три части ...
1) DDR
2) PORT
3) PIN
DDR переключает режимы работы порта - режим INPUT (вход) или OUTPUT (выход). Он осуществляет коммутацию элементов внутри микроконтроллера.
PORT представляет из себя набор из 8 выходных ключей, которые могут выдерживать нагрузку в 50мА. К примеру можно управлять светодиодом и прочими внешними элементами с небольшой нагрузкой.
PIN является набором из 8 входных логических элементов, которые могут быть установлены как 1 или 0. Когда установлен логический уровень "0", то на ножке МК установлено напряжение от 0 до примерно 0.1 вольт, если установлен логический уровень 1, то напряжение на ножке МК от 2,5 вольт до VCC (напряжение питания микроконтроллера, в данном рассматриваемом случае это 5В).
Когда вы выполняете эту строку ...
CONFIG PORTB = OUTPUT
Вы устанавливаете все выводы порта B в режим выхода.
Когда вы выполняете эту строку ...
CONFIG PORTB = INPUT
Вы устанавливаете все выводы порта B в режим входа.
Если вы выполните следующие команды ...
CONFIG PORTB = OUTPUT
CONFIG PORTB.2 = INPUT
Тогда только вывод 2 порта B (PORTB.2) установлен в режим входа, остальные установлены на выход.
А теперь попытайтесь считать состояние PORTB.2 … у вас ничего не получится…
Почему?
Потому что PORTB.2 не соединен электрически внутри МК со схемой входа, он может работать только в режиме «выход».
Если вы хотите считать состояние вывода порта, то это надо делать из PINB.2, так как именно через него осуществляется считывание данных в МК.
Не смотря на то, что при CONFIG PORTB.2 = INPUT не читается PORTB.2, второй вывод все равно конфигурируется на вход и прочитать его можно через PIND.2.
Теперь рассмотрим все вышесказанное на примере обработки состояния кнопки.
Итак, мы имеем кнопку и светодиод (на экспериментальном модуле для MRC40 все это хозяйство имеется в наличии). Кнопка подключена на ножку 2 порта С (PORTC.2), а светодиод на ножку 0 порта В (PORTB.0). Нам необходимо сделать так, что бы при нажатии на кнопку загорался светодиод.
Пишем программу…
'считываем состояние порта (подключаем кнопку)
'Robozone.su
$regfile = "m32def.dat" ' используемый микроконтроллер ATmega32 ( MRC40 с универсальным модулем)
$crystal = 16000000 ' частота установленного кварца 16 mHz
Config Portb.0 =Output ' конфигурируем вывод 2 порта B на ВЫХОД - подключаем к нему светодиод
Config Pinc.2 = Input ' конфигурируем вывод 2 порта С на ВХОД - подключаем к нему кнопку
Do ' начало цикла программы
If Pinc.2 =0 Then ' УСЛОВИЕ - если на 2-й ножке порта С низкий логический уровень то...
Portb.0 = 1 ' устанавливаем на ножке 0 порта В высокий логический уровень (светодиод горит)
Else ' в противном случае...
Portb.0 = 0 ' устанавливаем на ножке 0 порта В низкий логический уровень (светодиод не горит)
End If'конец условия
Loop
End
На будущее при написании программ для МК очень удобно пользоваться командой присвоения имен – ALIAS. С помощью нее различным переменным можно присвоить уникальные имена.
Перепишем программу с использованием команды ALIAS.
'считываем состояние порта (подключаем кнопку)
'RoboZone.SU
$regfile = "m32def.dat" ' используемый микроконтроллер ATmega32 (MRC40 с универсальным модулем)
$crystal = 16000000 ' частота установленного кварца 16 mHz
Config Portb.0 = Output ' конфигурируем вывод 2 порта B на ВЫХОД - подключаем к нему светодиод
Config Pinc.2 = Input ' конфигурируем вывод 2 порта С на ВХОД - подключаем к нему кнопку
Led Alias Portb.0 ' присваиваем имя LED выводу 0 порта B
Button Alias Pinc.2 ' присваиваем имя Button выводу 2 порта С
Do ' начало цикла программы
If Button = 0 Then ' УСЛОВИЕ - если на 2-й ножке порта С низкий логический уровень то...
Led = 1 ' устанавливаем на ножке 0 порта В высокий логический уровень (светодиод горит)
Else ' в противном случае...
Led = 0 ' устанавливаем на ножке 0 порта В низкий логический уровень (светодиод не горит)
End If 'конец условия
Loop
End
Как видите, наглядность кода программы повысилась, это существенно помогает при написании программ с большим количеством различных переменных.
О!… мы забыли про DDR…
Пришло время разобраться и с этим зверем =)
С помощью DDR мы имеем возможность настроить весь порт одной строчкой кода. Как мы писали выше, функцией DDR является переключение режимов работы порта. Внутри микроконтроллера выводы портов пронумерованы в следующем порядке – 76543210. Таким образом, мы можем одним бинарным числом установить состояния PORT/PIN порта.
Посмотрим на пример ниже…
CONFIG PORTB = OUTPUT
При такой конфигурации порта В на всех выводах порта DDR установлен в 1.
CONFIG PORTB = INPUT
А при такой конфигурации порта В на всех выводах порта DDR установлен в 0.
Так что же это нам дает? А вот что!
К примеру нам надо сконфигурировать порт B таким образом
CONFIG PORTB = OUTPUT
CONFIG PORTB.3 = INPUT
CONFIG PORTB.4 = INPUT
CONFIG PORTB.5 = INPUT
То есть – 3,4 и 5 выводы порта настроены на вход, а остальные на выход. С помощью DDR то же самое можно сделать одной строчкой… вот так…
DDRB=&B11100011
Вот собственно и все =) Правда не сложно?
Мы постарались описать конфигурирование портов как можно более доступным языком и возможно слишком уж упрощенно, поэтому подробное описание конфигурации портов вы можете скачать с официального сайта BASCOM AVR - http://www.mcselec.com.
Исходник демо-прошивки и скомпилированный файл hex вы можете скачать в архиве ниже.
Вы не можете скачивать файлы с нашего сервера
Метки к статье: BASCOM AVR, начинающим