Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 2
Подключение светодиода к линии порта ввода/вывода Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.
Пример будем рассматривать на микроконтроллере ATMega8.
Программу писать будем в Atmel Studio 6.0.
Эмулировать схему будем в Proteus 7 Professional.
Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования. Максимальный ток, который способен пропустить каждый порт ввода/вывода составляет 40 mA. Максимальный ток, который способна пропускать каждая линия порта ввода/вывода составляет 20 mA. Прежде чем подключать нагрузку, в том числе и светодиод к линиям порта ввода/вывода нужно знать, что можно спалить микроконтроллер превысив допустимую нагрузку на линию порта ввода/вывода. Что бы ограничить ток, который протекает через линии порта ввода/вывода микроконтроллера нужно рассчитать и подключить резистор.Рис: Рапиновка светодиода.Рис: Подключение светодиода анодом к микроконтроллеру.Рис: Подключение светодиода катодом к микроконтроллеру. Сопротивление токоограничивающего резистора подключаемого к линиям портов ввода/вывода при подключении светодиода рассчитывается по формуле:где:
— Vs — напряжение источника питания;
— Vsp — падение напряжения на линии порта ввода/вывода;
— Vd — прямое падения напряжения на светодиоде;
— Id — прямой ток на светодиоде;
— Кn — коэффициент надежности роботы светодиода; Пример:
— напряжение источника питания – 5В;
— прямое падения напряжения на светодиоде – 2В (Берётся с datasheet на светодиод);
— прямой ток на светодиоде – 10мА (Берётся с datasheet на светодиод);
— коэффициент надежности роботы светодиода – 75% (Берётся с datasheet на светодиод);
— падение напряжения на линии порта ввода/вывода – 0,5В (Берётся с datasheet на микроконтроллер: Vol(output low voltage) – если ток втекает, и Voh (output high voltage) – если ток вытекает);
Таким образом номинал резистора R = 166,66 Om, подбирается ближайшее большее значение сопротивления.
Если не известно прямое напряжение светодиода, сопротивление можно рассчитать по закону Ома.где:
— U — напряжение, приложенное к участку цепи;
— I — номинальный ток линии порта ввода/вывода. Пример:
— напряжение, приложенное к участку цепи – 4,5В;
— номинальный ток линии порта ввода/вывода – 20мА.
Определив номинал резистора R, необходимо рассчитать мощность P, измеряемая в ваттах, которая будет выделяться в резисторе, в виде тепла при протекании тока в цепи.
где:
— U – напряжение, приложенное к участку цепи;
— I — номинальный ток линии порта ввода/вывода. Пример:
— напряжение, приложенное к участку цепи – 4,5В;
— прямой ток на светодиоде – 20мА.Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.
— подключения маломощного светодиода анодом к линии порта ввода/вывода:
// Подключаем внешние библиотеки
#include #include // Основная программа
int main(void) { // Настраиваем порты ввода/вывода DDRC = 0b11111111; //Настраиваем все разрады порта С на режим “Выход” PORTC = 0b11111111; //Устанавливаем все разряды порта C в лог.«1» (Навыходе порта напряжение равное Vcc) // Вечный цикл while (1) { } }
— подключения маломощного светодиода катодом к линии порта ввода/вывода:
// Подключаем внешние библиотеки
#include #include // Основная программа
int main(void) { // Настраиваем порты ввода/вывода DDRC = 0b11111111; //Настраиваем все разряды порта С на режим “Выход” PORTC = 0b00000000; //Устанавливаем все разряды порта C в лог.«0» (На выходе порта напряжение равное GND) // Вечный цикл while (1) { } }
— подключения маломощного светодиода анодом и катодом к линии порта ввода/вывода:
Источник: https://habr.com/post/253961/
Занятие №1. Простейшая программа
Дата публикации: 18 декабря 2010.
Рейтинг: 5 / 5
Угловые скобки < и > указывают компилятору, что подключаемые файлы нужно сначала искать в стандартной папке WinAvr с именем include. Двойные кавычки “ и “ указывают компилятору начинать поиск с директории, в которой хранится проект.
Для каждого типа микроконтроллера есть свой заголовочный файл. Для ATMega8 этот файл называется iom8.h, для ATtiny2313 – iotn2313.h.
В начале каждой программы мы должны подключать заголовочный файл того микроконтроллера, который мы используем. Но есть и общий заголовочный файл io.h.
Препроцессор обрабатывает этот файл и в зависимости от настроек проекта включает в нашу программу нужный заголовочный файл.
Для нас первая строчка программы будет выглядеть вот так:#include Любая программа на языке Си должна обязательно содержать одну главную функцию. Она имеет имя main. Выполнение программы всегда начинается с выполнения функции main. У функции есть заголовок – int main(void) и тело – оно ограниченно фигурными скобками {}.
int main(void)
{тело функции
}
В тело функции мы и будем добавлять наш код. Перед именем функции указывается тип возвращаемого значения. Если функция не возвращает значение – используется ключевое void.
int – это целое 2-х байтное число, диапазон значений от – 32768 до 32767
После имени функции в скобках () указываются параметры, которые передаются функции при ее вызове. Если функция без параметров – используется ключевое слово void. Функция main содержит в себе набор команд, настройки системы и главный цикл программы.
Далее настраиваем порт D на вход. Режим работы порта определяется содержимым регистра DDRD(регистр направления передачи информации). Записываем в этот регистр число “0x00” (0b0000000 – в двоичном виде), кроме кнопки к этому порту ничего не подключено, поэтому настраиваем весь порт D на вход.
Настроить порт поразрядно можно записав в каждый бит регистра числа 0 или 1 (0-вход, 1-выход), например DDRD = 0x81 (0b10000001) – первая и последняя линия порта D работают на выход, остальные на вход. Необходимо также подключить внутренний нагрузочный резистор.
Включением и отключением внутренних резисторов управляет регистр PORTx, если порт находится в режиме ввода. Запишем туда единицы.
Настраиваем порт B на выход. Режим работы порта определяется содержимым регистра DDRB. Ничего кроме светодиода к порту B не подключено, поэтому можно весь порт настроить на выход.
Это делается записью в регистр DDRB числа “0xFF”. Для того чтобы при первом включении светодиод не загорелся запишем в порт B логические нули.
Это делается записью PORTB = 0x00;
Для присвоения значений используется символ “=” и называется оператором присваивания, нельзя путать со знаком “равно”
Настройка портов будет выглядеть так:DDRD = 0x00;PORTD = 0xFF;DDRB = 0xFF;
PORTB = 0x00;
Пишем основной цикл программы. while (“пока” с англ.) – эта команда организует цикл, многократно повторяя тело цикла до тех пор пока выполняется условие, т. е пока выражение в скобках является истинным. В языке Си принято считать , что выражение истинно, если оно не равно нулю, и ложно, если равно.
Команда выглядит следующим образом:
while (условие)
{тело цикла
}
В нашем случае основной цикл будет состоять лишь из одной команды. Эта команда присваивает регистру PORTB инвертируемое значение регистра PORTD.
PORTB = ~PIND; //взять значение из порта D, проинвертировать его и присвоить PORTB (записать в PORTB)
// выражения на языке Си читаются справа налево
PIND регистр ввода информации. Для того, чтобы прочитать информацию с внешнего вывода контроллера, нужно сначала перевести нужный разряд порта в режим ввода. То есть записать в соответствующий бит регистра DDRx ноль.
Только после этого на данный вывод можно подавать цифровой сигнал с внешнего устройства. Далее микроконтроллер прочитает байт из регистра PINx. Содержимое соответствующего бита соответствует сигналу на внешнем выводе порта.
Наша программа готова и выглядит так:
#include int main (void) { DDRD = 0x00; //порт D – вход PORTD = 0xFF; //подключаем нагрузочный резистор DDRB = 0xFF; //порт B – выход PORTB = 0x00; //устанавливаем 0 на выходе while(1) { PORTB = ~PIND; //~ знак поразрядного инвертирования } }
В языке Си широко используются комментарии. Есть два способа написания.
/*Комментарий*/
//Комментарий
При этом компилятор не будет обращать внимание на то что написано в комментарии.
Если используя эту же программу и подключить к микроконтроллеру 8 кнопок и 8 светодиодов, как показано на рисунке 2, то будет понятно что каждый бит порта D соответствует своему биту порта B. Нажимая кнопку SB1 – загорается HL1, нажимая кнопку SB2 – загорается HL2 и т.д.
Рисунок 2
В статье были использованы материалы из книги Белова А.В. “Самоучитель разработчика устройств на AVR”
Печать E-mail
Авторизация
Сейчас 117 гостей и ни одного зарегистрированного пользователя на сайте
Источник: https://radioparty.ru/prog-avr/program-c/224-lesson1
Как подключить светодиод к микроконтроллеру
В разделе о дискретных выходах я в общих чертах рассказал о том, как микроконтроллер может управлять нагрузкой. То есть как эти дискретные выходы используются.
Сегодня буду говорить о более конкретном использовании дискретных выходов – о том, как подключить светодиод к выходу микроконтроллера.
Почему именно светодиод?
Ну потому что мои статьи предназначены, в основном, для начинающих. А подключение светодиода – это довольно простое действие, которое может повторить любой, даже без понимания основ электроники и электротехники.
Но, даже в таком простом деле, как подключение светодиода, есть свои особенности, незнание которых, конечно, не приведёт к третьей мировой войне, но всё-же может испортить вам настроение путём “сгорания” светодиода или даже выхода из строя микроконтроллера.
Также отмечу, что умение подключать светодиод может пригодиться вам и для управления более мощной нагрузкой, например, с помощью оптрона. Как известно оптрон (или оптопара) – это пара из свето- и фотодиода. Соответственно, если вы научитесь подключать к микроконтроллеру светодиод, то вы также сможете подключить и оптрон.
Светодиоды потребляют очень небольшой ток. В зависимости от типа светодиода – примерно от 3 до 20 мА. А это означает, что почти любой светодиод можно подключать непосредственно к выходу микроконтроллера.
Например, при логическом нуле на выходе микроконтроллера серии AVR, ток может достигать 20 мА, чего вполне достаточно для включения светодиода.
Однако надо понимать и помнить, что напрямую светодиод нельзя подключать к какому-либо источнику энергии, потому что в этом случае ток через светодиод почти наверняка превысит допустимый, и светодиод может выйти из строя. Поэтому светодиоды всегда включают последовательно с резистором, который ограничивает ток до допустимого значения.
Схема включения светодиода показана на рисунке.
Таким образом можно подключить светодиод к любому источнику питания. Сопротивление и мощность рассеивания ограничительного резистора рассчитывается исходя из типа светодиода и напряжения питания. Способы расчета здесь приводить не буду. Если кому интересно, то изучайте закон Ома (например, здесь).
А теперь схема подключения светодиода к микроконтроллеру:
Здесь сопротивление резистора уже определено и рассчитано на напряжение 5В (очень многие микроконтроллеры питаются именно от такого напряжения).
Таким же образом можно подключить и оптрон.
ВНИМАНИЕ!
На рисунке показана упрощённая схема подключения оптрона к микроконтроллеру.
Как я уже сказал, внутри оптрона находится пара оптических элементов. Один из них, как правило – это светодиод (передатчик светового излучения). А второй (приёмник излучения) может быть фотодиодом, фототранзистором, фотосимистором и т.п.
Например, используя оптрон с фотосимистором, можно с помощью микроконтроллера управлять высоковольтной нагрузкой, такой как лампа накаливания на 220В.
Таким образом достигается гальваническая развязка между высоковольтной частью устройства на микроконтроллере, и низковольтной (то есть схемой управления устройством).
Гальваническую развязку можно выполнить, например, и с помощью реле. Однако в случае использования реле при управлении нагрузкой контакты реле почти наверняка будут искрить. А это нежелательно, а иногда и просто недопустимо (например, на взрывоопасных объектах).
В оптроне же никакого искрения не возникает.
Микроконтроллеры для ЧАЙНИКОВБесплатная рассылка о микроконтроллерах. Рассылка содержит как бесплатную информацию для начинающих, так и ссылки на платные продукты (книги, видеокурсы и др.) для тех, кто захочет вникнуть в тему более глубоко. Подробнее… |
Источник: http://av-assembler.ru/mc/how-to-connect-led-to-microcontroller.php
Подключение кнопки и светодиода к одному порту микроконтроллера
Во многих случаях число выводов предполагаемого к использованию в разработке микроконтроллера оказывается недостаточным для раздельного подключения к нему всех необходимых внешних цепей.
Применение же микроконтроллера с большим числом выводов приводит к удорожанию и увеличению размеров устройства. Но многие порты микроконтроллеров обладают свойством двунаправленности.
Воспользовавшись этим, можно объединять на них устройства как ввода (например, кнопки управления), так и индикации (например, светодиоды). Это даст возможность применить микроконтроллер с меньшим числом выводов.
Возможная схема такого объединения показана на рисунке. Используемый вывод порта микроконтроллера, работая большую часть времени в режиме “Выход”, управляет светодиодами HL1 и HL2.
Подключённая к нему же цепь выключателя SA1, независимо от его положения, мало влияет на выходное напряжение на выводе порта и не изменяет состояния светодиодов Чтобы определить положение этого выключателя, микроконтроллер временно переводит вывод порта в режим “Вход” и подключает к нему свой внутренний резистор, соединяющий этот вывод с плюсом питания.
Когда выключатель SA1 разомкнут, ток внутреннего резистора создаёт на цепи R2,HL1,HL2 падение напряжения более 3 В, что соответствует высокому логическому уровню.
Чтобы увеличить это напряжение (иногда оно оказывается недостаточным), можно заменить один или оба светодиода красного свечения светодиодами зелёного свечения, прямое падение напряжения на которых больше.
Выполнив операцию ввода и обнаружив лог 1 в соответствующем разряде регистра используемого порта, микроконтроллер предпримет действия, соответствующие разомкнутому выключателю.Если выключатель SA1 замкнут, ток внутреннего резистора создаст на резисторе R1 падение напряжения не более 1,5 В.
При таком напряжении заметный ток через светодиоды HL1 и HL2 не течёт, и они не влияют на работу узла. При считывании порта в соответствующий разряд его регистра будет занесён лог 0, что послужит признаком замкнутого выключателя SA1. Определив положение выключателя, микроконтроллер возвращает используемый вывод порта в режим “Выход”.
Поскольку интервал времени, необходимый для описанных операций, получается очень коротким, возможное мигание светодиодов при их выполнении остаётся совершенно незаметным наблюдающему. Видимое состояние светодиодов всегда определяется только логическим состоянием выходного буфера порта.
cbi DDRB,0 ;перевести РВО в режим “вход”
sbi PORTB,0 ;подключить внутренний резистор
ldi r18,200 ;задержка на переходной процесс
;(75 мкс с кварцем на 8 МГц) delayPP:
dec rl8
brne delayPP
sbis PINB,0 ;пропустить при 1 на входе РВО,
ori REJIM,0bl0000000 ;иначе установить режим
cbi PORTB,0 ;отключить внутренний резистор
sbi DDRB,0 ;перевести РВО в режим “выход”
Выше приведён фрагмент программы на языке ассемблера для микроконтроллеров семейства AVR, в котором определяется состояние выключателя, соединённого по рассмотренной схеме с выводом порта РВО микроконтроллера.
После переключения вывода в режим “Вход” выдерживается пауза длительностью 75 мкс, необходимая для завершения переходных процессов. Если выключатель замкнут, в старший разряд регистра REJIM будет записана единица.
А. МИХАЙЛОВ, г. Алматы, Казахстан
Источник: http://radio-hobby.org/modules/news/article.php?storyid=1173
Формирование сигналов аналоговой формы на выводах МК AVR. Часть 2. Ступенчатое управление яркостью светодиода. — Сообщество «Радиокружок» на DRIVE2
В продолжении к предыдущей теме, представляю Вашему вниманию простой пример программы для микроконтроллера AVR, в котором выполняется ступенчатое изменение яркости свечения светодиода.
Светодиод подключен к 7 разряду порта D. Как подключить светодиод можно почитать здесь и посмотреть в предыдущем примере.
В основе программы также формируются пакеты импульсов с частотой выше 50Гц. Значение длительности импульсов определяется содержимым массива P[], а длительность паузы вычисляется непосредственно при вызове функции формирования временного интервала как разность между периодом следования сигнала и длительности импульса в строке 28.
Представленная программа позволяет получить не более 20 различных уровней яркости свечения светодиодов. Это связано с использованием функций delay_ms() из стандартной библиотеки delay.h. Функция позволяет получать интервалы времени, кратные 1мс и не меньше 1мс. Значения массива P[], присвоенные ему в 17 строке определяют мощность, передаваемую светодиоду, как P[i]*5% (т.е. с шагом в 5%).
Количество изменений яркости светодиода определяется значением переменной константного типа MAX.
Длительность сигналов одной градации и период ШИМ сигнала определены макросами в строках 8 и 9. Их также можно было определить как переменные константного типа, но это в данном случае не критично.
Стоит уделить внимание тому, как происходит формирование длительности сигналов с установленными градациями.
Так как граница восприятия зрением отдельных оптических импульсов составляет 50Гц, то периодичность ШИМ последовательности не может превышать значения 20мс, а длительность получаемых в результате преобразования аналоговых сигналов значительно превышает это время.
Таким образом, для получения аналогового сигнала требуемой продолжительности необходимо сформировать такой пакет импульсов, сума периодов в котором равнялась бы требуемой величине интервала времени.
Ограничение количества импульсов в пакете рассчитывается как разность между длительностью аналогового сигнала D и периодом следования ШИМ последовательности импульсов T в условиях цикла for в строке 24. Данное вычисление будет произведено однократно препроцессором на стадии компиляции исходного текста программы, из-за того, что эти имена определены как макроподстановки.
Изменение яркости свечения светодиода по отдельным градациям происходит в цикле for в строке 23, путем перебора значений массива P[], которые преобразуются в значения длительности импульса и паузы ШИМ сигнала.
Формируемый сигнал показан на рисунке.
Диаграмма формируемого сигнала
Источник: https://www.drive2.ru/c/470029127320077277/
Записки программиста
Видели когда-нибудь светодиодную матрицу с бегущей по ней строкой текста? Такие можно увидеть в метро, автобусах, аеропортах, да много где. В одной матрице содержатся сотни светодиодов.
А свободных пинов у микроконтроллера обычно лишь несколько десятков, а то и меньше. То есть, он никак не может подключить по светодиоду на каждый пин и управлять матрицей, подавая на эти пины высокое и низкое напряжение.
Так как же это тогда работает?<\p>
Матричная схема
Первой способ заключается в использовании матричной схемы:
Резисторы на этой схеме имеют сопротивление, типичное для подключаемых последовательно со светодиодом резисторов. Например, 220 Ом.
Светодиоды объединяются в матрицу, в соответствии с приведенной схемой. Строки и столбцы подключаются к пинам микроконтроллера. Например, если у микроконтроллера есть 16 свободных пинов, это позволяет сделать матрицу 8×8. Таким образом, используя всего лишь 16 пинов, можно управлять матрицей из 64 светодиодов.
Фокус заключается в том, что на самом деле одновременно горят светодиоды, принадлежащие только одной строке или одному столбцу. Допустим, что микроконтроллеру нужно зажечь LED1, LED3, LED5 и LED8. Сначала он подает высокое напряжение на первый столбец и низкое на второй и третий.
В первом столбце нужно зажечь LED1 и LED3, поэтому микроконтроллер подает низкое напряжение на первую и третью строку, на вторую подается высокое. В результате ток начинает течь через LED1 и LED3. Через все остальные светодиоды ток не идет, так как диод пропускает ток только в одну сторону.
Затем эти светодиоды гаснут и аналогичным образом зажигаются светодиоды в других столбцах.
При достаточно частой смене «кадров» человеческому глазу кажется, что светодиоды горят одновременно. Минимальный FPS в случае со светодиодами составляет 60, но на всякий случай лучше взять 70.
В частности, при FPS 60 присутствует еле-еле заметная рябь. Кроме того, при FPS меньше 70-и если вы сфотографируете светодиоды на iPhone, то на фотографии скорее всего увидите мусор.
В кино и видеоиграх требования к FPS попроще по той причине, что кадры похожи между собой.
Пример использования матричной схемы для управления семисегментными индикаторами:
Смотрите, все работает безо всяких счетчиков 4026, магия! Семисегментные индикаторы идеально вписываются в матричную схему. Как раз у нас три индикатора, в каждом по 7 светодиодов (светодиоды, зажигающие точку, в данном примере не используются) с общим катодом. Получаем матрицу 3×7. Всего при помощи десяти пинов происходит управление 21-м светодиодом.
В общем случае, используя N пинов, можно управлять до (N/2)**2 светодиодами. Кроме того, матричную схему легко модифицировать для считывания состояния кнопок. Наконец, ничто не помешает по аналогии сделать кубическую схему или схему еще большего порядка. В таких схемах дополнительно может потребоваться использовать транзисторы или чипы стандартной логики 74xx.
Чарлиплексинг
Чарлиплексинг (он же метод Чарли) легко объяснить на примере следующей схемы:
В чарлиплексинге используется три состояния пинов микроконтроллера. На один пин подается высокое напряжение, на второй низкое, а все остальные пины переключаются на вход. В этом режиме они переходят в так называемое высокоимпедансное состояние или Z-состояние. Это означает, что на пинах стоит очень высокое сопротивление, и ток через них почти не течет.
Если в приведенной схеме подать высокое напряжение на первую строку, низкое на второю и перевести оставшуюся строку в Z-состояние, то ток пойдет через светодиод LED10, а все остальные светодиоды гореть не будут. Часто переключая горящий светодиод, можно создать иллюзию одновременного горения нескольких светодиодов.
Пример использования чарлиплексинга для создания электронных игральных костей:
Чтобы было интереснее, в этом проекте я использовал микроконтроллер ATtiny85, который имеет лишь 8 пинов. Из них два используется для питания и еще один представляет собой Reset. Итого остается 5 пинов. Тем не менее, их оказывается достаточно для управления 14-ю светодиодами, и еще один пин остается для считывания кнопки.
На самом деле, при наличии N пинов, чарлиплексинг позволяет управлять до N*(N-1) светодиодов. То есть, если N равен 4, как в нашем случае, то можно управлять лишь 12-ю светодиодами. К счастью, специфика игральных костей такова, что все светодиоды, кроме центральных, загораются в паре с другим светодиодом. Поэтому получилось аж 14 светодиодов, и при этом довольно удобная разводка.
Чарлиплексинг позволяет управлять куда большим числом светодиодов, чем матричный метод. Однако он сложнее в разводке, и его применимость для управления семисегментными индикаторами или RGB-светодиодами ограничена из-за использования в них общего катода.
Кроме того, его нельзя использовать для считывания состояния кнопок, как матричный метод. Тем не менее, можно исхитриться, и без использования дополнительных пинов считывать пару лишних кнопок, используя пины, находящиеся в данный момент в Z-состоянии.
Заключение
Исходники к этой заметке вы найдете на GitHub. Стоит отметить, что описанные методы нередко используют в сочетании с декодерами и сдвиговыми регистрами. Однако это уже тема для отдельной заметки.
https://www.youtube.com/watch?v=dqAe7g1pgbo
Как всегда, буду рад любым вашим вопросам и дополнениям.
Дополнение: В продолжение темы мультиплексирования см Как я спаял электронные игральные кости на базе ATtiny85 и Больше чипов 74xx: сдвиговые регистры и декодеры.
Источник: https://eax.me/avr-multiplexing/
Подключение Lcd к микроконтроллеру AVR. Урок AVR 4
Источник: http://microsin.net/programming/avr/led-matrix-dynamic-indication.html
Adblockdetector