Главная » Микроконтроллеры
Призовой фонд
на август 2019 г.
1. 1000 руб
Паяльник
2. Тестер компонентов MG328
Паяльник
3. 200 руб.
От пользователей

Светодиодный индикатор

Расположение сегментов светодиодного индикатора
Рис.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 периода обновления информации.

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (1) | Я собрал (0) | Подписаться

0
Александр #
Мое почтение!
Задача: подключить к таймеру с семисегментным индикатором светодиодное табло из 5-мм светодиодов (по 6 – 10шт. в каждом сегменте), как на рисунке.
Проблема в том, что я не знаю как это сделать, точнее, как обеспечить достаточный для свечения светодиодов ток.
Чувствую, что решение не такое уж сложное...
Если кто знает – откликнитесь.
Прикрепленный файл: Screen Shot 2017-06-26 at 4.38.26 PM.png
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
USB-реле (2 канала) Набор для сборки - УНЧ 2х60 Вт на TDA7294
вверх