Jump to content

    
Sign in to follow this  
alux

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

Recommended Posts

Привет. Необходимо сделать динамическое включение катодов 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

Edited by alux

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Микросхема 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.

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

Share this post


Link to post
Share on other sites
Народ обычно использует 74HC595, TPIC6C595.

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

 

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

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

Schema.pdf

Edited by alux

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites
Должно быть так (если по кругу).

 

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 ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Сдвигайте и 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В нужны для других целей.

Share this post


Link to post
Share on other sites
Не понял с п.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), но при этом потеряете в производительности. Если вопрос производительности не стоит, то, конечно, можно загружать каждый раз весь регистр. Но для данной задачи выглядит это криво.

Edited by AVL

Share this post


Link to post
Share on other sites
Значит на вашей 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?

Edited by alux

Share this post


Link to post
Share on other sites
По справочнику допустимое входное напряжение 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 при включении питания будет мусор, что приведет к активации нескольких индикаторов сразу. Возможно для Вас это не критично (но Вы указывали, что нельзя, чтобы активизировалось больше, чем один выход).

Edited by AVL

Share this post


Link to post
Share on other sites
Возможно из-за этого. Радиатор стоит какой-нибудь для отвода тепла? И дополнительно рекомендую снизить входное напряжение до 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мА?

Edited by alux

Share this post


Link to post
Share on other sites
Радиатора нет. По идее 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мА?

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

Share this post


Link to post
Share on other sites

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

 

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

Edited by alux

Share this post


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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this