|
|
  |
74HC4094 в качестве расширителя порта, Кто-нибудь пробовал? |
|
|
|
Jun 8 2007, 13:30
|
Участник

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

|
Цитата Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница? Вроде бы как еще падение на светодиоде имеется 1,2-1,6В плюс точность(%) резисторов.
|
|
|
|
|
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, 11:20
|
Гуру
     
Группа: Свой
Сообщений: 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С, еще не горячо, но уже ощутимо  Если 35мА ток потребления устройства при погашенном индикаторе, то при всех засвеченных сегментах всех знакомест ток потребления будет около (5В-1,3В)/220Ом*7+0,035А=118мА. Тогда температура самого стабилизатора L7805 при температуре окр. воздуха 25С будет около (12В-5В)*(0,006А+0,118А)*55С/Вт+25С= 73С - уже можно обжечься!
|
|
|
|
|
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, 12:37
|
Гуру
     
Группа: Свой
Сообщений: 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) или вообще применить импульсный источник питания. Одно из самых корректных решений.
|
|
|
|
|
Jun 9 2007, 12:38
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
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, 13:12
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|