реклама на сайте
подробности

 
 
> 74HC4094 в качестве расширителя порта, Кто-нибудь пробовал?
alux
сообщение Jun 7 2007, 18:03
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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
Прикрепленные файлы
Прикрепленный файл  74HC4094N_PHLPS.pdf ( 72.54 килобайт ) Кол-во скачиваний: 94
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alux
сообщение Jun 9 2007, 00:03
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
AVL
сообщение Jun 9 2007, 07:06
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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) ?
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 08:14
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(AVL @ Jun 9 2007, 10:06) *
Как часто вызывается __interrupt void TC0_COMPA_ISR(void) ?

10 мсек
Go to the top of the page
 
+Quote Post
AVL
сообщение Jun 9 2007, 09:22
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 392
Регистрация: 29-05-07
Из: Москва
Пользователь №: 28 020



Цитата(alux @ Jun 9 2007, 12:14) *
10 мсек

тогда весь листинг программы приведите (приложите файл)
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 09:58
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(AVL @ Jun 9 2007, 12:22) *
тогда весь листинг программы приведите (приложите файл)

Прикладываю. Правда там закоментированы некоторые части... Буду Вам очень благодарен, если подскажите, в чем проблема. На первый взгляд, ошибка явная, но я ее не вижу. Нужен взгляд со стороны.
Прикрепленные файлы
Прикрепленный файл  furnace.rar ( 14.42 килобайт ) Кол-во скачиваний: 42
 
Go to the top of the page
 
+Quote Post
AVL
сообщение Jun 9 2007, 10:48
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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).
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 12:05
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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) или вообще применить импульсный источник питания.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 13:02
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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В.
Go to the top of the page
 
+Quote Post
AVL
сообщение Jun 9 2007, 19:04
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 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 режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 19:17
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



Цитата(AVL @ Jun 9 2007, 22:04) *
Для того, чтобы устранить главный источник помех (последствия управления пинами), на время работы АЦП не изменяйте состояния выходных пинов. Время преобразования АЦП составляет от 13 до 260 мкс (в зависимости от того, какой режим Вы выбрали).
А еще лучше, переходите в SLEEP режим до начала преобразования АЦП, а просыпайтесь по прерыванию от АЦП.

Одно уточнение. Не щелкать выводами во время выборки входного сигнала или во время всего преобразования?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 15:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01589 секунд с 7
ELECTRONIX ©2004-2016