Перейти к содержанию
    

74HC4094 в качестве расширителя порта

Привет. Необходимо сделать динамическое включение катодов 7-сегментного индикатора. Выводов контроллера как всегда не хватает. В качестве расширителя порта решил поставить преобразователь последовательной шины в параллельную 74HC4094. Т.е. по сути мне необходимо периодически (10мсек) на выходе 4094 сдвигать "1" для включения соответсвующего индикатора. Или другими словами последовательно загружать числа 1,2,4,8,16,32 и так по кругу. Вывод OE всегда притянут к питанию. Важно не допустить одновременного включения нескольких катодов. Правильно ли я делаю :

 

1) SI=1, CLK=1, SI=0, CLK=0 . Повторить n раз (n =1,2,4,8,16,32)

2) STROB=1;

3) STROB=0;

 

Сильно греется КРЕН. Померял ток потребления схемы - около 130 мА. Схема - это микроконтроллер (Мега48) с двумя светодиодными индикаторами, управляемые динамически. Видимо, проблема связана с неправильным формированием сигналов на 74HC4094.

 

Прикладываю даташит. Кстати, у разных производителей по-разному осуществляется загрузка данных: либо по наростающему фронту на CLK, либо по спадающему... Странно.

74HC4094N_PHLPS.pdf

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ обычно использует 74HC595 и TPIC6C595. При наличии контроллера нолик там гонять по кругу или единичку совершенно без разницы. Только следут учитывать, что у TPIC6C595 открытые стоки на выходах.

P.S. они обе замечательно каскадируются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Микросхема 74HC4094 для Вашей задачи подходит не лучшим образом. Для этой задачи нужен счетчик с дешифратором (одна микросхема). Вам будет достаточно управлять 2-мя входами этой микросхемы: счетный вход и вход сброса, при этом активность единственного выхода в каждый момент времени гарантирована независимо от логики работы программы мк.

 

Если же микросхема 74HC4094:

1) SI=1, CLK=1, SI=0, CLK=0 . Повторить n раз (n =1,2,4,8,16,32)

2) STROB=1;

3) STROB=0;

Из Ваших слов не понятно, что вы повторяете и как, и похоже, что все равно не правильно.

Должно быть так (если по кругу).

 

CLK=0, STR=0

1) SI=0

2) {CLK=1, CLK=0} повторить 7 раз

3) SI=1, CLK=1, CLK=0

4) STR=1, STR=0 => станет активным выход QP0

5) SI=0, CLK=1, CLK=0

6) STR=1, STR=0 => станет активным выход QP1

7) SI=0, CLK=1, CLK=0

8) STR=1, STR=0 => станет активным выход QP2

9) SI=0, CLK=1, CLK=0

10) STR=1, STR=0 => станет активным выход QP3

11) SI=0, CLK=1, CLK=0

12) STR=1, STR=0 => станет активным выход QP4

13) SI=0, CLK=1, CLK=0

14) STR=1, STR=0 => станет активным выход QP5

15) SI=0

16) {CLK=1, CLK=0} повторить 2 раза

17) переход на п.3

 

Сильно греется КРЕН. Померял ток потребления схемы - около 130 мА. Схема - это микроконтроллер (Мега48) с двумя светодиодными индикаторами, управляемые динамически. Видимо, проблема связана с неправильным формированием сигналов на 74HC4094.

Неплохо бы схему принципиальную тоже приложить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ обычно использует 74HC595, TPIC6C595.

Вопрос был о 74HC4094. Просто она уже запаяна в схему. А менять на что-либо другое буду только если не будет других вариантов. Так в чем же проблема?

 

Неплохо бы схему принципиальную тоже приложить.

Прикладываю схему. Спасибо за ответ. Сейчас попробую. Временно программно отключил индикацию , но 7805 все равно греется (палец не удержать), хотя ток составляет 35мА ?! В холостом режиме (когда от откренки все отсоединено), не греется. Странно однако %-()

Schema.pdf

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похожую схему только без аналоговых входов (индикация:две строки по четыре 7-сегментных индикатора+4 отдельных светодиода, вдобавок 9-и кнопочная клавиатура+RS485) с год назад делал. Применил как раз 74HC595 - 3 шт., т.к. на каждую строку нужна была своя динамическая индикация (по одному регистру), а третий регистр для управления совмещенными анодами индикаторов строк и 4-мя светодиодами. Индикация у МК всего три вывода отняла. Для вашего же случая TPIC6C595 сам бог велел - от 8 транзисторов по пути избавитесь. :)

