Меню

Настройка портов в codevisionavr

Управление портами микроконтроллеров AVR на языке С (Си)

В этой статье будет рассмотрено управление портами микроконтроллеров AVR на языке программирования С (Си): установка выводов порта на вход или выход, считывание значений на входах портов, программа для управления миганием светодиода.

Общие сведения о портах микроконтроллеров AVR

Kонфигурирование каждой линии порта (задание направления передачи данных) может быть произведено программно в любой момент времени. Входные буферы портов построены по схеме триггера Шмитта. Для линий, сконфигурированных как входные, также имеется возможность подключения внутреннего подтягивающего резистора сопротивлением 35…120 кОм между входом и проводом питания. Kроме того, если вывод (вход) с подключенным внутренним подтягивающим резистором подключить к общему проводу, он может служить источником тока.

Обращение к портам производится через регистры ввода/вывода, причем под каждый порт в адресном пространстве ввода/вывода за-резервировано по 3 адреса. По этим адресам размещаются три регистра: регистр данных порта PORTx, регистр направления данных DDRx и регистр выводов порта PINx. Разряды этих регистров имеют названия: Px7…Px0 — для регистров PORTx, DDx7…DDx0 — для регистров DDRx и PINx7…PINx0 — для регистров PINx.

Следует заметить, что «регистры» PINx на самом деле регистрами не являются, по этим адресам осуществляется доступ к физическим значениям сигналов на выводах порта. Поэтому они доступны только для чтения, тогда как регистры PORTx и DDRx доступны и для чтения, и для записи.

Таким образом, запись в порт означает запись требуемого состояния для каждого вывода порта в соответствующий регистр данных порта PORTx. А чтение состояния порта выполняется чтением либо регистра данных порта PORTx, либо регистра выводов порта PINx. При чтении регистра выводов порта PINx происходит считывание логических уровней сигналов, присутствующих на выводах порта. А при чтении регистра данных порта PORTx происходит считывание данных, находящихся в регистре-защелке порта – это справедливо как для входных, так и для выходных контактов.

Любой порт микроконтроллера AVR можно сконфигурировать как вход или как выход. Для этой цели используется регистр DDRx. На вход или выход можно сконфигурировать сразу весь порт или только отдельный его вывод (контакт, пин).

Задание направления данных для всего порта

В программе для программирования микроконтроллеров AVR Atmel Studio на языке С можно задать направление передачи данных сразу для всего порта.

С помощью этой команды все выводы (контакты) порта B будут сконфигурированы как выходы.

0xff представляет собой шестнадцатиричное представление числа ff, а 0x является префиксом, указывающим на то, что число записано в шестнадцатиричное форме. В десятичном представлении число 0xff будет равно 255, а в двоичном – 11111111. То есть с помощью представленной команды во все биты регистра DDRB будут записаны логические единицы.

В языке Си для микроконтроллеров AVR для представления двоичных чисел применяется префикс 0b. Соответственно, представленную выше команду записи логических единиц во все биты регистра DDRB можно записать и с помощью двоичного вида числа 255:

Эта запись команды является более наглядной, но все таки правилом «хорошего тона» в программировании для микроконтроллеров считается использование шестнадцатиричного представления чисел.

Для того чтобы сконфигурировать все выводы (контакты) порта B как входы необходимо записать во все биты регистра DDRB логические нули. Это можно сделать с помощью следующей команды.

Но кроме рассмотренных «крайних» случаев (все единицы или все нули) в регистр DDRB можно записать и другие числа. Например:

Установка 1 в произвольном бите регистра порта

Каждый бит регистров DDRx может быть установлен или сброшен отдельно. К примеру, если мы хотим сконфигурировать отдельно вывод PD2 как выход, то нам следует в соответствующий бит регистра DDRD записать 1. Для этой цели можно использовать следующую команду:

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

1 – с помощью этой части команды осуществляется сдвиг единички влево на 2 бита, то есть справа добавляются два нулевых бита и получается число 100 (в двоичном виде), а знак «|», стоящий перед знаком присваивания «=», выполняет операцию побитного логического сложения.

Читайте также:  Boss katana 50 настройки

Операцию побитного логического сложения также называют операцией ИЛИ (английское название OR) и выполняется она по следующим правилам:
0+0=0
0+1=1
1+0=1
1+1=1

