|
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 9 2007, 00:03
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Прошу прощения, но есть еще одна проблема с индикацией. В статике все работает замечательно. Делаю так: display(1); digit(1); delay_ms(2000);
display(2); digit(2); delay_ms(2000);
display(1); digit(1); delay_ms(2000); и на индикаторе поочередно зажигаются 1,2,3 слева-на-право. А вот в динамике есть накладка. Вот кусок кода:
__flash unsigned char code7[]= {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
#pragma vector=TIMER0_COMPA_vect __interrupt void TC0_COMPA_ISR(void) { switch(znak) { case 0: hundred=1; ten=2; one=3;
display(hundred); digit(++znak); break;
case 1: display(ten); digit(++znak); break;
case 2: display(one); digit(++znak); znak=0; break; } ................... }
//////////////////////////////////////// /******************************************************** // Вывод значения на индикатор с преобразованием в 7-сегментный код void display(unsigned char num) { unsigned char temp;
num=*(code7+num);
temp = num; PORTB=(temp&0x3f);
temp = PORTD; temp &= 0x3f; num &= 0xc0; PORTD = (temp|num); }
//***************************************************************** //Включение знакоместа формированием "1" на выходе (74HC4094) 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) <<= 1; } PORTD |= (1<<STR); PORTD &= ~(1<<STR); }
При этом происходит наложение H+M, M+L, L+H. H,M,L-разряды индикатора. Проганял в симуляторе. Все пучком. В чем же дело?
Сообщение отредактировал alux - Jun 9 2007, 00:06
|
|
|
|
|
Jun 9 2007, 07:06
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 04:03)  А вот в динамике есть накладка. При этом происходит наложение H+M, M+L, L+H. H,M,L-разряды индикатора. Проганял в симуляторе. Все пучком. В чем же дело? Как часто вызывается __interrupt void TC0_COMPA_ISR(void) ?
|
|
|
|
|
Jun 9 2007, 09:22
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 12:14)  10 мсек тогда весь листинг программы приведите (приложите файл)
|
|
|
|
|
Jun 9 2007, 09:58
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 9 2007, 12:22)  тогда весь листинг программы приведите (приложите файл) Прикладываю. Правда там закоментированы некоторые части... Буду Вам очень благодарен, если подскажите, в чем проблема. На первый взгляд, ошибка явная, но я ее не вижу. Нужен взгляд со стороны.
|
|
|
|
|
Jun 9 2007, 10:48
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 13:58)  Прикладываю. Правда там закоментированы некоторые части... Буду Вам очень благодарен, если подскажите, в чем проблема. На первый взгляд, ошибка явная, но я ее не вижу. Нужен взгляд со стороны. Во первых, проинициализируйте переменную znak=0 в Initialise(void). Затем попробуйте следующее: 1) добавьте элемент "нет свечения": __flash unsigned char code7[]= //hgfedcba {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x78, 0x5c, 0x39, 0x77, 0x38, 0x00}; //0(0), 1(1), 2(2), 3(3), 4(4), 5(5), 6(6), 7(7), 8(8), 9(9), 10(t),11(o),12©,13(A),14(L),15( ) 2) в обработчике __interrupt void TC0_COMPA_ISR(void) вместо каждой пары строк display(hundred/ten/one); digit(++znak); напишите: display(15); digit(++znak); display(hundred/ten/one); Если не поможет, попробуйте для эксперимента отключить все обработчики прерываний, кроме __interrupt void TC0_COMPA_ISR(void).
|
|
|
|
|
Jun 9 2007, 12:05
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(AVL @ Jun 9 2007, 13:48)  Во первых, проинициализируйте переменную znak=0 в Initialise(void). А зачем? Она же глобальная. Цитата(AVL @ Jun 9 2007, 13:48)  Если не поможет, попробуйте для эксперимента отключить все обработчики прерываний, кроме __interrupt void TC0_COMPA_ISR(void). А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика? Цитата(rezident @ Jun 9 2007, 14:20)  Допустимая рассеиваемая без радиатора мощность рассчитывается довольно просто. Спасибо за детальный расчет. Очень кстати. Значит для уменьшения тепловыделения: 1) поставить трансформатор с выходным напряжением 6...7В, 2) поставить на 7805 радиатор, 3) или вообще применить импульсный источник питания.
|
|
|
|
|
Jun 9 2007, 13:02
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(alux @ Jun 9 2007, 15:05)  А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика? Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был No_prescaling. Но все равно не ясно, каким образом период прерывания влияет на наложение разрядов? И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется TL431 и схема измерения ratiometric. #pragma vector=ADC_vect __interrupt void ADC_ISR(void) { digit(0); //выключить индикатор accum = ADC; digit(znak); //восстановить индикатор } // End of ADC_ISR Но включение, выключение в процедуре АЦП влияет на индикацию. Младший разряд нижнего индикатора еле светится значением. Вопрос: 1)так ли необходимо выключать индикацию в момент измерения? 2)опорное напряжение (+2.5В) на TL431 по качеству отличается от внутреннего, который в микроконтроллере, например в Меге8 ? Я использовал внешний, потому-что у Меги48 внутренний +1.1В.
|
|
|
|
|
Jun 9 2007, 19:04
|
Местный
  
Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020

|
Цитата(alux @ Jun 9 2007, 17:02)  И еще один момент. В программе используется прерывание АЦП. В нем я обычно гашу индикацию, чтобы не "плавал" источник питания, к которому привязано опорное напряжение. Хотя в качестве опорного используется TL431 и схема измерения ratiometric. #pragma vector=ADC_vect __interrupt void ADC_ISR(void) { digit(0); //выключить индикатор
accum = ADC;
digit(znak); //восстановить индикатор } // End of ADC_ISR Такое отключение (в обработчике __interrupt void ADC_ISR(void) ) Вам ничего не даст. Когда управление передается обработчику прерывания __interrupt void ADC_ISR(void), АЦП уже все посчитал. То есть из обработчика отключение индикации можно убрать. Если требуется высокая точность измерения, то, конечно, динамическая индикация во время измерения будет давать помехи. Но не только индикация, переключение реле тоже. Если идти дальше, то помехи дают даже переключения внутри микроконтроллера. Для того, чтобы устранить главный источник помех (последствия управления пинами), на время работы АЦП не изменяйте состояния выходных пинов. Время преобразования АЦП составляет от 13 до 260 мкс (в зависимости от того, какой режим Вы выбрали). А еще лучше, переходите в SLEEP режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП.
|
|
|
|
Сообщений в этой теме
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 Микросхема 74HC4094 для Вашей задачи подходит не л... Jun 7 2007, 20:09 alux Цитата(AVL @ Jun 7 2007, 23:09) Должно бы... Jun 7 2007, 21:22  AVL Цитата(alux @ Jun 8 2007, 01:22) Не понял... Jun 8 2007, 07:35   alux Цитата(AVL @ Jun 8 2007, 10:35) Значит на... Jun 8 2007, 08:18    AVL Цитата(alux @ Jun 8 2007, 12:18) По справ... Jun 8 2007, 08:42     alux Цитата(AVL @ Jun 8 2007, 11:42) Возможно ... Jun 8 2007, 09:06      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       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        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, 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
|
|
|