» » BASCOM AVR – конфигурируем порты МК. Подключаем кнопку.
Информация к новости
  • Просмотров: 57580
  • Автор: administrator
  • Дата: 8 июля 2008
  • 0
8 июля 2008

BASCOM AVR – конфигурируем порты МК. Подключаем кнопку.

Категория: BASCOM AVR

В предыдущей статье мы рассмотрели простой пример моргания светодиодом и научились пользоваться встроенным программатором в 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, начинающим

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
<
Pasha

25 ноября 2008 19:03

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
$regfile = "m32def.dat" ' используем ATmega32 (MRC40 с универсальным модулем)
$crystal = 100000 ' частота установленного кварца 16 mHz
$lib "lcd4.lbx" 'используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

'указываем конфигурацию подключения дисплея к портам МК
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2 'используем дисплей на 2 строчки по 16 знакомест в каждой
Config Pina.0 = Input
Porta.0 = 1 'Включаем внутренний подтягивающий резистор к + питанию на 40кОм
Booton1 Alias Pina.0
'Dim Tempbooton1 As Bit
Dim Bootonup As Bit
Dim X As Byte
'Dim Y As Byte
Do
If Booton1 = 0 Then ' физическая кнопка нажата?(1) (т.е. на входе логический ноль)
If Tempbooton1 = 0 Then ' и флаг кнопки =0 ?(2)
Bootonup = 1 ' включаем флаг что кнопка нажата(2)
Tempbooton1 = 1 'тогда включаем флаг кнопки равен 1 (2)
Else ' нет! (2)
'Incr Y 'y=y+1
'If Y > 80 Then ' лучше тут использовать прерывания по таймеру и щетчик этих прерываний а данная задержка привязана к кварцу и "медленности" программы
'Y = 0
'Tempbooton1 = 0
'End If
Bootonup = 0 ' виртуальная кнопка = 0 ( не нажата)
End If 'конец условия (2)
Else ' нет! (1)
Tempbooton1 = 0 'флаг кнопки = 0
Bootonup = 0 ' виртуальная кнопка не нажата = 0
End If
If Bootonup = 1 Then Incr X 'считываем результат виртуальной кнопки и если она нажата то х=х+1
If X > 100 Then X = 0 'обнуляем х по достижении 100
Locate 1 , 4 'позиция курсора
Lcd "booton" ; X ; " " 'выводим результат преобразования на ЖК
Loop
End
<
Петрон

9 марта 2009 01:06

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
В коде 4 ошибки, но идея с LCD мне понравилась
<
chinzano

22 апреля 2009 21:14

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Разъясните для совсем ничего не понимающих:
DDRB=&B11100011 точнее именно: &B11100011

в таком видя я понимаю что присходит:
CONFIG PORTB = OUTPUT
CONFIG PORTB.3 = INPUT
CONFIG PORTB.4 = INPUT
CONFIG PORTB.5 = INPUT
а почему это одно и тоже с &B11100011, никак не могу понять.

<
administrator

23 апреля 2009 00:45

Информация к комментарию
  • Группа: Администраторы
  • ICQ: {icq}
  • Регистрация: 26.02.2008
  • Статус: Пользователь offline
  • Публикаций: 66
  • Комментариев: 747
chinzano, хм... могу повторить, то же самое что написано встатье, тока в комментариях... бует более понятно?
<
chinzano

23 апреля 2009 06:12

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
admin, не, не нужно, это я и так прочитал winked , всю голову сломал уже с этой двоичной системой.

Назад Вперед
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.