Кто паял тахометр?
Танцы с бубном продолжаются!!! 😢
Понижал напряжение питания индикатора,
ставил последовательно сопротивления на вход DI и CLK,
и что же…………….
Как они подмаргивали, так и подмаргивают. 😈
Может быть, дело не в индикаторах? 😦
Всем привет.
Я перестал броться, пользую как есть.
Дело не в индикаторах!!!
❗ Они моргают в такт импульсной посылки.
Когда проц подвешиваешь (пальцем все ноги коротишь 😊 ), индикатор не моргает… (импульсы не идут). Вот так… На рынке, АОН-щики говорят (да и енто видно на телефонах), что у них не моргает.
Как с этим бороться, незнаю… 😢
Удачи!!!
Они моргают в такт импульсной посылки.
Я, наверное, сейчас скажу какую-нибудь глупость… Но мне кажется, что дело в прошивке.
Как с этим бороться, незнаю… :cry:
Перерисовывать то, что находится на индикаторе только в случае несоответствия данных на экране с вновь расчитанными значениями.
Мне кажется пора вмешаться автору тахометра
и дать соответствующие пояснения 😎
Vitaly у тебя, в твоем тахометре, индикаторы подмаргивают?
Что надо сделать чтоб не моргали?
Моргают. Как раз во время обновления информации. То бишь, 3 раза в секунду. Как от этого избавиться - не знаю. Чес слово. Я плюнул. В конце концов, цифры видно - и ладно. Делалось давно, а теперь вылизывать прошивку нет ни смысла ни времени.
вы будете смеяться:
АОН Русь-20, старый такой. в Москве индикатор не моргает, в Люберцах моргает - видно как обновляется.
привожу обратно в Москву - не моргает. хоть стреляйся.
либо освещение разное, либо ток в розетке кривой 😃
RPM.C :
добавляем глобальную переменную:
WORD oldRpm; // предыдущее измеренное значение
в функцию RpmInit:
oldRpm = 0xFFFF; // любое число не равное wRpm
RPM.H :
добавить после wRpm:
extern WORD oldRpm; // предыдущее измеренное значение
DISPLAY.C :
в функци RefreshDisplay:
if( btRpmMode ) {
if (PrepareRpmData(wLockedRpm, byBladeCnt)) ShowDisplayData();
} else {
PrepareTimeData(wLockedTime, btTimerOn);
ShowDisplayData();
}
декларация PrepareRpmData меняется, будет:
int PrepareRpmData(WORD wRpm, BYTE byBladeCnt)
в начало функции (сразу после “{”) надо вставить:
if (wRpm == oldRpm) return 0;
а в самый конец (перед последней “}”) добавить:
oldRpm = wRpm;
return 1;
KBD.C :
в функции ProcessKey, в ветви SWITCH case KEY_MODE: после btRpmMode = !btRpmMode; добавить:
oldRpm = 0xFFFF;
По-идее проблема должна решиться (не вся, так частично). Можно пойти дальше, и обновлять только изменившиеся разряды.
Для этого надо вместо всего, что я выше написал, в display.c сделать еще один буфер дисплея:
BYTE byOldDisplay[10]; // буфер данных, для вывода на экран
и переписать соответствующим образом ShowDisplayData. Не знаю, можно ли выводить символы произвольно, либо надо делать это последовательно. Если второе - то не получится.
ps: рецепт писал прямо сюда. за синтаксис не отвечаю, но по-идее должно компилироваться. эффект не проверял, так как ни тахометра, ни даже компилятора C для atmel на работе не имею.
pps: если есть желающие, welcome исправить прошивку более грамотно.
У меня ничего не мигает.
я использую эти индикаторы много и часто,
дохлых изначально еще встречал.
есть минус у индикаторов с большой стекляшкой- от вибрации
( примерно через год эксплуатации по 8 часов в день- используюся в манипуляторах для намазывания клея при сборке динамиков) отсыхает контакт печатного кабеля от платы и некоторые сегменты дохнут. правда, это был единичный случай.
вот моя стандартная программа вывода.
//------------------------------------------------------------------------------
// Вывод 1 знака на экран
//------------------------------------------------------------------------------
void OutSymbol(byte symbolX)
{
byte i; // Счетчик битов в выводимом символе.
// 4 бита - 1 символ
for(i=0; i<4; i++)
{
PORTB.4= ( (symbolX& 0x08)?1:0);// Выставляем на DI бит данных(первый в symbolX)
delay_us(5); //ждем
PORTB.3=0; // Выключаем и включаем CLK, индикатор считывает
delay_us(5); //ждем
PORTB.3=1;
symbolX <<= 1; //сдвигаем на разряд для доступа к следующему разряду
}
}
//------------------------------------------------------------------------------
// Вывод экранного буфера на индикатор
//------------------------------------------------------------------------------
void indicatorOut(void)
{
byte i; // Счетчик выводимых символов.
for(i=0; i<10; i++)
OutSymbol(symbol[digit[i]]);// выводим 10 текущих цифр
}
//-------------------------------------------------------------------------------
// орем как прищемленный кот…
//-------------------------------------------------------------------------------
void alarm(void)
{
Сергей. pp_serj@ mail.ru
Да блин, по собственному опыту и даташиту скажу. Этот индикатор не моргать не может, принцип работы у него такой. Символы в него передаются последовательно. Символ записали - он отображается в крайней правой позиции, записали следующий - первый сдвинулся на одну поз. влево. Таким образом, один изменившийся символ обновить на индикаторе нельзя, только все десять. Т. е. Индикатор по любому помаргивает, другое дело, заметно это или нет. Чуть снизив напряжение питания можно уменьшить заметность этого моргания, но уменьшается и яркость и засветка “нерабочих” сегментов. Тут нужен компромис, на питание можно впаять переменник и попробовать с разным напряжением питания (1,4 - 1,6В). Еще уменьшить заметность мерцания можно минимизируя задержки при выводе символов, т.е. после вывода бита - четь больше 1мкс и между символами больше 5 мкс (если правильно помню). И третье, самое очевидное, и все об этом здесь говорят, реже обновлять информацию на дисплее.
У меня ничего не мигает.
я использую эти индикаторы много и часто,
дохлых изначально еще встречал.
Привет Serj! 😃
Очень радует, что индикатор в твоем тахометре не мигает.
Я, со своим замучился. 😢 Что только не делал…. Прошивку, правда, не менял.
Если есть нормальный вариант прошивки на данное изделие, скинь пожалуйста. 😃