| Next revision | Previous revision |
| ru:examples:digi:led [2010/09/17 20:16] – создано eduardtlmk | ru:examples:digi:led [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 |
|---|
| ====== Светодиоды ====== | |
| |
| //Необходимые знания: [HW] [[et:hardware:homelab:controller]], [HW] [[et:hardware:homelab:digi]], \\ [ELC] [[et:electronics:led_resistor]], [AVR] [[et:avr:registers]], [AVR] [[et:avr:io]], \\ [LIB] [[et:software:homelab:library:bit]], [LIB] [[et:software:homelab:library:pin]]// | |
| |
| ===== Теория ===== | |
| |
| [{{ :examples:digi:led:led_picture.jpg?150|Светодиод с 5 мм ножками}}] | |
| |
| Светодиод — это полупроводниковый прибор, который при прямом напряжении излучает свет. На английском языке светодиод называют сокращённо LED(light-emitting diode). Существуют светодиоды разных цветов, а также комбинации светодиодов, с помощью чего можно получать белый свет. У светодиодов, как и у обычных диодов, два контакта – анод и катод. На схеме у светодиода анод обозначается символом „+“, а катод „-“. | |
| |
| [{{ :examples:digi:led:led_designator.png?150|Схематическое oбозначение и полярность светодиода.}}] | |
| |
| При прямом напряжении к аноду LED-а прикладывается положительное напряжение, а к катоду отрицательное. Прямое напряжение LED-а зависит от его цвета - у LED-ов при более длинной длине волны (красные) оно ~2V, у более короткой длины волны (синие) оно ~3V. Обычно мощность LED-ов несколько десятков мили ватт, отсюда следует, что и ток должен быть равнозначной величины. При увеличении напряжения или тока есть опасность перегорание LED-а. | |
| |
| Если LED используется специально для подсветки, целесообразней применять специфические электросхемы для образования нужного напряжения и тока. Часто LED-ы используют в качестве индикатора и их питают от выводов микроконтроллера. Поскольку питающее напряжение микроконтроллера, как правило, выше прямого напряжения LED-а и сила тока больше, то нужно последовательно с LED-ом добавлять сопротивление (резистор), которое ограничивает ток и создаёт необходимое падение напряжения. Формулы вычисления сопротивления находятся в главе электроники. | |
| |
| [{{ :examples:digi:led:led_pin_markings.png?200|Обозначение выводов светодиода с ножками и компонента поверхностного монтажа}}] | |
| |
| LED-ы производятся в различных оболочках. У наиболее распространённых LED-ов на "ножках" круглая оболочка диаметром 3 мм или 5 мм и 2 длинных металлических вывода. Длинный вывод обозначает анод, короткий - катод. В оболочке компонента поверхностного монтажа (SMD - Surface-Mounted Device) для обозначения полярности на дне находится обозначение в форме буквы Т, где крыша Т обозначает местонахождение анода и острие - катода. | |
| |
| ===== Практика 1 ===== | |
| |
| На плате модуля Контроллер Домашней Лаборатории находится одиночный LED, анод которого через сопротивление соединен с питанием +5 В и катод с ATmega128 на вывод PB7. Для того чтобы зажечь и потушить LED модуля Контроллер, нужно вывод PB7 отметить выходом и установить его соответственно верхним и нижним. Тогда в верхнем состояние вывода LED не горит, а в нижнем горит. В принципе, LED можно подключить и по-другому, так чтобы анод соединялся с выводом микроконтроллера, а катод – с землей (где-то между должнo быть и сопротивление) – в этом случае в верхнем состояние вывода LED горит, а в нижнем состоянии не горит. | |
| |
| Почти все практические задания ДомашнейЛаборатории, в том числе и пример зажигания LED-а, используют библеотеку выводов Домашней Лаборатории. В библиотеке выводов имеется тип данных //pin//, который содержит связанные с выводом адреса регистров и битовую маску выводов. Если в программе создать переменную //pin//-типа и её сразу в начале программы установить в начальное значение, используя макрофункцию //PIN// , то можно будет при помощи этой переменной свободно использовать вывод во всей программе, без какого-либо умения использовать регистры. Далee преведены 2 примера программы, которые делают тоже самое, но одна из них написана на базе библеотеки ДомашнейЛаборатории, а другая нет. | |
| |
| <code c> | |
| // | |
| // Программа для тестирования LED-а модуля Контроллер Домашней Лаборатории. | |
| // Основывается на библиотеке Домашней Лаборатории | |
| // | |
| #include <homelab/pin.h> | |
| |
| // | |
| // Определение параметров переменной, связанной с выводом | |
| // | |
| pin debug_led = PIN(B, 7); | |
| |
| // | |
| // Основная программа | |
| // | |
| int main(void) | |
| { | |
| // Настройка вывода LED-а выходом | |
| pin_setup_output(debug_led); | |
| | |
| // Зажигание LED-а | |
| pin_clear(debug_led); | |
| } | |
| </code> | |
| |
| <code c> | |
| // | |
| // Программа для тестирования LED-а модуля Контроллер Домашней Лаборатории. | |
| // Основывается на непосредственном изменении регистров. | |
| // | |
| #include <avr/io.h> | |
| |
| // | |
| // Основная программа | |
| // | |
| int main(void) | |
| { | |
| // Настраивание вывода LED-а выходом | |
| DDRB |= (1 << 7); | |
| | |
| // Зажигание LED-а | |
| PORTB &= ~(1 << 7); | |
| } | |
| </code> | |
| |
| Первый пример использует библиотеку выводов (//pin.h// fail). Сначала в программе создается //debug_led// переменная типа //pin// , которая содержит информацию о выводе LED-а. В основной программе происходит налаживание вывода выходом при помощи функции //pin_setup_output// и затем обозначение этого вывода низким при помощи функции //pin_clear//, , в результате чего LED загорается. Во втором примере переменные не используются, обозначение LED-а выходом и зажигание происходит при изменеии значений направления шины В и регистов выхода. Читатель больше знакомый с AVR, обязательно заметит, что на самом деле для зажжения LED-а не требуется приказа ни в одном из примеров, так как по умолчанию значение выходов AVR и так равно нулю. В данном случае это сделано для корректности. | |
| |
| В чем же разница в использовании библиотеки выводов и регистров? Разница в удобстве использования – с библиотекой это проще, потому что не надо знать названия регистров и их действия. Самое главное преимущество библиотеки это приспосабливаемость. При использовании регистров, для изменения выводов приходится менять названия регистров и битовые маски, в случае библиотеки это придется делать только в начале программы, где переменную выводов инициализируют. При прямом использовании регистра есть одно видимое преимущество - использование вывода непосредственно и не происходит через память программы и при помощи требующих много времени функций. . На самом деле новые AVR-GCC компиляторы уже настолько сообразительные, что преобразовывают функции библиотеки в такие же непосредственные приказы манипулирования, как это было бы сделано напрямую в программе. Для уточнения следует отметить, что умение компилятора передавать распространяется только на постоянные одиночно переменные //pin//-типа, но не на переменные и массивы, меняющиеся во время работы. | |
| |
| Далее частично приведён исходный код библиотеки выводов, цель которого объяснить о происходящем в библиотеке. К сожалению, для начинающих это может быть не совсем понятным, т.к. иcпользуются указатели языка Си (на английском языке //pointer//), о чем в данной книге при изучении языка Си не написано. Информацию об указателях заинтересованный сможет найти в интернете и учебниках по программированию. | |
| |
| <code c> | |
| // Макро-константа которой обозначается знак регистра | |
| #define _REG_PTR_ volatile uint8_t * | |
| |
| // | |
| // Тип данных вывода | |
| // | |
| typedef struct pin | |
| { | |
| _REG_PTR_ ddr; | |
| _REG_PTR_ port; | |
| _REG_PTR_ pin; | |
| uint8_t mask; | |
| } | |
| pin; | |
| |
| // | |
| // Макро-функция для инициализации типа переменной вывода | |
| // | |
| #define PIN(port_char, bit_index) \ | |
| { \ | |
| (_REG_PTR_)&DDR ## port_char, \ | |
| (_REG_PTR_)&PORT ## port_char, \ | |
| (_REG_PTR_)&PIN ## port_char, \ | |
| bit_mask(bit_index) \ | |
| } | |
| | |
| // | |
| // Настраивание вывода выходом | |
| // | |
| inline void pin_setup_output(pin pin) | |
| { | |
| bitmask_set(*pin.ddr, pin.mask); | |
| } | |
| | |
| // | |
| // Настройка вывода верхним | |
| // | |
| inline void pin_set(pin pin) | |
| { | |
| bitmask_set(*pin.port, pin.mask); | |
| } | |
| |
| // | |
| // Настройка вывода нижним | |
| // | |
| inline void pin_clear(pin pin) | |
| { | |
| bitmask_clear(*pin.port, pin.mask); | |
| } | |
| </code> | |
| |
| ===== Практика 2 ===== | |
| |
| Помимо модуля Контроллера, LED-ы находятся так же и на плате Дигитального входного-выходного модуля. Электрически они соединены так же как и LED модуля Контроллер, т.е. катод соединён с выводом AVR. Красный LED соединяется с выводом PC5, желтый с выводом PC4 и зеленый с выводом PC3. Их программа-образец, основанная на библиотеке, выглядит следующим образом: | |
| |
| <code c> | |
| // | |
| // Программа тестирования LED-ов Дигитально входного-выходного модуля Домашней Лаборатории | |
| // Дигитально входного-выходного модуля Домашней Лаборатории. | |
| // | |
| #include <homelab/pin.h> | |
| | |
| // | |
| // Обозначение выводов LED-а | |
| // | |
| pin led_red = PIN(C, 5); | |
| pin led_yellow = PIN(C, 4); | |
| pin led_green = PIN(C, 3); | |
| | |
| // | |
| // Основная программа | |
| // | |
| int main(void) | |
| { | |
| // Настройка выводов LED-а выходом | |
| pin_setup_output(led_red); | |
| pin_setup_output(led_yellow); | |
| pin_setup_output(led_green); | |
| | |
| // Зажигание крaсного и зел ёнoго LED-а | |
| pin_clear(led_red); | |
| pin_clear(led_green); | |
| | |
| // Отключение желтого LED-а | |
| pin_set(led_yellow); | |
| } | |
| </code> | |