|
74HC4094 в качестве расширителя порта, Кто-нибудь пробовал? |
|
|
|
Jun 7 2007, 18:03
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Привет. Необходимо сделать динамическое включение катодов 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, либо по спадающему... Странно.
Сообщение отредактировал alux - Jun 7 2007, 18:19
|
|
|
|
|
 |
Ответов
|
Jun 7 2007, 20:09
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Микросхема 74HC4094 для Вашей задачи подходит не лучшим образом. Для этой задачи нужен счетчик с дешифратором (одна микросхема). Вам будет достаточно управлять 2-мя входами этой микросхемы: счетный вход и вход сброса, при этом активность единственного выхода в каждый момент времени гарантирована независимо от логики работы программы мк. Если же микросхема 74HC4094: Цитата(alux @ Jun 7 2007, 22:03)  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 Цитата(alux @ Jun 7 2007, 22:03)  Сильно греется КРЕН. Померял ток потребления схемы - около 130 мА. Схема - это микроконтроллер (Мега48) с двумя светодиодными индикаторами, управляемые динамически. Видимо, проблема связана с неправильным формированием сигналов на 74HC4094. Неплохо бы схему принципиальную тоже приложить.
|
|
|
|
|
Jun 7 2007, 21:22
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 7 2007, 23:09)  Должно быть так (если по кругу).
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 ?
|
|
|
|
|
Jun 8 2007, 07:35
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 8 2007, 01:22)  Не понял с п.17. Чтобы включить следующее знакоместо (QP1="1", все остальные="0"), при следующем вызове начинать с п.3 ? Вы же по кругу хотите. Соответственно после активации QP5 должен быть активирован QP0. Следовательно из п.17 нужно перейти на пункт 3. Цитата(alux @ Jun 8 2007, 00:43)  ... но 7805 все равно греется (палец не удержать), хотя ток составляет 35мА ?! В холостом режиме (когда от откренки все отсоединено), не греется. Странно однако %-() Значит на вашей 7805 рассеивается большая мощность. Какое напряжение Вы подаете на вход 7805? Такое ощущение, что входное напряжение велико и вся разность падает на 7805, поэтому и греется и не важно, что ток всего 35мА. К примеру, если Вы подаете на вход 7805 15В, на выходе 7805 5В, то все 10В при токе 35мА, падающие на 7805, превращаются в тепло. Цитата(rezident @ Jun 8 2007, 01:29)  Может совет несколько неуместный, но зачем вам заниматься учетом сдвигов в самом регистре? У вас же МК для управления имеется. Сдвигайте и XOR-те байт как хотите программно в самом МК, а в регистр записывайте этот байт каждый раз целиком. Все будет детерменировано и никакого геморроя - всего один цикл записи 8-ми бит (установить бит данных, сформировать сдвиговый импульс - и так 8 раз) плюс формирование строба записи по окончании цикла. В данном случае он в примерно в 8 раз теряет в производительности. Цитата(alux @ Jun 8 2007, 11:01)  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 - Jun 8 2007, 07:39
|
|
|
|
|
Jun 8 2007, 08:18
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 8 2007, 10:35)  Значит на вашей 7805 рассеивается большая мощность. Какое напряжение Вы подаете на вход 7805? Такое ощущение, что входное напряжение велико и вся разность падает на 7805, поэтому и греется и не важно, что ток всего 35мА. Трансформатор на выходе под нагрузкой дает 10,5В. На входной емкости 4700мкФ еще на пару вольт накидывается. По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В? Цитата(AVL @ Jun 8 2007, 10:35)  Если вопрос производительности не стоит, то, конечно, можно загружать каждый раз весь регистр. Да, мне так удобней. Кроме индикации мне необходимо по событию на выходы 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 - Jun 8 2007, 08:30
|
|
|
|
|
Jun 8 2007, 08:42
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 8 2007, 12:18)  По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В? Возможно из-за этого. Радиатор стоит какой-нибудь для отвода тепла? И дополнительно рекомендую снизить входное напряжение до 8-9 Вольт (при больших токах потребления этот момент уже существенен). Цитата(alux @ Jun 8 2007, 12:18)  Да, мне так удобней. Кроме индикации мне необходимо по событию на выходы 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; } Да, Вы правильно поняли. Цитата(alux @ Jun 8 2007, 12:18)  Мне сейчас необходимо определится: можно ли добится желаемого результата с этой микросхемой или покупать и менять на 74HC595? конечно можно. Единственное в микросхеме 74HC4094 нет входа сброса. Чревато это тем, что пока Вы не загрузите в регистр корректное значение (все 8 бит), на выходе 74HC4094 при включении питания будет мусор, что приведет к активации нескольких индикаторов сразу. Возможно для Вас это не критично (но Вы указывали, что нельзя, чтобы активизировалось больше, чем один выход).
Сообщение отредактировал AVL - Jun 8 2007, 08:46
|
|
|
|
|
Jun 8 2007, 09:06
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 8 2007, 11:42)  Возможно из-за этого. Радиатор стоит какой-нибудь для отвода тепла? И дополнительно рекомендую снизить входное напряжение до 8-9 Вольт (при больших токах потребления этот момент уже существенен). Радиатора нет. По идее 7805 (TO-220) может работать без радиатора до 0,5А. Цитата(AVL @ Jun 8 2007, 11:42)  Единственное в микросхеме 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 - Jun 8 2007, 09:14
|
|
|
|
Сообщений в этой теме
alux 74HC4094 в качестве расширителя порта Jun 7 2007, 18:03 rezident Народ обычно использует 74HC595 и TPIC6C595. При н... Jun 7 2007, 19:34 alux Цитата(rezident @ Jun 7 2007, 22:34) Наро... Jun 7 2007, 20:43      AVL Цитата(alux @ Jun 8 2007, 13:06) Радиатор... Jun 8 2007, 10:38    rezident Цитата(alux @ Jun 8 2007, 14:18) Трансфор... Jun 9 2007, 11:20 rezident Похожую схему только без аналоговых входов (индика... Jun 7 2007, 21:14 rezident Может совет несколько неуместный, но зачем вам зан... Jun 7 2007, 21:29 alux Цитата(rezident @ Jun 8 2007, 00:29) Сдви... Jun 8 2007, 07:01 alux Все, заработало! Вот окончательный код:
void ... Jun 8 2007, 13:07 AVL Цитата(alux @ Jun 8 2007, 17:07) Если вкл... Jun 8 2007, 13:28  alux Цитата(AVL @ Jun 8 2007, 16:28) Откуда Вы... Jun 8 2007, 14:02 almay ЦитатаЕсли включить одно знакоместо постоянно и за... Jun 8 2007, 13:30 alux Прошу прощения, но есть еще одна проблема с индика... Jun 9 2007, 00:03 AVL Цитата(alux @ Jun 9 2007, 04:03) А вот в ... Jun 9 2007, 07:06  alux Цитата(AVL @ Jun 9 2007, 10:06) Как часто... Jun 9 2007, 08:14   AVL Цитата(alux @ Jun 9 2007, 12:14) 10 мсек
... Jun 9 2007, 09:22    alux Цитата(AVL @ Jun 9 2007, 12:22) тогда вес... Jun 9 2007, 09:58     AVL Цитата(alux @ Jun 9 2007, 13:58) Приклады... Jun 9 2007, 10:48      alux Цитата(AVL @ Jun 9 2007, 13:48) Во первых... Jun 9 2007, 12:05       rezident Цитата(alux @ Jun 9 2007, 18:05) 1) поста... Jun 9 2007, 12:37        alux to rezident.
Я хочу вернуться к вопросу чрезмерно... Jun 14 2007, 07:28         AVL Цитата(alux @ Jun 14 2007, 11:28) to rezi... Jun 14 2007, 08:32         Сергей Борщ Цитата(alux @ Jun 14 2007, 10:28) Я хочу ... Jun 14 2007, 09:23         rezident Цитата(alux @ Jun 14 2007, 13:28) to rezi... Jun 14 2007, 12:01          alux Цитата(rezident @ Jun 14 2007, 15:01) Тол... Jun 14 2007, 16:58           Сергей Борщ Цитата(alux @ Jun 14 2007, 19:58) 7805 пи... Jun 14 2007, 19:26            alux Цитата(Сергей Борщ @ Jun 14 2007, 22:26) ... Jun 15 2007, 06:36       AVL Цитата(alux @ Jun 9 2007, 16:05) А зачем?... Jun 9 2007, 12:38        alux Цитата(AVL @ Jun 9 2007, 15:38) А причем ... Jun 9 2007, 13:16         AVL Цитата(alux @ Jun 9 2007, 17:16) Цитата и... Jun 9 2007, 13:33          rezident Цитата(AVL @ Jun 9 2007, 19:33) P.S. Напр... Jun 9 2007, 13:43           AVL Цитата(rezident @ Jun 9 2007, 17:43) Насч... Jun 9 2007, 14:44           alux Цитата(rezident @ Jun 9 2007, 16:43) Вот ... Jun 11 2007, 04:23       alux Цитата(alux @ Jun 9 2007, 15:05) А вот ту... Jun 9 2007, 13:02        AVL Цитата(alux @ Jun 9 2007, 17:02) Прошу пр... Jun 9 2007, 13:12         alux Цитата(AVL @ Jun 9 2007, 16:12) Предделит... Jun 9 2007, 14:22        AVL Цитата(alux @ Jun 9 2007, 17:02) И еще од... Jun 9 2007, 19:04         alux Цитата(AVL @ Jun 9 2007, 22:04) Для того,... Jun 9 2007, 19:17          AVL Цитата(alux @ Jun 9 2007, 23:17) Одно уто... Jun 9 2007, 19:29 rezident Цитата(alux)2)опорное напряжение (+2.5В) на TL431 ... Jun 9 2007, 15:11 alux Цитата(rezident @ Jun 9 2007, 18:11) Выво... Jun 9 2007, 15:58  rezident Цитата(alux @ Jun 9 2007, 21:58) А на сче... Jun 9 2007, 16:25   alux Цитата(rezident @ Jun 9 2007, 19:25) А во... Jun 9 2007, 18:26    rezident Цитата(alux @ Jun 10 2007, 00:26) Просто ... Jun 9 2007, 19:10     alux Цитата(rezident @ Jun 9 2007, 22:10) Каки... Jun 9 2007, 19:48      rezident Цитата(alux @ Jun 10 2007, 01:48) Неужели... Jun 9 2007, 21:18       alux Цитата(rezident @ Jun 10 2007, 00:18) А д... Jun 9 2007, 22:02 rezident ratiometric, это просто делитель напряжения питани... Jun 9 2007, 22:39 rezident Несмотря на то, что в вашем примере переменная Fla... Jun 11 2007, 17:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|