На главную           Статьи              Ссылки                Схемы                Форум               Все новости    


 

О недостатках в программах и их устранении



В прошивке часов-будильника на PIC16F628A , опубликованных по приведённым ниже ссылкам:
http://www.radiokot.ru/circuit/digital/home/11/
http://www.telesys.ru/electronics/projects.php?do=p139
было устранено подсвечивание выключенных сегментов индикаторов.

Выглядит это подсвечивание вот таким образом:
 Подсвечивание сегментов
Причина в том, что при переключении разрядов в программе динамической индикации(переключение идёт слева направо) транзистор разряда, выводимого на индикацию не успевал закрываться. Часть времени(несколько микросекунд)  цифра следующего разряда отображалась в разряде предыдущем. Заметен этот недостаток на импортных ярких индикаторах.
Исправленная прошивка здесь

Товарищ dosikus провёл более детальное исследование по поводу подсвечивания тех сегментов, которые должны бы быть совсем наоборот - выключены. Размещаю здесь его заметку.
 
Заметка от Dosikus

Когда то сам попал на это, но спасибо ПРОТЕУСУ, путем детального разбора графов удалось решить проблему.

Рассмотрим фрагмент кода: 

.................... //--------------------------------------------------------------

.................... //       display
.................... //--------------------------------------------------------------
....................  PORT_B=0XFF;
0048:  MOVLW  FF
0049:  MOVWF  06         //Гасим сегменты
....................  PORT_A=prevscan;
004A:  MOVF   2F,W
004B:  MOVWF  05        //Смена разрядов, точка 1
....................   
....................   
....................  switch (prevscan&0x0f)
....................   {
004C:  MOVF   2F,W
004D:  ANDLW  0F
004E:  XORLW  0E
004F:  BTFSC  03.2
0050:  GOTO   05B
0051:  XORLW  03
0052:  BTFSC  03.2
0053:  GOTO   05E
0054:  XORLW  06
0055:  BTFSC  03.2
0056:  GOTO   061
0057:  XORLW  0C
0058:  BTFSC  03.2
0059:  GOTO   064
005A:  GOTO   067
....................   case 0x0e:PORT_B=disp_dig[0];break;
005B:  MOVF   30,W
005C:  MOVWF  06       //Точка 2 смена данных
005D:  GOTO   067
....................   case 0x0d:PORT_B=disp_dig[1];break;
005E:  MOVF   31,W
005F:  MOVWF  06       //Точка 2 смена данных
0060:  GOTO   067
....................   case 0x0b:PORT_B=disp_dig[2];break;
0061:  MOVF   32,W
0062:  MOVWF  06       //Точка 2 смена данных
0063:  GOTO   067
....................   case 0x07:PORT_B=disp_dig[3];break;
0064:  MOVF   33,W
0065:  MOVWF  06       //Точка 2 смена данных
0066:  GOTO   067
....................   }
....................  rotate_left(&prevscan,1);
0067:  RLF    2F,W
0068:  RLF    2F,F
.................... 

Скриншот с подсвечиванием

Как видно из кода и скриншота после переключения разряда некоторое время присутствуют данные сегментов предыдущего разряда , что вызывает подсветку неиспользуемых сегментов.Это присутствие обусловленно отнюдь не инерцией транзисторов ,а куском кода исполняемым между точками 1 и 2.
Именно поэтому нужно либо гасить сегменты перед сменой разрядов либо запирать разряды на время смены данных на сегментах (что автор и сделал).

Скриншот без глюка




















Rambler's Top100