[uquote="forregister84",url="/forum/viewtopic.php?p=4310667#p4310667"]Ребят, я немного о другом. LCD тормозит при пониженных температурах, также в datasheet упоминается, что напряжение регулировки контраста зависит от температуры. Интересует опыт в этом вопросе.
Даже при +15 C уже тормозит и мигание при изменении шага было почти не видно.[/uquote]
А, про это.. Ну оригинальные Winstar-ы и МЭЛТ-ы, которыми я пользовался в те времена, работали нормально. Сильно в холоде не проверял, но при уличных осенних +10° замечаний не было. Как сейчас обстоят дела с китайскими матрицами - фик знает, не пробовал.
При понижении температуры все ЖКД снижают быстродействие самих кристаллов, они медленнее поворачиваются, это нормально. При -30° время их "поворота" может достигать пары секунд.
Demiurg писал(а):Первый вариант, это прерывание аппаратного таймера настроенного на 1 мс.
но ты же утверждал, что ты прерывание не используешь совсем.
а теперь оказалось, что ты все-таки используешь прерывание аппаратного таймера.
зачем же нас обманывать, что ты отказался от прерываний вообще?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Где то возникло недопонимание. Где я писал, что я вообще не использую прерывания? Писал про программные таймеры. Есть два варианта.
1 - Используется прерывание аппаратного таймера.
2 - Опрос флага прерывания аппаратного таймера.
В других прерываниях у меня минимальные действия. Стараюсь придерживаться этого правила.
ну да, получилось недопонимание.
вот ты писал, что у тебя программный таймер настроен на 1 мс. и еще ты писал, что из прерываний убрался вообще.
поэтому я спросил, как можно без прерываний точно отмерить 1 мс.
а оказалось, что у тебя аппаратный таймер отмеряет 1 мс, а не программный таймер.
ладно, разобрались с моим недопониманием.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Теперь понял, где недопонимание. Я стараюсь в прерываниях совершать минимальные действия. Это я имел в виду. Если проект, задача позволяет, максимум, что у меня было в прерываниях, это динамическая индикация.
//==================
#include "main_def_func.h" // Заголовочные файлы, глобальные определения, общие функции.
//==================
//==================
__C_task main (void)
{
static u08 cnt = 0;
init_soft_timers ();
Init_Events ();
wdt_enable (WDTO_15_MS); // Инициализаця сторожевого таймера. 16 мс.
__enable_interrupt (); // Глобальное разрешение прерываний.
while (!(char_dsp_init ()))
{
__watchdog_reset (); // Сброс сторожевого таймера.
}
while (1)
{
__watchdog_reset (); // Сброс сторожевого таймера.
switch (cnt)
{
case 0:
lcd_send_com (0x80);
cnt = 1;
break;
case 1:
lcd_send_data (0x30);
cnt = 2;
break;
case 2:
lcd_send_data (0x31);
cnt = 3;
break;
case 3:
lcd_send_data (0x32);
cnt = 4;
break;
case 4:
lcd_send_data (0x33);
cnt = 5;
break;
case 5:
lcd_send_data (0x34);
cnt = 6;
break;
case 6:
lcd_send_data (0x35);
cnt = 7;
break;
case 7:
lcd_send_data (0x36);
cnt = 8;
break;
case 8:
lcd_send_data (0x37);
cnt = 9;
break;
case 9:
lcd_send_data (0x38);
cnt = 10;
break;
case 10:
lcd_send_data (0x39);
cnt = 11;
break;
case 11:
lcd_send_data (0x30);
cnt = 12;
break;
case 12:
lcd_send_data (0x31);
cnt = 13;
break;
case 13:
lcd_send_data (0x32);
cnt = 14;
break;
case 14:
lcd_send_data (0x33);
cnt = 15;
break;
case 15:
lcd_send_data (0x34);
cnt = 16;
break;
case 16:
lcd_send_data (0x35);
cnt = 17;
break;
case 17:
lcd_send_data (0x36);
cnt = 18;
break;
case 18:
lcd_send_data (0x37);
cnt = 19;
break;
case 19:
lcd_send_data (0x38);
cnt = 20;
break;
case 20:
lcd_send_data (0x39);
cnt = 0;
break;
}
delay_us (40);
}
while (1)
{
__watchdog_reset (); // Сброс сторожевого таймера.
#ifdef __ST_NO_INTERRUPT__
proc_sys_tick ();
#endif
proc_device (); // Главный алгоритм программы.
info_service ();
drv_char_dsp ();
Process_Events ();
}
}
//==================
Дисплей 20х4. 4-битная шина. Я сделал так, отправка адреса 1 строки, потом заполнение строки. 20 символов. Между отправками примерно 50 us. Время от отправки адреса до отправки последнего символа заняло 1076 us.
Так как дело было давно, всех деталей я не запомнил. Признаю, время установки адреса, символа примерно соответствует даташиту. Чтобы наверняка, я чуток превысил времянки. Ногодрыг, установка адреса, строки. Почему я ошибочно запомнил, что между отправками адресов, символов время занимало больше, я сейчас уже не скажу. Но, как я писал раньше, так как у меня системный тик 1 мс, чтобы программные таймеры не врали, итерация основного цикла должна всегда выполняться с запасом. Пакетный вывод на дисплей занимает много времени, поэтому я раздробил вывод символов.
[uquote="Demiurg",url="/forum/viewtopic.php?p=4312172#p4312172"]...писал в лоб.[/uquote]
Один while(1); из которого не видно выхода, за ним другой while(1); Так задумано?
Версия 0.88. F_CPU = 8...16 МГц
Исправлен Watchdog c 500 мс на 2 с т.к. на частоте < 4 Гц контроллер сбрасывается до обновления частоты и было невозможно после этого поменять частоту.
Добавлены проекты в VS Code.
[uquote="Up2805",url="/forum/viewtopic.php?p=4279326#p4279326"]Ну раз уж так обсыкаться от возможности невозможного, тогда расскажите, почему не поставили конденсаторы параллельно кнопкам? По всем правилам они должны присутствовать для подавления случайных наводимых импульсов и для минимизации эффекта дребезга контактов кнопок.[/uquote]
Чиво?! О_о Дребезг кнопок спокойно обрабатывается программно.
Версия 0.89. F_CPU = 8...16 МГц
На низкой частоте вкл/выкл выхода работает более корректно (по заднему фронту импульса).
И длительность первого импульса после включения не обрезается.
Для тех, кто в танке: в архиве есть схема подключения LCD и энкодеров и прошивка hex. Версия с кнопками устаревшая.