Насчет большого потребления.

У меня вызывает сомнение цепь питания AVCC. ИМХО там по схеме не хватает тантала или электролита после дросселя впараллель керамике 0,1мкФ. Такой Г-образный фильтр в виде дросселя с керамикой нехило "звенеть" может.

Кроме того в базах транзисторов, которые управляют обмотками реле, вы забыли резисторы Б-Э. КТ3102 ведь не "цифровые" транзисторы. В транзисторы управление катодами индикаторов почему-то поставили, а тут нет.

Кстати, а что питается по цепи 3,3В? Или для чего там 78L33 стоит? 7805, которая якобы сильно греется, вообще не показана. Возле нее, непосредственно возле выводов OUT и GND, конденсатор номиналом не менее 1мкФ стоит? Если нет, то она опять же возбуждаться может, а саморазогрев при этом у нее не слабый!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Должно быть так (если по кругу).

 

CLK=0, STR=0

1) SI=0

2) {CLK=1, CLK=0} повторить 7 раз

3) SI=1, CLK=1, CLK=0

4) STR=1, STR=0 => станет активным выход QP0

5) SI=0, CLK=1, CLK=0

6) STR=1, STR=0 => станет активным выход QP1

7) SI=0, CLK=1, CLK=0

8) STR=1, STR=0 => станет активным выход QP2

9) SI=0, CLK=1, CLK=0

10) STR=1, STR=0 => станет активным выход QP3

11) SI=0, CLK=1, CLK=0

12) STR=1, STR=0 => станет активным выход QP4

13) SI=0, CLK=1, CLK=0

14) STR=1, STR=0 => станет активным выход QP5

15) SI=0

16) {CLK=1, CLK=0} повторить 2 раза

17) переход на п.3

 

Не понял с п.17. Чтобы включить следующее знакоместо (QP1="1", все остальные="0"), при следующем вызове начинать с п.3 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может совет несколько неуместный, но зачем вам заниматься учетом сдвигов в самом регистре? У вас же МК для управления имеется. Сдвигайте и XOR-те байт как хотите программно в самом МК, а в регистр записывайте этот байт каждый раз целиком. Все будет детерменировано и никакого геморроя - всего один цикл записи 8-ми бит (установить бит данных, сформировать сдвиговый импульс - и так 8 раз) плюс формирование строба записи по окончании цикла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я так и делал. Только загружаемые значения беру из таблицы:

 

__interrupt void TC0_COMPA_ISR(void)

{..........

digit(++znak);

...........

}

/////////////////////////

void digit(unsigned char number)

{

unsigned char table[]={0,1,2,4,8,16,32};

 

for(unsigned char i=0; i < *(table+number); i++)

{

PORTC |= (1<<SI);

PORTC |= (1<<CLK);

PORTC &= ~(1<<SI);

PORTC &= ~(1<<CLK); //загрузить число n=0,1,2,4,8,16,32 раз

}

PORTD |= (1<<STR);

PORTD &= ~(1<<STR); //строб

}

 

Для выключения индикаторов (для гашения незначащих разрядов) вызвать digit(0);

Я хочу, чтобы было так:

1)Строб=0. Приэтом на выходе без изменений остается предыдущее значение.

2) загрузить в storage register (74HC4094) число (0,1,2,4,8,16,32).

3)сформировать строб. При этом на выход поступает значение из storage register.

 

Можно ли так сделать на этой микросхеме?

 

У меня вызывает сомнение цепь питания AVCC. ИМХО там по схеме не хватает тантала или электролита после дросселя впараллель керамике 0,1мкФ. Такой Г-образный фильтр в виде дросселя с керамикой нехило "звенеть" может.

Кроме того в базах транзисторов, которые управляют обмотками реле, вы забыли резисторы Б-Э. КТ3102 ведь не "цифровые" транзисторы. В транзисторы управление катодами индикаторов почему-то поставили, а тут нет.

Кстати, а что питается по цепи 3,3В? Или для чего там 78L33 стоит? 7805, которая якобы сильно греется, вообще не показана. Возле нее, непосредственно возле выводов OUT и GND, конденсатор номиналом не менее 1мкФ стоит? Если нет, то она опять же возбуждаться может, а саморазогрев при этом у нее не слабый!

 

Это часть схемы. Прошу прощения, на рисунке есть несоответствия. На плате параллельно керамике 0.1мкФ по питанию AVCC стоит танталовый 10мкФ. И в базовых цепях забыл указать(на плате стоят) резисторы 100кОм. А 7805 - на другом листе. Спаяна по стандартной схеме: ~9В->диодный мост->4700мкФ->7805->100мкФ. На входе и на выходе непосредственно на выводах 7805 подключены керамические 0.1мкФ. +3.3В нужны для других целей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял с п.17. Чтобы включить следующее знакоместо (QP1="1", все остальные="0"), при следующем вызове начинать с п.3 ?

Вы же по кругу хотите. Соответственно после активации QP5 должен быть активирован QP0. Следовательно из п.17 нужно перейти на пункт 3.

 

... но 7805 все равно греется (палец не удержать), хотя ток составляет 35мА ?! В холостом режиме (когда от откренки все отсоединено), не греется. Странно однако %-()

Значит на вашей 7805 рассеивается большая мощность. Какое напряжение Вы подаете на вход 7805? Такое ощущение, что входное напряжение велико и вся разность падает на 7805, поэтому и греется и не важно, что ток всего 35мА. К примеру, если Вы подаете на вход 7805 15В, на выходе 7805 5В, то все 10В при токе 35мА, падающие на 7805, превращаются в тепло.

 

Может совет несколько неуместный, но зачем вам заниматься учетом сдвигов в самом регистре? У вас же МК для управления имеется. Сдвигайте и XOR-те байт как хотите программно в самом МК, а в регистр записывайте этот байт каждый раз целиком. Все будет детерменировано и никакого геморроя - всего один цикл записи 8-ми бит (установить бит данных, сформировать сдвиговый импульс - и так 8 раз) плюс формирование строба записи по окончании цикла.

В данном случае он в примерно в 8 раз теряет в производительности.

 

for(unsigned char i=0; i < *(table+number); i++)

{

PORTC |= (1<<SI);

PORTC |= (1<<CLK);

PORTC &= ~(1<<SI);

PORTC &= ~(1<<CLK); //загрузить число n=0,1,2,4,8,16,32 раз

}

PORTD |= (1<<STR);

PORTD &= ~(1<<STR); //строб

}

Последовательность действий абсурдна. То как Вы пытаетесь делать, только единицы будут записываться в сдвиговый регистр (все выходы станут активными).

 

Смотрите мой алгоритм. Его можно упростить (как описал rezident), но при этом потеряете в производительности. Если вопрос производительности не стоит, то, конечно, можно загружать каждый раз весь регистр. Но для данной задачи выглядит это криво.

Изменено пользователем AVL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит на вашей 7805 рассеивается большая мощность. Какое напряжение Вы подаете на вход 7805? Такое ощущение, что входное напряжение велико и вся разность падает на 7805, поэтому и греется и не важно, что ток всего 35мА.

Трансформатор на выходе под нагрузкой дает 10,5В. На входной емкости 4700мкФ еще на пару вольт накидывается. По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В?

 

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

Да, мне так удобней. Кроме индикации мне необходимо по событию на выходы Q6, Q7 подать управляющие сигналы. Т.е. вызывать функцию digit(znak), в качестве аргумента является загружаемое значение (0,1,2,4,8,16,32 или др). Если я правильно понял, надо делать так? :

 

void digit(unsigned char number)

{

for (unsigned char i = 0; i < 8; i++)

{

if ((number & 1)) SI = 1;

else SI = 0;

CLK = 1;

CLK = 0;

number = number >> 1;

};

STR = 1;

STR = 0;

}

Мне сейчас необходимо определится: можно ли добится желаемого результата с этой микросхемой или покупать и менять на 74HC595?

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В?

Возможно из-за этого. Радиатор стоит какой-нибудь для отвода тепла? И дополнительно рекомендую снизить входное напряжение до 8-9 Вольт (при больших токах потребления этот момент уже существенен).

 

Да, мне так удобней. Кроме индикации мне необходимо по событию на выходы Q6, Q7 подать управляющие сигналы. Т.е. вызывать функцию digit(znak), в качестве аргумента является загружаемое значение (0,1,2,4,8,16,32 или др). Если я правильно понял, надо делать так? :

 

void digit(unsigned char number)

{

for (unsigned char i = 0; i < 8; i++)

{

if ((number & 1)) SI = 1;

else SI = 0;

CLK = 1;

CLK = 0;

number = number >> 1;

};

STR = 1;

STR = 0;

}

Да, Вы правильно поняли.

 

Мне сейчас необходимо определится: можно ли добится желаемого результата с этой микросхемой или покупать и менять на 74HC595?

конечно можно. Единственное в микросхеме 74HC4094 нет входа сброса. Чревато это тем, что пока Вы не загрузите в регистр корректное значение (все 8 бит), на выходе 74HC4094 при включении питания будет мусор, что приведет к активации нескольких индикаторов сразу. Возможно для Вас это не критично (но Вы указывали, что нельзя, чтобы активизировалось больше, чем один выход).

Изменено пользователем AVL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно из-за этого. Радиатор стоит какой-нибудь для отвода тепла? И дополнительно рекомендую снизить входное напряжение до 8-9 Вольт (при больших токах потребления этот момент уже существенен).

Радиатора нет. По идее 7805 (TO-220) может работать без радиатора до 0,5А.

 

Единственное в микросхеме 74HC4094 нет входа сброса. Чревато это тем, что пока Вы не загрузите в регистр корректное значение (все 8 бит), на выходе 74HC4094 при включении питания будет мусор, что приведет к активации нескольких индикаторов сразу.

Если эта проблема проявляется только при включении питания, то это не проблема. Только я не до конца уяснил один момент. Во время загрузки значения при OE=1 каждый входной бит будет сразу отображаться на выходе до сигнала строб?

 

Кстати, какая нагрузочная способность 74hc4094? В моем даташите(Philips)указаны только временные характеристики. Судя из аналогичного других фирм, указан параметр DC Output Source Sink Current Per Output Pin +/-25mA, DC VCC or Ground Current +/-50mA. Т.е. в статике можно включать одновременно не более 5 нагрузок током 10мА?

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Радиатора нет. По идее 7805 (TO-220) может работать без радиатора до 0,5А.

Я же говорю Вам, проблема не в макс.нагр.токе и не в макс.вх.напряжении, с которыми может работать 7805. Проблема в рассеиваемой мощности. Если Вы подадите на вход 7805 35В и при этом ток в цепи будет 0.5А, то стабилизатор сгорит ярким пламенем :) Вам нужно посмотреть, на какую макс.рассеиваемую мощность расчитан этот стабилизатор без применения радиатора и на какую он расчитан с применением радиатора. И сделать выводы после этого ставить или нет радиатор и какой он должен быть конфигурации.

 

Если эта проблема проявляется только при включении питания, то это не проблема. Только я не до конца уяснил один момент. Во время загрузки значения при OE=1 каждый входной бит будет сразу отображаться на выходе до сигнала строб?

обновление информации (которую Вы задвинули во входной регистр) на выходе микросхемы произойдет только после установки STR=1.

 

Кстати, какая нагрузочная способность 74hc4094? В моем даташите(Philips)указаны только временные характеристики.

У меня Ваш даташит :)

на первой странице даташита написано:

For a complete data sheet, please also download:

· The IC06 74HC/HCT/HCU/HCMOS Logic Family Specifications

· The IC06 74HC/HCT/HCU/HCMOS Logic Package Information

· The IC06 74HC/HCT/HCU/HCMOS Logic Package Outlines

 

Судя из аналогичного других фирм, указан параметр DC Output Source Sink Current Per Output Pin +/-25mA, DC VCC or Ground Current +/-50mA. Т.е. в статике можно включать одновременно не более 5 нагрузок током 10мА?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, заработало! Вот окончательный код:

 

void digit(unsigned char number)

{

unsigned char table[]={0,1,2,4,8,16,32};

 

for (unsigned char i = 0; i < 8; i++)

{

if ((*(table+number) & 128)) PORTC |= (1<<SI);

else PORTC &= ~(1<<SI);

PORTC |= (1<<CLK);

PORTC &= ~(1<<CLK);

*(table+number) = *(table+number) << 1;

}

PORTD |= (1<<STR);

PORTD &= ~(1<<STR);

}

 

number соответствует номеру знакоместа. Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница?

 

Кстати, если кому интересно, нашел одну ссылку на подобную тему:

http://homepages.which.net/~paul.hills/Sof...ftRegister.html

Изменено пользователем alux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница?

Откуда Вы это берете? на резисторах R25...R32 не по 5В же падает, а намного меньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...