Мерцает LCD SBLCDA4 на MSP430?

Как уже понятно их сабжа, у меня некоторые проблемы с наладкой дисплея на MSP430. Этот дисплей, SBLCDA4, используется в отладочной плате MSP-EXP430FG4618, правда МК у меня MSP430F4784. Как раз именно по схеме данной отладочной платы я и собрал схему для своего проекта, но, к несчастью, дисплей довольно таки ощутимо мерцает:
MVI_0081-1.gif

Когда все это у меня висело на проводах, я списывал подобные глюки на наводки, да и времени не было уже с этим разбираться, нужно было как можно быстрее заказывать платы. И вот они пришли, но проблема не исправилась. Пробовал массу прошивок, и естественно, примеры от TI подготовленные точно к этому дисплею.

Вот этот код должен был бы зажечь все сегменты дисплея:
#include "msp430.h"
void main(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD;                               
FLL_CTL0 |= XCAP10PF;                                   
LCDACTL = LCDON + LCD4MUX + LCDFREQ_128;
LCDAPCTL0 = LCDS0+LCDS4+LCDS8+LCDS12+LCDS16+LCDS20;
P5SEL = BIT2+BIT3+BIT4;                         
for( i = 0; i < 11; i ++)
{
         LCDMEM[i] = 0xFF;                                              
}

_BIS_SR(LPM3_bits);                                     
}


Он их конечно зажигает, но без должной скорости, создавая мерцания как на анимации выше.

После нескольких тщетных попыток что либо сделать с программной стороны, я решил посмотреть что находится на ногах дисплея. Ткнул осциллограф на ногу COM3:
3d067245f1f487cb0348c6681cb193f3.jpg

Выглядит не очень правильно. И вновь я начал изучать схему тестовой платы, и приметил один конденсатор на 10uF, который ставится на ногу LCDCAP. Так как керамики такого номинала нет, то пришлось ткнуть туда электролитический. Результат не заставил себя ждать:
ae3c64f01fde0c95f4660fcedace696f.jpg

На осциллографе, конечно, видно изменения, но вот на дисплее изменения не очень заметны. Все так же мерцает… Подскажите, пожалуйста, что же можно с этим поделать…

UPD: Снял показатели с двух ножек. COM3[Желтый] и COM2[Синий]
7c472465e2e678623e788550cba481f5.jpg
UDP2:Кстати. В документации приведена осциллограмма нужного режима. Похоже на то, что я на данный момент имею
ad41a2f84aa99bed6c2101eb11fe962e.png

UDP3: В результате долгих подборов, все же было выявлено необходимое кол-во сегментов которые должны были бы быть задействованы в проекте. С этим набором ничего не мерцает. Поэтому было решено так это и оставить
  • Вопрос задан
  • 5032 просмотра
Решения вопроса 1
@nerudo
Я может чего-то не понимаю, но com0 вроде как цифровой сигнал выбора и должен пребывать в состоянии либо нуля либо единицы. У вас же на нем как минимум 4 разных уровня (очень красивых, что странно). Может с этого надо начать. Хотя я могу и ошибаться, т.к. никогда с подобными индикаторами не работал, а даташит какой-то совсем никакой…
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@PM1630
Ни разу не сталкивался.
Возможно глупое предположение…

Но судя по этому
Board.h:
#define LCD_TEST 1 // Set to 1 to include LCD test functions

и этому LCD.h
#if LCD_TEST > 0 extern void testAll(void); extern void testSymbol(void); extern void testArrow(void); extern void testFunc(void); extern void testBatt(void); extern void testSigLvl(void); extern void testPwrLvl(void); extern void testSpecialChar(void); extern void testChar(void); #endif // LCD_TEST

По умолчанию там похоже тест запускается, который всеми элементами индикатора моргает.
И что-то очень похожее мне видится на видео…
Не? LCD_TEST в нуле?
Ответ написан
@PM1630
Может попробовать в
LCDACTL = LCDON + LCD4MUX + LCDFREQ_128;
еще LCDSON воткнуть?
В мануале на микроконтроллер (стр. 298) пишут, что он отвечает за мигание, и все биты памяти с ним по AND работают.
И когда он в 0 (как в нашем случае) — все сегменты выключены.
Хотя я признаться не совсем понял как связаны мигание и выключенные/включенные сегменты.

Просто вероятность проблемы с отдельными сегментами IMHO не особо высока.
Соответственно копать предположительно стоит в области общих регистров.
А вообще в таких случаях можно еще например инкрементировать LCDACTL от 0 до FF каждые 10 секунд например — с расчетом, что какое-нибудь значение эту железяку удовлетворит :)
Хотя метод конечно варварский.
Ответ написан
@PM1630
Тогда в голову приходит только удалить включение низкого потребления — _BIS_SR(LPM3_bits) и вообще всё, оставив только голый индикатор.
Но это, как я понимаю, по всей видимости уже проверялось…
Ответ написан
Комментировать
@PM1630
Кстати, если основная программа выполняется в цикле (как это свойственно контроллерам) — возможно имеет смысл ввести какой-нибудь флаг, для однократного вывода на экран.

Вроде:
if (WriteOk == 0 ) then {
собственно вывод
WriteOk = 1;
}

Иначе возможно запись повторяется каждый цикл.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы