Рис.1 Расположение сегментов светодиодного индикатора
Светодиодные индикаторы являются самым простым средством для отображения символьной информации. Их конструкция представляет собой набор светодиодов, выполненных в виде сегментов определенной формы. На рис.1 приведена наиболее распространенная схема расположения сегментов, позволяющая отображать цифры 0…9 и многие другие дополнительные символы. В нутрии корпуса все светодиоды имеют общую точку соединения. Объединенными вместе могут быть аноды (общий анод) или катоды (общий катод). Самые распространенные цвета свечения - красный и зеленый. При равном токе потребления красные светодиоды, как правило, имеет большую светоотдачу. Энергопотребление зависит от напряжения питания и технологии изготовления. Ток сегмента у современных индикаторов может быть менее 1 мА.
Рис.2 Подключение индикатора при динамической индикации
Для того чтобы высветить на индикаторе необходимый символ, потребуется задействовать у микроконтроллера 8 выводов. Одну линию можно сэкономить если отказаться от сегмента H, когда в отображения точки (запятой) нет необходимости. При большем чисел используемых индикаторов количество линий ввода-вывода существенно возрастет. Два индикатора потребуют уже 16 линий, 3 индикатора - 24 и т.д. Ясно, что для большинства приложений такое расточительное использование выводов совершенно неприемлемо. Решить эту проблему можно применив динамическую индикацию. Для этого вместо непосредственного соединения сегментов с микроконтроллером, их объединяют в общие группы, как показано на рис.2. В схеме используется индикатор TOT-3361AH-LN на 3 знакоместа c общими катодами. Порт D задействован для управления светодиодами сегментов A…H. Катоды K0…K2 напрямую подключены к линиям 0…2 порта B соответственно(для индикаторов другого типа с суммарным током ≥20 мА понадобятся дополнительные буферные элементы). В начале на индикатор выводится символ, соответствующий нулевому знакоместу. При этом на линии PB0 выставляется низкий уровень напряжения, а на PB1 и PB2 высокий (иначе символ будет отображен во всех трех позициях). Через некоторый период времени выводится следующий по очередности символ и теперь уже катод K1 соединяется с землей(на линии PB1 присутствует низкий уровень, на PB0 и PB2 – высокий). Далее информация отображается в старшей позиции индикатора (на PB2 лог.0, на PB0, PB1 лог.1), затем снова в нулевой и т.д. При частоте обновления символов ≥ 50 Гц начинает проявляться инерция человеческого зрения. Мерцание (эффект от переключения) пропадает. Изображение воспринимается непрерывно, так как будто все символы светятся постоянно. Пример подпрограммы динамической индикации приведен ниже. Она принимает два параметра: код символа и номер позиции, в которой этот символ нужно отобразить.
; Поскольку индикатор содержит 3 знакоместа, подпрограмма ; вывода символов должна вызываться с частотой ≥ 150 Гц (3 ; знакоместа x 50 Гц = 150 Гц). Период переключения должен ; составлять 1/150 Гц = 6667 мкс, что на частоте 1 МГц у AVR ; составит 6667 циклов тактовой частоты генератора. Постоянные ; промежутки времени удобнее всего отмерять таймером, работающем ; в режиме сброса при совпадении (режим CTC). У ATmega8 такой ; режим существует у 16-разрядного таймер-счетчика 1 и 8- ; разрядного таймер-счетчика 2. Для этих целей (в случае ; использования таймер-счетчика 1) существуют два регистра ; пространства РВВ: OCR1AH(старший байт), OCR1AL(младший байт). ; Когда работа схемы сравнения разрешена, то счетный регистр ; TCNT1H:TCNT1L начинает после каждого приходящего импульса на ; единицу увеличивать свое содержимое до тех пор, пока его ; значение не сравняется со значением записанным в ; OCR1AH:OCR1AL. В это момент содержимое TCNT1H:TCNT1L ; обнуляется и в РВВ TIMSK устанавливается флаг OCF1A. Если ; предварительно установить бит OCIE1A в TIMSK и бит I в SREG, ; то произойдет переход на обработчик прерывания по совпадению ; от модуля сравнения A. У таймера-счетчика 1 существует также ; еще и второй подобный модуль сравнения B с регистрами ; сравнения OCR1BH:OCR1BL функционирование которого подобно ; описанному выше. .def data = R16 ;регистр с кодом символа .def pos = R17 ;регистр с номером текущей позиции индикатора .def temp = R18 ;регистр для промежуточных операций .dseg .org SRAM_START ;ячейки в SRAM для отображения buffer: .byte 3 ;на индикаторе .cseg .org 0 rjmp initial ;старт программы .org 0x0006 ;обработчика прерывания по rjmp service_T1COMPA ;совпадению от модуля сравнения A ; Период следования прерываний в режиме CTC: T=(OCR1AH:OCR1AL+1) ; /(Fclk/N),где N – коэффициент деления предделителя ; частоты на входе таймера-счетчика 1. Режим работы задается ; битами WGM13:WGM10 (WGM10 и WGM11 в управляющем РВВ TCCR1A, ; WGM12 и WGM13 в TCCR1B), а значение N задается битами ; CS12:CS10 в регистре TCCR1A. Для периода T = 6667 мкс ; (WGM13:WGM10 = 0100 – режем CTC), N =1(CS12:CS10 = 001 – ; предделитель отключен) и Fclk=1 МГц – содержимое OCR1AH:OCR1AL ; = 6667. .org 0x0020 initial: ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp . clr pos clr temp ldi temp,1 ;заполняем буфер индикации числами 1…3 sts buffer,temp ldi temp,2 sts buffer+1,temp ldi temp,3 sts buffer+2,temp out TCCR1A,temp ldi temp,(1<< WGM12)|(1<< CS10) out TCCR1B,temp ldi temp,high(6667) out OCR1AH,temp ldi temp,low(6667) out OCR1AL,temp ldi temp,1<< OCIE1A out TIMSK,temp sei . service_T1COMPA: ;обработчик прерывания по совпадению OCR1A in temp,SREG ;при входе сохраняем в стеке push temp ;регистры temp, SREG clr temp ldi YH,high(buffer) ;заносим в указатель Y адрес ldi YL,low(buffer) ;буфера индикации buffer add YL,pos ;добавляем к Y смещение, что соответствует adc YH,temp ;ячейке с текущей позицией pos индикатора ld data,Y ;заносим в data кодом символа текущей позиции rcall din_ind ;вызов подпрограммы индикации inc pos ;циклически изменяем номер позиции cpi pos,3 ;индикатора 0->1->2->0 и т.д. brne PC+2 clr pos pop temp ;при выходе восстанавливаем из стека out SREG,temp ;регистры temp, SREG reti ; Подпрограмма динамической индикации ; ZH:ZL – указатель для табличной конвертации ; R18 – регистр для промежуточных операций ; R16 – номер символа в таблицей перекодировки ind_tabl ; при входе в подпрограмму ; R17 – номер позиции при входе в подпрограмму (0…2) ; флаг T при входе в подпрограмму определяет ; наличие (T=1) или отсутствие (T=0) запятой din_ind: clr R18 ;очищаем вспомогательный регистр при входе ldi ZH,high(2*ind_tabl) ;заносим в указатель Z адрес начала ldi ZL,low(2*ind_tabl) ;таблицы перекодировки символов add ZL,R16 ;добавляем к указателю Z смещение, adc ZH,R18 ;соответствующее положению символа в таблице lpm R16,Z ;извлекаем в R16 из таблицы символ bld R16,7 ;заносим в старший разряд R16(сегмент H) значение clt ;запятой, которое передается через флаг T ldi R18,0b11111110 sbrc R17,0 ;если текущий разряд 1, то заносим в R18 маску ldi R18,0b11111101 ;порта B для включения катода K1 sbrc R17,1 ;если текущий разряд 2, то заносим в R18 маску ldi R18,0b11111011 ;порта B для включения катода K2 push R17 ;сохраняем в стеке регистр с номером позиции in R17,PORTB;считываем в буфер R17 текущее состояние порта ori R17,0b00000111 and R18,R17 out PORTB,R17 ;гасим все сегменты, подавая на K0…K2 лог.1 out PORTD,R16 ;выводим в порт D очередной символ out PORTB,R18 ;соединяем с землей следующий катод pop R17 ;восстанавливаем из стека регистр с номером позиции ret ind_tabl: ;таблица некоторых символов при общем катоде ; HGFEDCBA HGFEDCBA символы номер в таблице .db 0b00111111, 0b00000110 ; 0,1 0, 1 .db 0b01011011, 0b01001111 ; 2,3 2, 3 .db 0b01100110, 0b01101101 ; 4,5 4, 5 .db 0b01111101, 0b00000111 ; 6,7 6, 7 .db 0b01111111, 0b01101111 ; 8,9 8, 9 .db 0b01110111, 0b01111100 ; A,b 10, 11 .db 0b01011110, 0b01011110 ; C,d 12, 13 .db 0b01111001, 0b01110001 ; E,F 14, 15 .db 0b01000000, 0b00000000 ; -,space 16, 17
Линии портов ввода-вывода у AVR имеют симметричные нагрузочные характеристики. Они допускают равные по величине втекающий и вытекающий токи до 20 мА. Поэтому с ними с одинаковым успехом могут применятся индикаторы как с общим анодом так и с общим катодом. Помимо этого выводы для подключения сегментов очень часто выполняют дополнительные функции опроса кнопок. На рис.2, например, с линией сегмента A, через токоограничивающей резистор RN соединена кнопка SBN. Периодически PD0 настраивается на ввод для считывания состояния кнопки. В роле нагрузочного сопротивления, в этом случае, выступает внутренний pull-up резистор.
Рис.3 Сокращение числа выводов микроконтроллера
а - при помощи сдвигового регистра
б - с использованием индикаторов с разной схемой подключения светодиодов
Количество выводов можно существенно сократить, если совместно с микроконтроллером использовать вспомогательные микросхемы. На рис.3а, например, показано как в этих целях используется сдвиговой регистр 74HC164 или подобный ему. Такое подключение освобождает 6 линий ввода-вывода. В некоторых случаях может оказаться оправданным применение дешифраторов семисегментного кода и счетчиков различного типа. Кроме того существует еще одна возможность экономии, основанная на использовании z-состояния линий портов. Схема на рис.3б аналогична схеме на рис.2 за тем лишь исключением, что параллельно индикатору с общим катодом HG1 дополнительно подключен трехразрядный индикатор с общим анодом HG2. Линии PB0…PB2 одновременно выполняют коммутацию анодов A0…A2 индикатора HG2 и катодов K0…K2 HG1 соответственно. Когда информация отображается в нулевой позиции HG2(анод A0), то на линии PB0 формируется высокий уровень напряжения. На линиях порта D выставляется лог.0 в тех сегментах, которые должны быть засвечены и z-состояние в сегментах, которые необходимо погасить. Когда активно младшее знакоместо HG1(катод K0) – на линии PB0 должен присутствовать низкий уровень напряжения, а в порт D выведено логическое значение при котором уровень лог.1 на линиях соответствует засвеченным сегментам и z-состояние погашенным. В случае если символы выводится в другие позиции индикатора, отличные от A0 и K0, то PB0 должна быть переведена в высокоимпедансное состояние. Естественно, что программа вывода при такой схеме переключения будет заметно сложнее приведенной на рис. Таблица символов окажется намного больше так как во-первых для каждого из них необходимо, кроме значения PORTD, надо будет хранить еще и содержимое регистра DDRD, через который соответствующие линии должны переводится в z-состояние (настраиваться на ввод). И во-вторых символам HG1 будут соответствовать иные, инверсные значения PORTD по отношению к индикатору c общим катодом HG2.
Рис.4 Динамическая индикация с большим числом разрядов индикатора
Когда количество индикаторов в схеме превышает 8-9, то более рациональным может оказаться использование динамической индикации с переключением сегментов, а не разрядов, как показано на рис.4. В этом случае длительность отображения каждого сегмента никогда не будет меньше 1/8 периода обновления информации.
Перейти к следующей части: ЖКИ на базе контроллера HT1611
Комментарии (1) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
Задача: подключить к таймеру с семисегментным индикатором светодиодное табло из 5-мм светодиодов (по 6 – 10шт. в каждом сегменте), как на рисунке.
Проблема в том, что я не знаю как это сделать, точнее, как обеспечить достаточный для свечения светодиодов ток.
Чувствую, что решение не такое уж сложное...
Если кто знает – откликнитесь.