almay 0 8 июня, 2007 Опубликовано 8 июня, 2007 · Жалоба Если включить одно знакоместо постоянно и засветить все сегменты ("8"), ток потребления составляет 104мА. 7805 греется :-/ Хотя по з-ну Ома: I=U/R = 5/220=23мА. Для 7 сегментов 23*7=161мА. Откуда такая разница? Вроде бы как еще падение на светодиоде имеется 1,2-1,6В плюс точность(%) резисторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 8 июня, 2007 Опубликовано 8 июня, 2007 · Жалоба Откуда Вы это берете? на резисторах R25...R32 не по 5В же падает, а намного меньше. Согласен. В общем, тему считаю исчерпанной. Спасибо за участие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 (изменено) · Жалоба Прошу прощения, но есть еще одна проблема с индикацией. В статике все работает замечательно. Делаю так: 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-разряды индикатора. Проганял в симуляторе. Все пучком. В чем же дело? Изменено 9 июня, 2007 пользователем alux Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А вот в динамике есть накладка. При этом происходит наложение H+M, M+L, L+H. H,M,L-разряды индикатора. Проганял в симуляторе. Все пучком. В чем же дело? Как часто вызывается __interrupt void TC0_COMPA_ISR(void) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Как часто вызывается __interrupt void TC0_COMPA_ISR(void) ? 10 мсек Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба 10 мсек тогда весь листинг программы приведите (приложите файл) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба тогда весь листинг программы приведите (приложите файл) Прикладываю. Правда там закоментированы некоторые части... Буду Вам очень благодарен, если подскажите, в чем проблема. На первый взгляд, ошибка явная, но я ее не вижу. Нужен взгляд со стороны. furnace.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Прикладываю. Правда там закоментированы некоторые части... Буду Вам очень благодарен, если подскажите, в чем проблема. На первый взгляд, ошибка явная, но я ее не вижу. Нужен взгляд со стороны. Во первых, проинициализируйте переменную 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Трансформатор на выходе под нагрузкой дает 10,5В. На входной емкости 4700мкФ еще на пару вольт накидывается. По справочнику допустимое входное напряжение 7805 от 7 до 35В. Вы хотите сказать, что причина перегрева в том, что на входе стабилизатора напряжение 12В? 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С - уже можно обжечься! ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба Во первых, проинициализируйте переменную znak=0 в Initialise(void). А зачем? Она же глобальная. Если не поможет, попробуйте для эксперимента отключить все обработчики прерываний, кроме __interrupt void TC0_COMPA_ISR(void). А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика? Допустимая рассеиваемая без радиатора мощность рассчитывается довольно просто. Спасибо за детальный расчет. Очень кстати. Значит для уменьшения тепловыделения: 1) поставить трансформатор с выходным напряжением 6...7В, 2) поставить на 7805 радиатор, 3) или вообще применить импульсный источник питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба 1) поставить трансформатор с выходным напряжением 6...7В, Ага, но только на 9В. При очень грубом подсчете выпрямителя на небольшие напряжение можно считать, что в самых плохих условиях (пониженное входное сетевое напряжение, маленькая емкость фильтрующего конденсатора выпрямителя и т.п.) на входе стабилизатора будет то же по величине напряжение (естественно что уже постоянное), что и на выходе трансформатора. Maximum Dropout Voltage (падение напряжение на стабилизаторе) для L7805CV составляет 2,5В. При использовании 6-7В трансформатора вашему стабилизаторе просто не хватит величины выпрямленного напряжения, чтобы на выходе обеспечить стабильное напряжение 5В. 2) поставить на 7805 радиатор, Для трансформаторного линейного БП, я бы даже сказал, что это обязательное условие. 3) или вообще применить импульсный источник питания. Одно из самых корректных решений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 (изменено) · Жалоба А зачем? Она же глобальная. А причем здесь глобальная? Вы когда включаете питание, каким будет содержимое SRAM? Если ее никто не проинициализирует, там будет мусор. Или у Вас есть какая-то процедура, производящая инициализацию всей памяти, и я ее не приметил? А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика? затрудняюсь ответить Изменено 9 июня, 2007 пользователем AVL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А вот тут началось самое интересное!!! Запретил прерывание АЦП, и все заработало. В смысле хотя бы показывает число в динамике. Но самое интересное в том, что все работает даже после разрешения прерывания АЦП !!! Это что, мистика? Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был 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В. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVL 0 9 июня, 2007 Опубликовано 9 июня, 2007 (изменено) · Жалоба Прошу прощения. Нет здесь мистики. Была ошибка в настройке прерывания. Предделитель был 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); Изменено 9 июня, 2007 пользователем AVL Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 9 июня, 2007 Опубликовано 9 июня, 2007 · Жалоба А причем здесь глобальная? Вы когда включаете питание, каким будет содержимое SRAM? Если ее никто не проинициализирует, там будет мусор. Или у Вас есть какая-то процедура, производящая инициализацию всей памяти, и я ее не приметил? Цитата из учебника по С: "Если глобальная переменная не проинициализирована явным образом, она инициализируется значением 0". Мне не трудно проинициализировать. Я только хочу разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться