Поделюсь с сообществом информацией, может быть кому-то поможет сэкономить время и нервы.
Лет 15 назад сделал часики из того, что было. Все взлетело на ура. Ничего хитрого, 12 больших синих индикаторов с общим катодом (5 Вольт им конечно было мало), катодные ключи на советском аналоге ULN2003 через сдвиговые регистры 561ИР9, а 8 анодов кормились через простейший драйвер - преобразователь уровней на дискретных элементах.
На днях сделал еще одни друзьям. Программа и схема почти та же, только регистры уже 74HC595. Гляжу, в сети народ юзает набор ключей UDN2981 для подобной индикации. По диагонали глянул даташит, вроде все подходит. Для подачи 12 вольт на аноды самое то, решил я. Вместо почти полусотни дискретных элементов один чип, красота!
Сделал, короче.
Получил развлечение на несколько вечеров. Паразитная засветка сегментов. Если вывести восьмерку, она же будет ощутимо светиться в следующем по порядку разряде. Нужно отметить, что у моих индикаторов очень хорошая отдача, когда вызванивал цоколевку, сегменты чуток светились прямо через меня.
И началось
Включал / выключал / изменял режимы диммирования, заливал всякие тесты, вешал ёмкости, резисторы. До красноглазия вглядывался в код. Прерывание только одно, по таймеру, там примерно всё как в десятках моих старых проектов.
Код: Выделить всё
interrupt [TIM0_COMPA] void timer0_compa_isr(void) {
if ( conv_ms > 0 ) conv_ms--;
ANODES = 0; // выключаем индикатор ваще
if (idx==0) {
DS_DATA=1;
STROBE=1;
STROBE=0;
DS_DATA=0;
}
STROBE=1;
STROBE=0;
ANODES = att[idx];
idx++;
if (idx>11) idx = 0;
}
Одна добавленная строка в прерывание решила проблему. Короче, найдите одно отличие:
Код: Выделить всё
interrupt [TIM0_COMPA] void timer0_compa_isr(void) {
if ( conv_ms > 0 ) conv_ms--;
ANODES = 0; // выключаем индикатор ваще
delay_us(10);
if (idx==0) {
DS_DATA=1;
STROBE=1;
STROBE=0;
DS_DATA=0;
}
STROBE=1;
STROBE=0;
ANODES = att[idx];
idx++;
if (idx>11) idx = 0;
}
Этот сволочной чип просто не успевал выключаться, никогда бы не подумал.
Но глянув еще раз даташит (лучше поздно, чем никогда, ага...), я узрел там такой нотес:
Короче, он только для реле по-ходуNOTES: Turn-off delay is influenced by load conditions. Systems applications well below the specified output loading may require timing considerations for some designs, i.e., multiplexed displays or when used in combination with sink drivers in a totem pole configuration.
Дополнительные материалы
Старая схема с мосфетами:
Новая схема с UDN2981:
Что вышло:
Даташит UDN2981: