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

Подключение светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8

В этой статье мы рассмотрим подключение светодиодной матрицы 8х8 к микроконтроллеру ATmega8 (семейство AVR), на которой после этого можно отображать буквы алфавита. Типовая светодиодная матрица 8х8 показана на следующем рисунке.

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

Светодиодная матрица 8х8 стоит столько же, сколько и 64 светодиода, а работать с ней проще. Расположение ее контактов показано на следующем рисунке. Чтобы исключить ошибки при ее подключении необходимо пронумеровать ее контакты в точном соответствии с приведенным рисунком. Далее в статье мы более подробно рассмотрим внутреннюю схему соединений светодиодной матрицы.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega8 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Светодиодная матрица 8х8 (купить на AliExpress).
  4. Конденсатор 100 мкФ (соединенный по питанию) (купить на AliExpress).
  5. Резистор 1 кОм (8 шт.) (купить на AliExpress).
  6. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема подключения светодиодной матрицы 8х8 к микроконтроллеру AVR ATmega8 приведена на следующем рисунке.

В схеме необходимо сделать следующие соединения светодиодной матрицы с микроконтроллером:
PORTD, PIN0 —————— к контакту PIN13 светодиодной матрицы
PORTD, PIN1 —————— к контакту PIN03 светодиодной матрицы
PORTD, PIN2 —————— к контакту PIN04 светодиодной матрицы
PORTD, PIN3 —————— к контакту PIN10 светодиодной матрицы
PORTD, PIN4 —————— к контакту PIN06 светодиодной матрицы
PORTD, PIN5 —————— к контакту PIN11 светодиодной матрицы
PORTD, PIN6 —————— к контакту PIN15 светодиодной матрицы
PORTD, PIN7 —————— к контакту PIN16 светодиодной матрицы

PORTB, PIN0 —————— к контакту PIN09 светодиодной матрицы
PORTB, PIN1 —————— к контакту PIN14 светодиодной матрицы
PORTB, PIN2 —————— к контакту PIN08 светодиодной матрицы
PORTB, PIN3 —————— к контакту PIN12 светодиодной матрицы
PORTC, PIN0 —————— к контакту PIN01 светодиодной матрицы
PORTC, PIN1 —————— к контакту PIN07 светодиодной матрицы
PORTC, PIN2 —————— к контакту PIN02 светодиодной матрицы
PORTC, PIN3 —————— к контакту PIN05 светодиодной матрицы

В используемой нами светодиодной матрице 64 светодиода упорядочены в форму матрицы. Таким образом, мы имеем 8 строк (рядов) и 8 столбцов, как показано на следующем рисунке. В каждой строке все положительные выводы светодиодов объединены в общую линию. То есть имеем один общий положительный вывод для всех 8 светодиодов в одном ряду. Данная схема соединений представлена на следующем рисунке.

Таким образом, для 8 строк светодиодной матрицы мы имеем 8 общих положительных выводов. Рассмотрим 1-ю строку – светодиоды от D1 до D8 объединены в общий положительный вывод, который обозначен в контактах светодиодной матрицы как PIN9.

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

То есть если мы хотим включить все или хотя бы один светодиод в первой строке матрицы, приведенной на рисунке, то мы должны подать питание на PIN9, а не на PIN0.

А если мы хотим включить все или хотя бы один светодиод в третьей строке матрицы, приведенной на рисунке, то мы должны подать питание на PIN8, а не на PIN2.

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

Теперь сосредоточимся на общих отрицательных выводах столбцов. На представленном ниже рисунке видно, что в рассматриваемом случае все отрицательные выводы первого столбца объединены в контакт PIN13.

Нумерация общих выводов столбцов, как и строк, также не упорядочена – в представленном примере общий вывод первого столбца выходит на PIN13, а второго – на PIN3.

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

И теперь мы уже получили полную внутреннюю схему соединений светодиодной матрицы. Теперь если нам, к примеру, необходимо зажечь светодиод D10 в матрице, мы должны подать напряжение питания на PIN14 и землю на PIN3. Эта ситуация показана на следующем рисунке.

А если нам нужно зажечь светодиод D1, то необходимо подать питание на PIN9 и землю на PIN13. Направление прохождения тока через светодиод D1 в этом случае показано на рисунке ниже.

А теперь перейдем к более сложным вещам при управлении светодиодной матрицей. Предположим, что нам необходимо одновременно зажечь D1 и D10. Для этого мы должны подать питание на PIN9, PIN14 и землю на PIN13, PIN3. Но при этом кроме нужных нам светодиодов зажгутся еще светодиоды D2 и D9 поскольку они подключены к тем же самым общим выводам что и необходимые нам светодиоды. Эта ситуация показана на следующем рисунке.

Чтобы исключить подобную проблему мы должны в каждый момент времени зажигать только один светодиод. К примеру, в момент времени t=0 мс мы включаем светодиод D1, потом при t = 1 мс мы D1 выключаем, а светодиод D2 включаем. Потом в момент времени t = 2 мс D2 выключаем, а D1 снова включаем. И далее продолжаем в том же духе.

Здесь нам на помощь приходит тот факт, что человеческий глаз не может различать частоту большую чем 30 Гц. Поэтому мы должны включать/выключать светодиоды с частотой не менее 30 Гц. В этом случае человеческий глаз будет воспринимать светодиоды непрерывно горящими, хотя на самом деле это не так – светодиоды будут непрерывно включаться и выключаться. Подобная технология называется мультиплексированием.
С использованием этой технологии в каждый момент времени мы будем переключать только одну строку светодиодной матрицы, а далее у нас будет задействован непрерывный цикл по всем 8 строкам. Для человеческого глаза это будет незаметно.

Предположим теперь, что мы хотим отобразить на светодиодной матрице букву “A”.

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

В момент времени t = 0 мс на PIN09 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN3,PIN4,PIN10,PIN6,PIN11,PIN15 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень). То есть зажигаем нужные нам светодиоды в первой строке.

В момент времени t = 1 мс на PIN14 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля. То есть зажигаем нужные нам светодиоды во второй строке.

В момент времени t = 2 мс на PIN08 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 3 мс на PIN12 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 4 мс на PIN01 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля.

В момент времени t = 5 мс на PIN07 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на все общие контакты столбцов матрицы в это время подается земля.

В момент времени t = 6 мс на PIN02 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

В момент времени t = 7 мс на PIN05 подается высокий уровень (на все остальные общие контакты строк матрицы в это время подается низкий уровень), на PIN13,PIN3,PIN15,PIN16 подается земля (на все остальные общие контакты столбцов матрицы в это время подается высокий уровень).

При использовании данной технологии мы будем непрерывно наблюдать на светодиодной матрице зажженную букву “A”. Это продемонстрировано на приведенном рисунке.

Исходный код программы на языке С (Си) с пояснениями

Программа для отображения на светодиодной матрице различных букв с помощью микроконтроллера ATmega8 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.

Читайте также  Устройство защиты ламп накаливания на avr

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

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five http://jquery2dotnet.com/ centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Первым примером в изучении микроконтроллеров является подключение и управление светодиодом, это самый простой и наглядный пример. Этот пример стал классическим при изучении микроконтроллеров, как программа «Hello World!» при изучении прочих языков программирования.

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

Из документации на микроконтроллер мы знаем, что у микроконтроллеров AVR максимальный ток, который способна пропустить каждая линия порта ввода/вывода составляет 40 mA. Превышение этого значения выведет из строя вывода порта. Поэтому ток, протекающий через вывод микроконтроллера не должен превышать 30 mA , самым оптимальным будет ток 20 mA.

Подключить светодиод к микроконтроллеру можно двумя способами

1. Подключение маломощного светодиода

Если ток потребления светодиода в рабочем режиме не превышает 30 мА, а номинальное напряжение не превышает напряжения питания микроконтроллера, то мы можем подключать его к линии порта ввода/вывода.

Что бы ограничить ток, протекающий через ножку микроконтроллера нужно рассчитать номинал резистора R1.

Сопротивление рассчитывается по формуле:

где Vs — напряжение источника питания, Vd — прямое напряжение светодиода, а I — номинальный ток светодиода.

Таким образом, мы нашли R1 = 150 Om и дальше подбирается ближайшее большее значение сопротивления.

Если не известно прямое напряжение светодиода, сопротивление можно рассчитать по закону Ома.

где U — напряжение источника питания, а I — номинальный ток светодиода.

Определив номинал резистора R1, необходимо рассчитать мощность P, измеряемая в ваттах, которая будет выделяться в резисторе, в виде тепла при протекании тока в цепи.

где U – напряжение, приложенное к участку цепи, а I — номинальный ток светодиода

Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.

Если светодиод используется для индикации потребляемый ток можно ограничить до 10 mA. Очень заметных изменений в свечении светодиода мы не заметим, а время работы источника питания увеличим, если это батарейки или аккумулятор.

2. Подключение мощного светодиода

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

Таким образом, мы ушли от токовых ограничений вывода линии порта микроконтроллера. Резистор на базе – ограничительный. Может варьироваться в широких пределах 1-10 kOm, в любом случае транзистор будет работать в режиме насыщения. Использовать можно любой N-P-N транзистор. Коэффициент усиления, практически не имеет значения. Выбирается транзистор по току коллектора (нужный нам ток) и напряжению коллектор — эмиттер (напряжение которым запитывается нагрузка). Необходимо учитывать, что значение максимально допустимого тока коллектора транзистора должно быть больше чем значение номинального тока светодиода, а так же не забывать про рассеиваемую мощность транзистора.

Определившись со схемой подключения светодиода к микроконтроллеру ATmega8 нам нужно на чем-то эту схему собрать.

1. Собрать нашу схему в симуляторе Proteus. Этот способ хорош тем, что можно быстро собрать схему, не нужно тратить деньги на приобретение радиокомпонентов.

2. Собрать схему на макетной плате и прошить микроконтроллер программатором. Придется потратить деньги, но мы получим опыт подкрепленный практикой.

Собрав схему можно преступить к написанию программы в CodeVisionAVR
Исходный код:

Описание программы:

Директивой #include подключаем внешние файлы. Заголовочный файл используемого микроконтроллера mega8.h и функцию задержки delay.h . Перед компиляцией CodeWisioneAVR вставит вместо строки

текст, содержащийся в файлах.

определяем идентификатор led. Перед компиляцией CodeWisioneAVR в тексте программы заменит led на значение 30.

Объявляем основную функцию программы main строчкой

Эта функция должна присутствовать в каждой программе и только одна. Она нечего не передает и не возвращает. В каком бы месте эта функция не находилась программа начнет выполняться именно с нее.

В выходной регистр порта C записываем ноли,

соответственно на всех ножках порта C будет напряжение 0 В.

В регистр направления данных порта C записываем единицы,

порт будет работать как выход.

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

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

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

мы включаем или отключаем наш светодиод.

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

которую подключили в начале программы файлом delay.h. Задержка генерируется в миллисекундах. Все идентификаторы led в программе будут заменены при компиляции на указанное значение 30, т.е. задержки между интервалами включения и выключения будут по 30 миллисекунд.

Написав код программы, компилируем его и записываем в микроконтроллер или загружаем в симулятор Proteus.

AVR Урок 26. SPI. Подключаем LED индикатор

Урок 26

SPI. Подключаем LED индикатор

Продолжаем работать с шиной SPI. На прошлом занятии мы научились работать со сдвиговым регистром 74HC595.

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

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

Общий анод индикатора мы подключим к шине питания, а сегменты – к регистру через токоограничивающие резисторы вот таким вот образом

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

У моего индикатора, который я подключил, вот такая вот распиновка

На практике всё выглядит приблизительно вот так

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

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

До бесконечного цикла код в функции main() будет вот таким

DDRB |= ((1 PORTB2 )|(1 PORTB3 )|(1 PORTB5 )); //ножки SPI на выход

((1 PORTB2 )|(1 PORTB3 )|(1 PORTB5 )); //низкий уровень

SPCR = ((1 SPE )|(1 MSTR )); //¬ключим шину, объ¤вим ведущим

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

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

А в бесконечном цикле мы будем отравлять инверсные коды различных цифр по порядку.

Чтобы нам не морочить головы с кодами, мы все их возьмём из проекта по сборке часов на светодиодном четырехразрядном индикаторе из функции segchar().

Начнём с единицы

SPDR = 0b11111001;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

Затем мы можем код скопировать несколько раз и подправить в нём значения, заносимые в регистр SPDR.

Вот полный код бесконечного цикла (код под спойлером, нажмите «+«)

//1

SPDR = 0b11111001;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//2

SPDR = 0b10100100;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

Читайте также  Питание мультиметра. li-ion вместо кроны. защита от разряда, таймер

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//3

SPDR = 0b10110000;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//4

SPDR = 0b10011001;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

//5

SPDR = 0b10010010;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//6

SPDR = 0b10000010;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//7

SPDR = 0b11111000;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//8

SPDR = 0b10000000;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//9

SPDR = 0b10010000;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//0

SPDR = 0b11000000;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

SPDR = 0b01111111;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

SPDR = 0b10111111;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

//С

SPDR = 0b11000110;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

//пустое место

SPDR = 0b11111111;

while (!( SPSR & (1 SPIF ))); //подождем пока данные передадутся

//сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER

PORTB |= (1 PORTB2 ); //высокий уровень

(1 PORTB2 ); //низкий уровень

_delay_ms (500);

Соберём код, посмотрим сначала в протеусе

Если всё нормально работает, то прошьём контроллер и посмотрим результат на настоящем индикаторе

Всё работает отлично!

Благодаря нашим знаниям программирования, мы превратили вроде бы никому не нужный копеешный сдвиговый регистр в драйвер светодиодного индикатора (причём не важно, что у него общее – анод или катод), работающий по шине SPI, то есть практически по трем ножкам портов.

В следующем занятии мы попытаеся подключить два таких регистра, а к ним – четырёхразрядный светодиодный индикатор и применить динамическую индикацию, также пользуясь интерфейсом SPI.

Посмотрим, что у нас получится.

Программатор ,сдвиговые регистры и индикатор можно приобрести здесь:

Смотреть ВИДЕОУРОК (нажмите на картинку)

Светодиод

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

  • В уличном, промышленном, бытовом освещении (в т.ч.светодиодная лента).
  • В качестве индикаторов — как в виде одиночных светодиодов (например, индикатор включения на панели прибора), так и в виде цифрового или буквенно-цифрового табло (например, цифры на часах).
  • Массив светодиодов используется в больших уличных экранах, в бегущих строках. Такие массивы часто называют светодиодными кластерами или просто кластерами.
  • В оптопарах.
  • Мощные светодиоды используются как источник света в фонарях и светофорах.
  • Светодиоды используются в качестве источников модулированного оптического излучения (передача сигнала по оптоволокну, пульты ДУ, светотелефоны, интернет).
  • В подсветке ЖК-экранов (мобильные телефоны, мониторы, телевизоры и т. д.).
  • В играх, игрушках, значках, USB-устройствах и прочих.
  • В светодиодных дорожных знаках.
  • В гибких ПВХ световых шнурах Дюралайт.

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

Сам по себе, без взаимодействия с внешним миром, микроконтроллер не интересен — кому интересно что он там внутри себя тикает? А вот если можно как то это отобразить или на это повлиять…

Итак, кнопка и светодиод подключаются следующим образом:

Для кнопки надо выбраную ножку подключить через кнопку на землю. Пунктиром показан дополнительный подтягивающий резистор. Несмотря на то, что внутри AVR на порт можно подключить подтяжку, она слабоватая — 100кОм. А значит ее легко придавить к земле помехой или наводкой, что вызовет ложное срабатывание. А еще эти внутренние подтягивающие резисторы очень любят гореть от наводок. Поэтому, для ответственных схем я настоятельно рекомендую добавить внешнюю подтяжку на 10кОм — даже если внутреннюю накроет, внешняя послужит.

Светодиод подключается на порт двумя способами. По схеме Порт-земля или Порт-Питание. В первом случае для зажигания диода надо выдать в порт лог1 — высокий уровень (примерно равен Vcc). Во втором случае для зажжения диода требуется выдать в порт лог0 — низкий уровень (около нуля). Для AVR разницы вроде бы нет, а вот многие старые серии микроконтроллеров вниз тянули куда лучше чем вверх, так что схема Порт-Питание распространена чаще.

Расчет сопротивления (резистора) для светодиода

Светодиод надо подключать через резистор. Дело в том, что прямое сопротивление светодиода очень мало. И если не ограничивать ток через него, то он просто напросто может сгореть нафиг. Либо, что вероятней, пожечь вывод микроконтроллера, который, к слову, может тянуть что то около 20-30мА. А для нормального свечения обычному светодиоду (всякие термоядерные ультраяркие прожектора мы не рассматриваем сейчас, эти монстры могут и ампер сожрать) надо около 3…15мА.

Так что, на вскидку, считаем:

  • Напряжение на выходе ноги МК около 5 вольт, падение напряжени на светодиоде обычно около 2.5 вольт (выше нельзя, иначе диод сожрет тока больше чем надо и подавится, испустив красивый дым)
  • Таким образом, напряжение которое должен взять на себя ограничительный резистор будет 5-2.5 = 2.5В.
  • Ток нам нужен 5мА — нефига светодиод зря кормить, нам индикация нужна, а не освещение.
  • R=U/I= 2.5/0.005 = 500 Ом. Ближайший по ряду это 510 Ом. Вот его и возьмем. В принципе, можно ставить от 220 Ом до 680 Ом что под руку попадется — гореть будет нормально.

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

Подключение LCD(HD44780) к микроконтроллерам AVR

Автор: AntonChip. Дата публикации: 28 февраля 2011 .

В этой статье приведен пример подключения LCD индикатора к микроконтроллеру AVR, а именно ATmega8. При выборе LCD cледует различать обычные многопозиционные LCD серии ИЖКЦ, модули на их основе с микросхемой HT1611 и алфавитно-символьные LCD с встроенным контроллером. Именно последние и относят к наиболее перспективным изделиям. В подтверждение тому множество фирм в мире, специализирующихся на выпуске подобной продукции. Крупнейшие из них находятся в Тайване, Китае, Японии, США.

Среди параметров, отличающих одни LCD от других, выделяется марка внутреннего контроллера. В дальнейшем будут рассматриваться только модели, совместимые с контроллером HD44780 (фирма Hitachi) и его аналогами, например, KS0066 (фирма Samsung), SED1278
(фирма Epson), ST7066 (фирма Sitronix). Таких изделий на отечественном рынке подавляющее большинство, да и в любительских конструкциях они стали стандартом «де-факто».

При покупке LCD надо поинтересоваться следующими моментами:

поддерживается ли система команд HD44780 («Да»);
имеется ли русификация знакогенератора с выводом больших и малых букв («Да»);
однополярное или двухполярное требуется питание («Однополярное +5 В»);
имеется ли подсветка (если «Да», то нужна светодиодная, а не электролюминесцентная);
сколько символов и строк отображается на экране LCD («8×1»,
«8×2», «16×1», «16×2», «20×2», «20×4» и т.д.).

Внутреннее устройство LCD

Достоинством символьных многострочных LCD является то, что заботу о подаче требуемых напряжений на массив «ЖК-конденсаторов» берет на себя встроенный управляющий контроллер. На рис.1 показана структурная схема типового LCD с организацией 16х2, которая идентична для всех моделей независимо от фирмы-изготовителя. Основу составляет специализированный контроллер, обычно выполненный в виде одной или двух микросхем-«капелек», реже — в виде фирменной SMD-микросхемы. По назначению выводов и системе команд он совпадает с родоначальником серии — HD44780. Общепринятое название таких микросхем «Dot Matrix Liquid Crystal Display Controller/Driver», из чего следует их двойная функция — контроллер управляет интерфейсом, а драйвер «зажигает» сегменты.

Читайте также  Приемник чм 400-450 мгц

Контроллер синхронизируется внутренним RC-генератором G1, имеющим частоту 250 ±50 кГц. Напряжение подсветки подается через выводы А и К на светодиоды, которые освещают ЖК-панель с торца или обратной стороны корпуса. Светодиоды включены матрицей и соединены параллельно-последовательно. В связи с этим напряжение подсветки довольно высокое 4,0. 4,2 В.

Назначение и нумерация всех внешних выводов LCD унифицированы (рис.2). Это не зависит от количества строк и символов, будь то «8×1» или «16×2». Даже контакты светодиодной подсветки 15, 16 имеются на всех LCD, хотя при ее физическом отсутствии они будут просто «висеть в воздухе».

Небольшой нюанс. На печатной плате LCD порядок нумерации контактных площадок отличается от модели к модели. Например, встречаются следующие варианты: слева направо 1-16, справа налево 16-1, вперемежку 15, 16, 1-14. Подсказку следует искать визуально по отмаркированным цифрам на печатной плате. Контакты 15, 16 обычно дублируются еще одной парой контактов с маркировкой А и К соответственно. Электрически они соединены параллельно.

Конструктивно выводы могут располагаться сверху, снизу или на боковой стороне платы LCD. Это не суть важно, ведь соединяться с изделием они будут жгутом проводов длиной до 10 см. Крепление LCD производится винтами через 4 угловых отверстия.