То есть если хотя бы одно из слагаемых равно 1, то результат также равен 1.

Таким образом, в результате данной операции (команда DDRD |= 1 DDRD &=

В этом случае результат сдвига единицы на две позиции влево инвертируется с помощью операции побитного инвертирования, которая в языке С обозначаемой знаком «

Итак, в результате операции (1 И (английское название AND), выполняется по следующим правилам:
0*0=0
0*1=0
1*0=0
1*1=1

То есть если хотя бы один из операндов операции равен 0, то и результат операции равен 0.

Таким образом, сдвинутая нами влево на две позиции единица (1 PORTB = 0xff.

Аналогично установка «0» на всех выводах порта B выполняется следующим образом:

К каждому биту регистров PORTx можно обращаться и по отдельности так же, как и в рассмотренном выше случае с регистрами DDRx. К примеру, команда

установит «1» (сигнал высокого уровня) на контакте PB3.

установит «0» (сигнал низкого уровня) на контакте PB4.

В программе Atmel Studio сдвиг можно выполнять и с помощью функции _BV(), которая производит поразрядный сдвиг и помещает результат в компилируемый код.

В этом случае две предыдущие команды можно записать следующим образом:

PORTB |= _BV(PB3); // установить «1» на линии 3 порта B

_BV(PB4); // установить «0» на линии 4 порта B

Пример программы зажигания светодиода, подключенного к выводу микроконтроллера AVR

Для лучшего понимания работы с портами микроконтроллеров AVR рассмотрим примеры простейших программ, осуществляющих включение и выключение светодиода, подключенного к выводу порта.

Светодиод к микроконтроллеру AVR можно подключить одним из следующих двух способов, представленных на рисунке.

В зависимости от способа подключения светодиод будет загораться либо от сигнала высокого уровня, подаваемого на вывод PD1 микроконтроллера, как в первом случае, либо от сигнала низкого уровня в случае подключения, изображенного на втором рисунке.

Теперь рассмотрим примеры программ, реализующих данные способы включения светодиода.

_BV(PD1); // установить «0» (низкий уровень) на выводе PD1
> // закрывающая скобка основной программы

Функция _delay_ms() формирует задержку в зависимости от передаваемого ей аргумента, выраженного в миллисекундах (в одной секунде 1000 миллисекунд). Максимальная задержка составляет 262.14 миллисекунд. Если передать функции значение более 262.14, то осуществится автоматическое уменьшение разрешения до 1/10 миллисекунды, что обеспечивает задержки до 6.5535 секунд. Более длительные задержки можно реализовать с помощью циклов в программе.

Функция _delay_ms() содержится в файле delay.h, поэтому его нужно будет подключить к основной программе. Также для работы этой функции необходимо задать значение тактовой частоты микроконтроллера в Герцах (Гц).

int main(void) < // начало основной программы
DDRD = 0xff; // все выводы порта D сконфигурировать как выходы

PORTD |= _BV(PD1); // установить «1» (высокий уровень) на выводе PD1,
//зажечь светодиод

_delay_ms(500); // ждем 0.5 сек.

_BV(PD1); // установить «0» (низкий уровень) на выводе PD1,
//погасить светодиод

_delay_ms(500); // ждем 0.5 сек.

PORTD |= _BV(PD1); // установить «1» (высокий уровень) на выводе PD1,
//зажечь светодиод

_delay_ms(500); // ждем 0.5 сек.

_BV(PD1); // установить «0» (низкий уровень) на выводе PD1,
//погасить светодиод

> // закрывающая скобка основной программы

В представленной программе светодиод мигнет всего 2 раза. Чтобы он мигал непрерывно можно организовать бесконечный цикл с помощью оператора безусловного перехода » goto «. Данный оператор выполняет переход к месту программы, обозначенному меткой. Но лучше это реализовать с помощью бесконечного цикла на основе оператора while – пример работающей схемы для этого случая и программы для нее можно посмотреть в этой статье на нашем сайте.

Источник

Работа в CodeVisionAVR. Написание первой программы

В настоящее время существуют множество различных программ для AVR микроконтроллеров. Самая узнаваемая программа — это, конечно, Atmel Studio, но в ней слишком много наворотов. Поэтому для новичков рекомендуется другая среда разработки: CodeVisionAVR. Именно о ней мы и поговорим в нашей статье. Скачать ее можно по прямой ссылке здес ь. Конечно, есть версии и посвежей, но кроме ненужных фишек в них ничего полезного не добавляют.

Читайте также:  Сигнал 20п smd настройка

В чем же плюсы этой программы?

CodeVisionAVR — это среда разработки, которая поддерживает все операции с МК AVR. В ней мы можем написать заготовку кода, скомпилировать ее и с помощью программатора «залить» в нужный нам МК. И не надо отдельно качать программку-прошиватель, компилятор и другие ненужные программы. А зачем, если все это есть в КодВижне? Также КодВижн поддерживает почти все известные программаторы для AVR, будь это китайские клоны или оригинальные программаторы. Большой плюс КодВижена в том, что он сам создает готовый шаблон программы, из которого нам нужно удалить все лишнее, что является несомненным плюсом для новичков.

Вот так выглядит программа после ее установки (кликните по картинике, чтобы увеличить изображение)

Для того, чтобы создать новый проект, кликаем по значку «шестеренка»:

После вылезет вот такое окошко. Ставим маркер-точку на AT90, Atiny, FPSLIC и нажимаем «ОК».

Потом вылезет вот такое окошко. В красном прямоугольнике я показал, на какую часть окошка надо обратить внимание:

Выбираем наш МК. В данном случае я использую МК Atiny2313, поэтому из всего списка МК, которая предлагает нам программа, выбираю именно его.

Также можно поменять частоту «Clock». По умолчанию она устанавливается на 8 МегаГерц.

Далее нажимаем в этом же окошке на значок «шестеренки»:

Вышло вот такое окошко. Первым делом мы выбираем папку, в которую будем сохранять наш проект. Я создал папку на рабочем столе и назвал ее MK AVR. Потом написал название нашего проекта «lesson 1», ну типа «первый урок» ). Ну и потом нажимаем кнопку «Сохранить». Обратите внимание на расширение файла, которое я обвел фиолетовым цветом:

Потом выйдет еще одно такое же окошко, только расширение файла будет другим. Не теряемся, прописываем также название файла, в данном случае lesson 1, и нажимаем кнопку «Сохранить»

И потом выйдет точно такое же завершающее окошко ;-). Также не теряемся, прописываем название файла и снова нажимаем кнопку «Сохранить».

Ну вот мы и готовы к созданию нашего первого проекта 😉

КодВижен для нас приготовил шаблон. Здесь явно много лишнего барахла. Первым делом сносим шапку

Выделяем, нажимаем Del.

Текст, который находится после двух косых черточек «// любой текст » или /* любой текст */ называется комментарием. Они нужны для удобного восприятия писанины и никак не сказываются на работу МК. Всех их мы выделяем и тоже сносим:

Итак, теперь думаем над проектом, который будем химичить. Моргание одного светодиодика — это уж слишком банально. Поэтому мы возьмем целых ТРИ светодиода! Наша программа будет поочередно зажигать каждый светодиод и потом в таком же порядке их тушить. У нас будет вот такой алгоритм, то есть порядок действий:

1) При подаче питания на МК зажечь первый светодиод.

