» » BASCOM AVR – конфигурируем порты МК. Подключаем кнопку.
Информация к новости
  • Просмотров: 59543
  • Автор: 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, начинающим

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

15 июля 2008 23:53

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Если правильно понял, то здесь светодиод должен погаснуть по нажатию кнопки. Я решил опробовать эту программу. Переписал её на мк ATmega16, изменил кварц на 8мГц, скомпилировал и зашил в мк. Светодиод загорелся, но по нажатию кнопки не гаснит. В чём может бять причина?
<
administrator

16 июля 2008 01:04

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

16 июля 2008 23:20

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Ну вообщем всё проверил на своём контроллере и обнаружил, что на мк не роботают порты PC2-PC5. Поставил другую мегу16. Проверил программа работает. Поставил его на контроллер MRC40 без дополнительного модуля подключил светодиод и кнопку на тежи порты всё работает, но как только поставил дополнительный модуль, то теже порты снова перестали работать. Чё с этим делать не знаю. У тебя не было такого? Плату проверил полностью нормальная ни где ни чего не замыкается.
<
administrator

17 июля 2008 10:42

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

17 июля 2008 12:12

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
У меня прошиты след. фьюзы:
CKSELO1, CKSELO0, SUT0, SUT1, BOOTSZ0, BOOTSZ1, JTAGEN, SPIEN.
А на, что влияет вообще фьюз JTAGEN.

Ура. Всё работает. Отключил фьюз JTAGEN и всё.
Но на, что он влияет?
<
administrator

17 июля 2008 20:57

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

17 июля 2008 21:15

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Всё понял. Спасибо
<
Lopez

22 сентября 2008 17:11

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
Можно ли было написать без ветвления? чтобы когда отпущено - горело, а когда нажато - гасло?

Led = Button
<
administrator

22 сентября 2008 18:46

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

22 ноября 2008 00:14

Информация к комментарию
  • Группа: Гости
  • ICQ: {icq}
  • Регистрация: --
  • Статус:
  • Публикаций: 0
  • Комментариев: 0
'А дребезг?? Как же дребезг?? Наверное задержку надо поставить после получения сигнала о нажатой кнопки?! И про подтягивающие резисторы ничего не нашел(

'считываем состояние порта (подключаем кнопку)
'RoboZone.SU

$regfile = "m32def.dat" ' используемый микроконтроллер ATmega32 (MRC40 с универсальным модулем)
$crystal = 16000000 ' частота установленного кварца 16 mHz

Config Portb.0 = Output , ' конфигурируем вывод 2 порта B на ВЫХОД - подключаем к нему светодиод
Portb.0 = 1 ' подключаем внутренний подтягивающий резистор
Config Pinc.2 = Input ' конфигурируем вывод 2 порта С на ВХОД - подключаем к нему кнопку

Led Alias Portb.0 ' присваиваем имя LED выводу 0 порта B
Button Alias Pinc.2 ' присваиваем имя Button выводу 2 порта С

Do ' начало цикла программы


Led = Button ' устанавливаем на ножке 1 порта В высокий логический уровень при отпущенной кнопке
Waitms 100 ' борьба с дребезгом

Loop
End


' ВНИМАНИЕ допустимая нагрузка на ножку по даташиту к атмеге32 не более 20!!!!!! мА
Although each I/O port can sink more than the test conditions (!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!20 mA at Vcc = 5V, 10 mA at Vcc = 3V!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) under steady state
conditions (non-transient), the following must be observed:
PDIP Package:
1] The sum of all IOL, for all ports, should not exceed 400 mA.
2] The sum of all IOL, for port A0 - A7, should not exceed 200 mA.
3] The sum of all IOL, for ports B0 - B7,C0 - C7, D0 - D7 and XTAL2, should not exceed 300 mA.
TQFP and MLF Package:
1] The sum of all IOL, for all ports, should not exceed 400 mA.
2] The sum of all IOL, for ports A0 - A7, should not exceed 200 mA.
3] The sum of all IOL, for ports B0 - B4, should not exceed 200 mA.
4] The sum of all IOL, for ports B3 - B7, XTAL2, D0 - D2, should not exceed 200 mA.
5] The sum of all IOL, for ports D3 - D7, should not exceed 200 mA.
6] The sum of all IOL, for ports C0 - C7, should not exceed 200 mA.
If IOL exceeds the test condition, VOL may exceed the related specification. Pins are not guaranteed to sink current greater
than the listed test condition.



Предлагаю разобратся с прерываниями таймера, давайте обьединим усилия, Где это можно обсудить? Причина - необходимость исключать задержки waitms, за цикл их может пол секунды набежать, что тормозит наши мегагерци ОЧЕНЬ и Очень сильно!
вместо waitms 100 я бы предпочел писать if thimer >= 100 then........
Назад Вперед
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.