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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> 74HC4094 в качестве расширителя порта, Кто-нибудь пробовал?
almay
сообщение Jun 8 2007, 13:30
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 74
Регистрация: 26-01-05
Из: Московская обл.
Пользователь №: 2 207



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

Вроде бы как еще падение на светодиоде имеется 1,2-1,6В плюс точность(%) резисторов.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 8 2007, 14:02
Сообщение #17


Знающий
****

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



Цитата(AVL @ Jun 8 2007, 16:28) *
Откуда Вы это берете? на резисторах R25...R32 не по 5В же падает, а намного меньше.

Согласен. В общем, тему считаю исчерпанной. Спасибо за участие.
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 00:03
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 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
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 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
rezident
сообщение Jun 9 2007, 11:20
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(alux @ Jun 8 2007, 14:18) *
Трансформатор на выходе под нагрузкой дает 10,5В. На входной емкости 4700мкФ еще на пару вольт накидывается. По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В?

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

Допустимая рассеиваемая без радиатора мощность рассчитывается довольно просто. Достаточно пары страниц из datasheet L7805CV. Тепловое сопротивление корпуса TO-220 составляет 55 С/Вт. Максимальная рабочая температура кристалла L7805CV - 150 C. Следовательно при температуре окружающей среды 25С максимально допустимая рассеиваемая температура (150С-25С)/55С/Вт=2,27Вт.
Считаем далее.
Собственный ток потребления L7805 при 25С - 6мА (+0,5мА при изменении нагрузки до 1А.) При входном напряжении 12В и токе нагрузки 35 мА на м/с будет рассеиваться примерно (12В-5В)*(0,006А+0,035А)=0,29Вт. Что даст перегрев 0,29Вт*55С/Вт=15,95С. При температуре окружающей среды 25С температура м/с составит примерно 25C+15.95C=41С, еще не горячо, но уже ощутимо smile.gif
Если 35мА ток потребления устройства при погашенном индикаторе, то при всех засвеченных сегментах всех знакомест ток потребления будет около (5В-1,3В)/220Ом*7+0,035А=118мА. Тогда температура самого стабилизатора L7805 при температуре окр. воздуха 25С будет около (12В-5В)*(0,006А+0,118А)*55С/Вт+25С= 73С - уже можно обжечься! wink.gif
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 12:05
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 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
rezident
сообщение Jun 9 2007, 12:37
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(alux @ Jun 9 2007, 18:05) *
1) поставить трансформатор с выходным напряжением 6...7В,

Ага, но только на 9В. При очень грубом подсчете выпрямителя на небольшие напряжение можно считать, что в самых плохих условиях (пониженное входное сетевое напряжение, маленькая емкость фильтрующего конденсатора выпрямителя и т.п.) на входе стабилизатора будет то же по величине напряжение (естественно что уже постоянное), что и на выходе трансформатора. Maximum Dropout Voltage (падение напряжение на стабилизаторе) для L7805CV составляет 2,5В. При использовании 6-7В трансформатора вашему стабилизаторе просто не хватит величины выпрямленного напряжения, чтобы на выходе обеспечить стабильное напряжение 5В.
Цитата(alux @ Jun 9 2007, 18:05) *
2) поставить на 7805 радиатор,

Для трансформаторного линейного БП, я бы даже сказал, что это обязательное условие.
Цитата(alux @ Jun 9 2007, 18:05) *
3) или вообще применить импульсный источник питания.

Одно из самых корректных решений.
Go to the top of the page
 
+Quote Post
AVL
сообщение Jun 9 2007, 12:38
Сообщение #27


Местный
***

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



Цитата(alux @ Jun 9 2007, 16:05) *
А зачем? Она же глобальная.

А причем здесь глобальная? Вы когда включаете питание, каким будет содержимое SRAM? Если ее никто не проинициализирует, там будет мусор. Или у Вас есть какая-то процедура, производящая инициализацию всей памяти, и я ее не приметил?

Цитата(alux @ Jun 9 2007, 16:05) *
А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика?

затрудняюсь ответить

Сообщение отредактировал AVL - Jun 9 2007, 12:39
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 13:02
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 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, 13:12
Сообщение #29


Местный
***

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



Цитата(alux @ Jun 9 2007, 17:02) *
Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был No_prescaling. Но все равно не ясно, каким образом период прерывания влияет на наложение разрядов?

Предделитель какого обработчика был No_prescaling?
И вопрос. Вы сделали, что я рекомендовал (см.ниже)?
Цитата
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);


Сообщение отредактировал AVL - Jun 9 2007, 13:14
Go to the top of the page
 
+Quote Post
alux
сообщение Jun 9 2007, 13:16
Сообщение #30


Знающий
****

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



Цитата(AVL @ Jun 9 2007, 15:38) *
А причем здесь глобальная? Вы когда включаете питание, каким будет содержимое SRAM? Если ее никто не проинициализирует, там будет мусор. Или у Вас есть какая-то процедура, производящая инициализацию всей памяти, и я ее не приметил?

Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться.
Go to the top of the page
 
+Quote Post

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

 


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


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