2) Через 1 секунду зажечь второй светодиод, но первый светодиод при этом продолжает гореть.

4) Через 2 секунды тухнет третий светодиод.

5) Через секунду тухнет второй светодиод.

6) Еще через секунду тухнет первый светодиод.

7) Через 2 секунды весь этот цикл повторяется с пункта 1.

Алгоритм мы с вами согласовали. Осталось дело за малым: написать программку 😉

Итак, первые две строчки кода — это подключение библиотек. То есть эти файлы у нас уже есть в программе КодВижн. Нам осталось их только подключить.

Include с англ. — включать, содержать, подключать. Include еще называется оператором присоединения внешних файлов.

То есть мы с вами присоединяем к нашей программе библиотеку «tiny 2313.h» для МК Atiny 2313, так как именно на нем будет работать наша схема. А также подключаем библиотеку «delay.h». Delay — c англ. откладывать, отсрочивать. То есть грубо говоря, подключаем еще и задержку.

Уф, две строчки кода вроде бы написали).

Сама программа пишется после void main (void) между фигурными скобками. Там мы будем писать нашу программу.

Читайте также:  Readynas 102 сброс к заводским настройкам

Давайте внимательно глянем на наш МК:

Здесь мы видим основное название ножек, а в скобках их двойное предназначение. Двойное предназначение нас пока не интересует. Для нас в данный момент интересны обозначения PA, PB, PD. Их еще называют портами Ввода-Вывода. То есть на них можно что-то вводить и с них можно что-то выводить). В данном случае я хочу использовать ножки РВ0, РВ1, РВ2 для того, чтобы управлять светодиодами. На каждую из этих ножек я повешу по одному светодиоду, итого получается три. Остальные ножки нас не интересуют, так как мы не будем их использовать.

Наша схема будет выглядеть вот таким образом:

Следовательно, я должен настроить эти ножки для управления светодиодами.

Итак, в фигурных скобках пишем:

PORTB=0b00000000

0b — это бинарная система счисления. Настраивать в бинарной системе удобно тем, что каждый бит — это одна ножка МК. Поэтому счет идет справа-налево. Присмотритесь к рисунку выше. Здесь мы видим PORTB и нули при двоичной ситеме исчисления. Что это означает? А означает это то, что эти выводы при неиспользовании их в программе будут притянуты к нулю, то есть на них будет низкий потенциал или ноль Вольт. В случае, если мы видим единички установленные на каком-либо из битов, то это значит, что на этом порту при неипользовании в программе у нас будет высокий потенциал или плюс 5 вольт, или, говоря другими словами, этот вывод у нас будет принят к плюсу питания.

DDRB=0b00000111

Это означает, что PB0, PB1, PB2 настроены на выход. Считаем справа-налево, если вы не забыли. А если ноль, то значит настроены на вход.

Теперь рассмотрим while (1). Он означает, что кусочек программы, который будет написан после него, будет зацикливаться, то есть повторяться бесконечное количество раз.

Ну и собственно можно начать писать саму программу…

Итак, как она будет выглядеть?

Смотрите, программа находится между фигурными скобками. Эти скобки принадлежат while (1). То есть этот кусок программы будет повторяться бесконечное число раз.

Давайте разберем саму программу…

delay_ms(1000); Ждем 1000 миллисекунд, то есть 1 секунду.

PORTB.1=1; Через одну секунду на ножке PB1 появляется логическая единица, то есть 5 вольт, которые и зажгут второй светодиод

delay_ms(1000); Ждем еще одну секунду.

PORTB.2=1; Как только прошла секунда, у нас на ножке PB2 появляется логическая единичка, и, следовательно, зажигается третий светодиод.

delay_ms(2000); Ждем 2 секунды…Итого у нас горят все разом три светодиода в течение двух секунд.

Но потом как пройдут эти две секунды…

PORTB.2=0; На ножке PB2 появляется логический ноль, то есть напряжение исчезает. Третий светодиод тухнет.

delay_ms(1000); Ждем секунду

PORTB.1=0; Исчезает напряжение на ножке PB1. Светодиод второй тоже перестает источать свет.

delay_ms(1000); Ждем секунду.

PORTB.0=0; И на ножке PB0 напряжение тоже стает равно нулю. Первый светодиод тухнет тоже.

delay_ms(2000); Ждем две секунды и возвращаемся на начало программы, то есть к

PORTB.0=1;

delay_ms(1000);

Вот так выглядит полностью сама программа. Ее можно даже тупо скопировать и скомпилировать.

void main(void)
<
PORTB=0b00000000;
DDRB=0b00000111;

while (1)
<
PORTB.0=1;
delay_ms(1000);

Ну все, программа написана. Осталось дело за малым: преобразовать нашу писанину в машинный код, чтобы его понимал МК. Для этого мы нажимаем на кнопочку «создать все файлы проекта»

После нажатия на эту кнопку, у нас выскакивает окошко, в котором говорится о том, успешно ли прошла компиляция и тд. Если все нормально, то нажимаем ОК.

Если что-то не так, то отобразятся ошибки. Я специально убрал знак » ; » после одной строчки. Ругается примерно как-то так, и это не есть хорошо:

Если все ОК, то у вас в папке «Exe», там где у вас все проекты будет лежать готовый файлик, в данном случае «lesson 1. hex».

Теперь этот файлик с удовольствием скушает наш МК AVR и будет выполнять программку, которая находится в этом файле.

Источник