Подключение светодиодов к микроконтроллеру avr

Устройство и работа портов ввода-вывода микроконтроллеров AVR. Часть 2

Подключение светодиода к линии порта ввода/вывода Изучив данный материал, в котором все очень детально и подробно описано с большим количеством примеров, вы сможете легко овладеть и программировать порты ввода/вывода микроконтроллеров AVR.
Пример будем рассматривать на микроконтроллере ATMega8.

Программу писать будем в Atmel Studio 6.0.

Эмулировать схему будем в Proteus 7 Professional.

Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования. Максимальный ток, который способен пропустить каждый порт ввода/вывода составляет 40 mA. Максимальный ток, который способна пропускать каждая линия порта ввода/вывода составляет 20 mA. Прежде чем подключать нагрузку, в том числе и светодиод к линиям порта ввода/вывода нужно знать, что можно спалить микроконтроллер превысив допустимую нагрузку на линию порта ввода/вывода. Что бы ограничить ток, который протекает через линии порта ввода/вывода микроконтроллера нужно рассчитать и подключить резистор.Рис: Рапиновка светодиода.Рис: Подключение светодиода анодом к микроконтроллеру.Рис: Подключение светодиода катодом к микроконтроллеру. Сопротивление токоограничивающего резистора подключаемого к линиям портов ввода/вывода при подключении светодиода рассчитывается по формуле:где:

Vs — напряжение источника питания;

Vsp — падение напряжения на линии порта ввода/вывода;
Vd — прямое падения напряжения на светодиоде;
Id — прямой ток на светодиоде;
Кn — коэффициент надежности роботы светодиода; Пример:

— напряжение источника питания – ;

— прямое падения напряжения на светодиоде – (Берётся с 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

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Опубликовано 2010-03-07 09:55:14 автором Ruslan

Научившись мигать светодиодом, вам, наверное, захочется подключить к микроконтроллеру что-то более информативное, например Lcd дисплей. Как это сделать? Да всё, как всегда, очень просто. Символьный ЖКИ мы подружим сегодня с нашим старым знакомым ATmega8. Для этого нам потребуется сам Lcd, я использовал знакосинтезирующий ЖКИ 16×2, и микроконтроллер atmega8.

Для начала напишем программу, которая будет что-либо выводить на дисплей. Для этого откроем Code Vision AVR, создадим новый проект. В закладке LCD выбираем порт, к которому будет подключен дисплей.

Я подключил к порту D, выбираем File -> Creative Save and Exit. Указываем, куда будем сохранять файлы и смотрим на код программы.

Далее для вывода строки нам понадобится добавить несколько строк кода

  • char *buffer_Lcd=”Hello”; //Создаем выводимую строку
  • lcd_gotoxy(0, 0); // Переводим курсор на первый символ первой строки
  • lcd_puts(buffer_Lcd); // Выводим строку

Полный код представлен ниже:

#include
// Alphanumeric LCD Module functions
#include
char *buffer_Lcd=”Hello”; //Создаем выводимую строку void main(void)
{
// Input/Output Ports initialization
// Port B initialization
PORTB=0x00;
DDRB=0x00; // Port C initialization
PORTC=0x00;
DDRC=0x00; // Port D initialization
PORTD=0x00;
DDRD=0x00; // Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00; // Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00; // Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00; // External Interrupt(s) initialization
MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00; // USART initialization
// USART disabled
UCSRB=0x00; // Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00; // ADC initialization
// ADC disabled
ADCSRA=0x00; // SPI initialization
// SPI disabled
SPCR=0x00; // TWI initialization
// TWI disabled
TWCR=0x00; // Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS – PORTD Bit 0
// RD – PORTD Bit 1
// EN – PORTD Bit 2
// D4 – PORTD Bit 4
// D5 – PORTD Bit 5
// D6 – PORTD Bit 6
// D7 – PORTD Bit 7
// Characters/line: 16
lcd_init(16);
lcd_gotoxy(0, 0); // Переводим курсор на первый символ первой строки lcd_puts(buffer_Lcd); // Выводим строку while (1) { }
}
}

Функция Объявлениe
lcd_init(количество_символов_в_строке) Инициализирует ЖКИ с введенным количеством символов в строке.
lcd_gotoxy(x, y) Переводит курсор в точку (x, y).
lcd_clear() Очищает ЖКИ
lcd_puts(char *stroka) Выводит массив символов
lcd_putchar(char simvol) Выводит один символ

Таблица 1. Функции библиотеки Lcd.

h для работы с дисплеем

Давайте теперь разберемся с выводами дисплея.

  • Vdd – + 5 вольт. – Питание Lcd.
  • Vss – Земля ( – ). – Питание Lcd.
  • V0 или VEE – контрастность дисплея. – Если посадить этот вывод на минус без резистора,то мы получим максимальную контрастность. Необходимо этот контакт подключить к минусу через переменный резистор примерно на 10 кОм.
  • А и К анод и катод подсветки lcd
  • RS – командный флаг – если подать 0, то мы посылаем команду. 1 – посылаются данные.
  • R/W – Чтение/запись – 1 – читаем данные, 0 – записываем.
  • E – импульс – чтобы lcd начал обработку данных с остальных выводов
  • DB0 – DB7 – служат для передачи данных между lcd и микроконтроллером

Для повторения в железе нам понадобится программатор USBasp, отладочная zif панель и lcd дисплей.

Подсоединяем дисплей как сказано выше, заливаем прошывку в мк я использовал avr dude команда для прошывки sudo avrdude -c usbasp -p m8 -U flash:w:'/media/ruslan/Media/Greenchip.com.ua/Lessons/lcd/Exe/lcd.hex':iи получаем

Проект в Proteus и программа к уроку находятся в архиве lcd.zip.

Источник: http://articles.greenchip.com.ua/1-1-27.html

Динамическая индикация на примере управления светодиодной матрицей 8×8 GNM-7881AUE | avr | programming

Чтобы понять, что такое динамическая индикация, и для чего она нужна, нужно рассмотреть для примера промышленный индикатор GNM-7881AUE.

В матрице GNM-7881AUE 64 красных светодиода.

Если выводить из матрицы контакты всех светодиодов для управления каждым по отдельности, то понадобится как минимум 65 внешних контактов на корпусе матрицы, а также микроконтроллер с 64 портами вывода.

Несомненно, это технологически реализовать очень трудно (и нецелесообразно). Поэтому на заводе светодиоды объединили в 8 групп по строкам и столбцам, и соединили их в матрицу следующим образом:

При такой схеме подключения внешних контактов матрицы и портов микроконтроллера потребуется существенно меньше – только 16. Чтобы зажечь, например, светодиод в левом верхнем углу, нужно на контакт 13 матрицы подать плюс, а на контакт 9 минус. Для этого можно использовать, например, порты вывода микроконтроллера ATmega16 или ATmega32 и резистор:

Светодиод слева вверху зажжется, если микроконтроллер на порт PA0 выставит лог. 1 (+5 вольт), а на PB3 лог. 0 (0 вольт).

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

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

ОК, все очень красиво, но как, например, зажечь один светодиод в центре матрицы, оставив остальные при этом выключенными? Или, как, наоборот, зажечь все светодиоды, кроме одного-двух в центре? Понятно, что при такой схеме включения невозможно этого добиться простой подачей на выходные порты ноликов и единичек (с помощью статической индикации). Тут на помощь как раз и приходит динамическая индикация.

[Динамическая индикация]

Название “динамическая” происходит от того, что формирование изображения происходит не статически, а в динамике, т. е. сначала, например, показывают только первый столбец изображения (все остальные столбцы погашены), на втором шаге показывают только второй столбец, и так далее до 8-столбца.

Если это делать быстро (с периодом прокрутки всех шагов не меньше 20 мс), то человеческий глаз не воспримет переключения между столбцами, и ему будет казаться, что отображается сразу вся картинка. Такое последовательное отображение элементов изображения называется разверткой.

Для того, чтобы изображение не мерцало и яркость всех точек была одинакова, необходимо выполнение следующих условий:

1. Длительность отображения каждого столбца постоянна, одинакова для всех столбцов.
2. Частота смены столбцов не меняется.

Почему необходимо отображать картинку по столбцам, а не по строкам? Потому что в данной схеме мы подключили токоограничительные резисторы к линиям строк.

Чтобы обеспечить одинаковую яркость свечения каждой точки, нам нужно обеспечить одинаковый средний ток через каждый светодиод, что возможно при такой схеме только при развертке по столбцам (когда по столбцам-анодам пробегает лог. 1).

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

Для примера приведу алгоритм отображения цифры 2 (на рисунке светодиоды, которые надо зажигать, я закрасил красным цветом), столбцы и строки нумеруются от 1 до 8:

1. Отображение столбца 1. Для этого на PA0 подаем лог. 1, на PA1..PA7 подаем лог. 0. На порты PB3, PB4, PD0, PD1, PD3, PD5..PD7 также лог. 1. Держим матрицу с таком состоянии 2.5 мс.
2. Отображение столбца 2. Для этого на PA1 подаем лог. 1, на PA0, PA2..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD1, PD3, PD7, подаем лог. 0 на PD0, PD5, PD6.

Держим матрицу с таком состоянии 2.5 мс.
3. Отображение столбца 3. Для этого на PA2 подаем лог. 1, на PA0, PA1, PA3..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PD0, PD1, PD5, PD7, подаем лог. 0 на PB4, PD3, PD6. Держим матрицу с таком состоянии 2.5 мс.
4. Отображение столбца 4. Все то же самое, что и на шаге 3, только подаем лог.

1 не на PA2, а на PA3. Держим матрицу с таком состоянии 2.5 мс.
5. Отображение столбца 5. Все то же самое, что и на шаге 4, только подаем лог. 1 не на PA3, а на PA4. Держим матрицу с таком состоянии 2.5 мс.
6. Отображение столбца 6. Все то же самое, что и на шаге 5, только подаем лог. 1 не на PA4, а на PA5. Держим матрицу с таком состоянии 2.

5 мс.
7. Отображение столбца 7. Для этого на PA6 подаем лог. 1, на PA0..PA5, PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD0, PD3, PD5, PD7, подаем лог. 0 на PD0, PD1, PD6. Держим матрицу с таком состоянии 2.5 мс.
8. Отображение столбца 8. Все то же самое, что и на шаге 1, только подаем лог. 1 не на PA0, а на PA7.

Держим матрицу с таком состоянии 2.5 мс.

Цикл шагов 1..8 занял ровно 20 мс (2.5+2.5+2.5+2.5+2.5+2.5+2.5+2.5). При непрерывном чередовании шагов 12345678123… получится отображение символа 2 без видимого мерцания. По похожему принципу работают все “взрослые” системы индикации в автобусах, электричках, турникетах, рекламных табло.

[Пример управления матрицей LED8X8]

Для экспериментирования со знакогенераторами 8×8 я сделал небольшой проект для отображения символов на индикаторе GNM-7881AUE. Схема подключения индикатора – точно такая же, как используемая при обсуждении динамической индикации. Красными метками я указал номера выходных контактов макетной платы AVR-USB-MEGA16.

Проект управляется через виртуальный COM-порт – в консоли можно было ввести шестнадцатеричный код символа, и он тут же высвечивается на индикаторе. На фото видна макетная плата AVR-USB-MEGA16, на которую припаян индикатор GNM-7881AUE (весь монтаж и резисторы SMD 0805 номинала 150 Ом выполнен с обратной стороны макетной платы).

Потом проект оброс возможностью отображения бегущей строки и вывода картинок BMP, что позволяет делать забавную анимацию. В качестве знакогенератора используется набор символов от ZX-Spectrum, дополненный русскими символами.

[Что внутри проекта LED8x8]

Проект собран на основе статьи [1]. Скачанный пример дополнен командами, и в главный цикл main добавлена процедура динамической индикации, отображающая символы, бегущую строку или анимацию из картинок BMP.

Питается и конфигурируется устройство от USB.

Когда активен интерфейс USB, то возможно мерцание отображаемой картинки, так как на программную поддержку протокола (библиотека V-USB) тратится большая доля процессорного времени.

В память можно занести любое количество текстов и картинок (пока хватит места в EEPROM), они сохраняются в памяти после выключения питания.

Управление и конфигурирование осуществляется через текстовую консоль, подключенную к виртуальному COM-порту (через любую консоль типа Hyperterminal, Terraterm или putty), интерфейс управления имеет систему подсказок. Вот пример сеанса работы с управляющей консолью проекта:

Тексты можно вводить командой TXT, а BMP-картинки в черно-белом формате 8×8 пикселов можно загрузить по протоколу XMODEM (моя любимая консоль SecureCRT умеет это делать).

И тексты, и картинки добавляются в общий пул, и проигрываются по команде RUN в том порядке, в каком Вы их занесли в память — поэтому при желании можно сочинить очень сложную поздравительную комбинацию.

Скорость бегущей строки и смены картинок меняется командой SPEED (от 1 до 10). Доступны также некоторые отладочные команды.

[Применение матричных индикаторов 5×7 точек]

Для светодиодной матрицы можно применить не только индикаторы 8×8 точек, но также и индикаторы 5×7 точек, которые иногда проще найти и купить. К примеру, есть индикаторы TFB2457C, TFB2757C, которые хороши тем, что их можно стыковать друг с другом для получения матрицы любого размера. Вот пример организации матрицы 7×10 точек:

[Применение силовых ключей на транзисторах]

Как Вы уже наверное успели заметить, в вышеупомянутых схемах подключения LED-индикатора аноды и катоды светодиодной матрицы подключены к портам микроконтроллера напрямую (в нашем примере аноды) и через токоограничительные резисторы (катоды).

При этом порты, нагруженные на аноды, испытывают повышенную нагрузку, если необходимо зажечь весь столбец анода – чем больше светодиодов нужно зажечь в столбце, тем выше нагрузка.

В самом худшем случае, когда для нашего примера нужно зажечь все светодиоды в столбце, на один порт для анода приходится нагрузка из 8 параллельно включенных цепочек из светодиодов и резисторов 150 Ом.

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

Чтобы улучшить работу схемы, для нашего примера целесообразно умощнить выходы, подключенные к анодам. Для умощнения портов ввода вывода применяют транзисторы, работающие в ключевом режиме [4].

Можно применить как биполярные, так и полевые транзисторы, но лучше всего поставить полевые транзисторы (MOSFET). Есть дешевые миниатюрные MOSFET транзисторы с P-каналом, например IRLML6401 или IRLML6402 в корпусе SOT-23.

Полевой транзистор в нашем случае хорош тем, что для его подключения не нужны никакие дополнительные элементы (типа токоограничительных резисторов), и на открытом канале транзистора падает очень маленькое напряжение, так как сопротивление открытого канала IRLML6401 порядка 0.05 ом.

Поэтому можно легко коммутировать большую токовую нагрузку без почти без потерь мощности – до 3.4A, что для нас более чем достаточно.

На рисунке вывод 1 обозначает затвор G (Gate), 2 исток S (Source), 3 сток D (Drain) транзистора. Чтобы умощнить аноды, транзистор нужно подключить по следующей простой схеме – затвор к порту микроконтроллера (например, к PORTA7), исток S к +5V, а сток D к анодам столбца матрицы.

Для подключения матрицы из нашего примера понадобится 8 транзисторов IRLML6401, затворы которых подключены к портам PA0..PA7 микроконтроллера ATmega32A, истоки к +5V питания, а стоки к соответствующим столбцам анодов матрицы. Нагрузочные резисторы, которые подключены к катодам матрицы, можно уменьшить для нашего примера до номинала 75 ом.

[Ссылки]

1. USB консоль для управления радиолюбительскими приборами.
2. Проект LED8x8 для AVR Studio.
3. Видеоролик на depositfiles и на YouTube.
4. Реле и транзисторы: как они работают в качестве электронных переключателей.