Электрический интерфейс состоит из трех шин:

DB0-DB7 шина данных;
RS, R/W, E шина управления;
VCC, GND, Vo, A, K шина питания.

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

Типовая схема подключения LCD к МК показана на рис.3. Именно она и будет использоваться для первой тестовой проверки LCD с выведением на экран знаменитой фразы «Hello, world!» («Здравствуй, мир!»). Кнопка SB1 осуществляет начальный сброс. Переменным резистором R2 регулируют контрастность изображения. Его сопротивление непринципиально и может меняться от 5 до 20 кОм.

Рис. 3

Кстати, резистор R2 является первым элементом, который надо обязательно покрутить в разные стороны при начальном включении питания. Если LCD исправен, то в крайних положениях движка будут наблюдаться полное гашение и полная засветка экрана.

Отрегулировать R2 следует на перегибе характеристики, как правило, с потенциалом ближе к общему проводу, когда слабо видны все точки знакомест на LCD. Неправильная установка контрастности может привести к ложному выводу о дефекте индикатора, хотя все, что надо сделать, это покрутить движок резистора.

Управляющая программа хранится в МК DD1. Чтобы облегчить ее составление, здесь и в дальнейшем приняты некоторые упрощения.

Во-первых, LCD будет работать только на прием информации по всем 11 соединительным линиям шины данных и управления.

Во-вторых, экран LCD считается жестко привязанным к начальной позиции с фиксированными адресами знакомест.

В-третьих, при программировании будет использоваться ограниченный набор команд (желающие смогут в последствие расширить свои познания, изучив DATASHEET на HD44780.

Программное управление LCD

Поскольку внутри LCD находится свой собственный контроллер со своей разветвленной системой команд, то задача упрощается. Две такие мощные и интеллектуальные микросхемы, как HD44780 и ATmega8, смогут быстро между собой «договориться» на машинном языке. Труд программиста заключается в том, чтобы «объяснить» контроллерам правила общения и установить протокол соединения.

Таблица 3

В таблице (см. выше) показана расшифровка наиболее употребляемых команд, посылаемых от МК в LCD, а на рис.4 — показаны команды для перехода на определенное знакоместо верхней или нижней строки экрана. Время выполнения команд указано приблизительно. Оно определяется частотой внутреннего RC-генератора LCD, которая, в свою очередь, зависит от технологического разброса и температуры нагрева корпуса.

Рисунок 4

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x01-0x3F и не требуют передачи данных. За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.5 показаны временные диаграммы выполнения команды 0x80 «Установка курсора в первое знакоместо верхней строки экрана» и индикация в нем цифры «4» пересылкой кода данных 0x34.

Рисунок 5

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру LCD на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

Далее показана Си-программа для тестовой проверки LCD по схеме, собранной на рис.3.

Функции «lcd_com» и «lcd_dat» формируют соответственно левую и правую половину временных диаграмм, показанных на рис.5.

Без процедуры инициализации ни один LCD работать не будет. Это самая важная часть листинга. Именно на процессе инициализации часто «спотыкаются» начинающие программисты. Дело в том, что в разных источниках приводятся разные варианты последовательностей команд инициализации и не все из них гарантированно будут работать с конкретным LCD.

Наиболее общая процедура инициализации приведена в DATASHEET на HD44780. Функция «lcd_init» в целом повторяет ее с тем отличием, что команда полного выключения дисплея 0х08 поставлена первой, чтобы при включении питания на экране не появлялся «мусор». Здесь нет ограничений против экспериментов, главный критерий — практика.

После выполнения инициализации курсор устанавливается в крайнее слева положение в верхней строчке экрана. Следовательно, первая буква «H» будет выведена именно в это знакоместо. Далее курсор автоматически переходит на одну позицию вправо и следующая команда выведет сюда букву «e» и т.д.

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

Подключение светодиода к линии порта ввода/вывода

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

Программу писать будем в 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мА.

Рассчитав выделяемую мощность на резисторе, выбираем ближайшее большее значение мощности резистора. Если рассеиваемой мощности резистора будет недостаточной, то он может выйти из строя.

— подключения маломощного светодиода анодом к линии порта ввода/вывода:

— подключения маломощного светодиода катодом к линии порта ввода/вывода:

— подключения маломощного светодиода анодом и катодом к линии порта ввода/вывода: