Главная » Статьи » Как подключить

Когда не хватает ног. Часть 1. Дешифратор 4-16.


 Когда нужно подключить большое количество светодиодов, а тратить драгоценные пины микроконтроллера совсем не хочется (или чаще всего такого количества ног просто напросто нет), на помощь могут придти микросхемы-дешифраторы. Например дешифратор 74HC154 (наш аналог К1533ИД3), который выставляет определенный выход в активное состояние в зависимости от 4х битного числа на входе.   
 
 
  Таблица истинности описывающа логику работы приведена ниже.
L-низкий уровень
Н-высокий уровень
Х-низкий или высокий, без разницы
 
 
   Если посидеть и повтыкать с минуту, то можно понять что ничего сложного тут нет =) Стоит отметить, что активный уровень на выходе - низкий (low). Помимо входов-выходов присутствуют два разрешающих вывода enable, включенных по логической И. Дешифратор будет выполнять свою функцию только тогда, когда обе эти ноги сидят на земле.
   Имхо, недостатком является только то, что в любой момент времени только на одном из выходов может быть активный уровень. Поэтому, если потребуется одновременное включение нескольких выходов, придется приделывать динамическое управление. 
 
Вот простой пример программы для ATTiny13, здесь поочереди выставляются пины выхода дешифратора в активное состояние, а-ля бегущий огонек:  
$regfile = "attiny13.dat"
$crystal = 1000000

Config Portb = Output
 
Do

Portb = &B00001111
Waitms 100
Portb = &B00001110
Waitms 100
Portb = &B00001101
Waitms 100
Portb = &B00001100
Waitms 100
Portb = &B00001011
Waitms 100
Portb = &B00001010
Waitms 100
Portb = &B00001001
Waitms 100
Portb = &B00001000
Waitms 100
Portb = &B00000111
Waitms 100
Portb = &B00000110
Waitms 100
Portb = &B00000101
Waitms 100
Portb = &B00000100
Waitms 100
Portb = &B00000011
Waitms 100
Portb = &B00000010
Waitms 100
Portb = &B00000001
Waitms 100
Portb = &B00000000
waitms 100

Loop

End
 

 Вот что получится в итоге:

 
 

 Еще на основе дешифратора можно построить расширитель для клавиатуры, и таким образом получить в распоряжение 16 кнопок занимающих 5 пинов микроконтроллера. Например вот простой пример для attiny2313:  


  В основном цикле выполняется какая-нибудь программа, например мигание светодиода. По переполнению таймера происходит прерывание, в обработчике прерывания происходит сканирование клавиатуры и если была нажата кнопка, на ноге PortB.7 появится низкий уровень. Узнав в какой момент было нажатие, можно узнать номер нажатой кнопки. Этот номер отправим по UART:

$regfile = "attiny2313.dat"
$crystal = 1000000
$baud = 1200

Dim M As Byte
Dim N As Byte

Config Portb = Output
Config Portb.7 = Input
Config Portd.2 = Output
Config Timer1 = Timer , Prescale = 8   'переполнение таймера каждые 0,5 сек
On Timer1 Keyboard:
Enable Interrupts
Enable Timer1

Do '***выполняем основную программу***

Portd.2 = 1
Wait 1
Portd.2 = 0
Wait 1
Loop
End

Keyboard:
For M = 0 To 15 Step 1
Portb = M
If Pinb.7 = 0 Then                    'если была нажата кнопка
 N = M                                'смотрим в какой момент она была нажата
 M = 0
 Print N                              'печатаем номер кнопки
 Return                               'и выходим из цикла
End If                                'если нажатия небыло, продолжим сканирование до конца
Waitms 10
Next M
Return                                'возвращаемся в основной цикл программы


Документация на микросхему 74HC154
Категория: Как подключить | Добавлено: 02.03.2011
Просмотров: 41328 | Комментарии: 16 | Теги: исходники, Логика, bascom-avr, дешифратор | Рейтинг: 5.0/4
Всего комментариев: 16
16 Oboltus   (04.03.2014 10:21) [Материал]
Разобрался. Спасибо! :)

15 Oboltus   (27.02.2014 18:10) [Материал]
А можно немного подробнее объяснить логику работы второй программы(с опросом кнопок).Зачем мы проверяем нажата ли кнопка на Portb.7? Может вместо Portb.7 повесить ножку прерывания и по этому самому прерыванию опросить порт...в общем объясните оболтусу пжлста пошагово, а то меня эта 7 ножка в ступор вгоняет...

14 pchela5   (03.07.2012 12:09) [Материал]
Скорее нет, чем да, так как этот ряд микросхем растет из 74 (155) ТТЛ серии, а у них для обеспечения нагрузочной способности из-за схемотехники использовали активный уровень - низкий.

13 exersizze   (02.07.2012 21:24) [Материал]
Я кроме как с HC154 не сталкивался, поэтому сказать не смогу. Могу посоветовать только методом подбора по советским микрухам ид1, ид4, ид10 и т.д. Может среди них найдется.

12 SkSeMi   (02.07.2012 21:11) [Материал]
Можете посоветовать микросхемы дешифраторов, но с высоким активным уровнем, а то я никак не нашел, а очень надо, чтобы не мудрить с инверторами на транзисторе на каждый вывод подобной микросхемы?
Т.е., чтобы на входе и на выходе микросхемы активным уровнем сигналов был высокий,
Заранее спасибо!

11 exersizze   (24.09.2011 20:53) [Материал]
конечно можно. подавай управляющие сигналы на серву через выход дешифратора,
только использовать стандартную функцию Servo уже не получится.

10 space   (24.09.2011 19:52) [Материал]
можно ли дешифратор использовать для управления сервоприводами(задавать градус поворота) в баскоме. если да. то как приблизительно выглядит?

9 exersizze   (20.08.2011 19:34) [Материал]
Нет, в данном случае это просто порты ввода/вывода. Можно использовать другие ноги по желанию, естественно сконфигурировав их в программе.

8 cudi   (20.08.2011 18:57) [Материал]
у этих портов особое назначение или нет?

7 cudi   (20.08.2011 18:56) [Материал]
слушай, ты подключаешь микросхему к ain0/ain1/oc1a/oc0a/scl так задумано? или можно подключить к любому порту и указать в программе?

6 exersizze   (20.08.2011 14:52) [Материал]
да правильно, всего 16 кнопок, на каждую кнопку по комбинации на входе. А для каждой кнопки ты сам задаешь функционал, что напишешь то она и будет выполнять.

5 cudi   (20.08.2011 14:22) [Материал]
Как он различает где какая кнопка?

4 cudi   (20.08.2011 14:21) [Материал]
n=0 - это первая кнопка, если N=M, а M=0
n=1 - это вторая кнопка, если N=M, а M=1
Я правильно понял?

3 exersizze   (20.08.2011 13:53) [Материал]
Да, схема подключения правильная. В примере есть строка печатающая номер нажатой клавиши. Так организуй проверку на номер нажатой кнопки и выполняй нужное действие:

Keyboard:
For M = 0 To 15 Step 1
Portb = M
If Pinb.7 = 0 Then 'если была нажата кнопка
N = M
M = 0
'проверяешь какая кнопка нажата и выполняешь нужное действие
if n=0 then
incr X1
end if

'и так далее для каждой
........

Return
End If
Waitms 10
Next M
Return

2 cudi   (20.08.2011 13:27) [Материал]
А схема точно правильная, для подключения кнопок?

1 cudi   (20.08.2011 13:23) [Материал]
А как реализовать действие при нажатии клавиши?
Вот кусок кода:
Sub Клавиши()
Waitms 300
If Вверх = 0 Then Incr X1 'при нажатие клавиши увеличиваем переменную на единицу
If Вниз = 0 Then Decr X1 'при нажатие клавиши уменьшаем переменную на единицу
Это код от часов...
Верх и Вниз это порты от МК..
Хотелось бы в Ваш код вставить действия, для этого надо заменить print N, на действие какое то?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: