| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| MSP430 с LCD матричен дисплей AC161AYA http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=14526 |
Страница 1 от 2 |
| Автор: | Simurai [ Нед Апр 24, 2016 5:30 pm ] |
| Заглавие: | MSP430 с LCD матричен дисплей AC161AYA |
Здравейте, Мъча да подкарам гореспоменатия дисплей с MSP430G2553, но нещо не ми се получава. Ще се радвам, ако някой си е играл с подобен род диспеи, да помогне. Дисплеят е захранен с 3.3V. Понеже самият дисплей изисква потенциална разлика от около 5V, чрез DC-DC преобразувател подавам -3.3V към пин Vo (Contrast Adjustment). R/W e вързан към GND (т.е. искам само да пиша, няма да чета от паметта на дисплея). Ето как всичко е навързано: Vss - GND Vdd - 3.3V Vo - -3.3V R/S - P2.0 R/W - GND E (Enable) - P2.1 DB0 до DB7 на дисплея са вързани към Порт 1 на MSP-то, от P1.0 до P1.7. Дейташийтът на самия LCD може да се намери тук: https://store.comet.bg/download-file.php?id=293 Вътре е даден initialization sequence, която явно не успявам да изпълня. Когато подам захранване, всички точки от дисплея са запълнени. Интересното е, че частта Function Set явно има ефект, защото ако подам 0x30 (1 line mode), запълва само втората половина от символните блокове, докато първата остава празна. Ако подам 0x38, заплънени са всички. Иначе долният код би трябвало да направи следното - 2 line mode, display on, cursor off, blink off, display clear, increment on, entire shift off във lcd_init();. След което във void write_lcd() опитвам да пратя адрес 00 в DDRAM и да подам на него символ нула (0). Дисплеят обаче не реагира, всички символни блокове остават запълнени. Ето как изглежда: http://postimg.org/image/5a0b8zy53/ #include <msp430g2553.h> void lcd_init(); void write_lcd(); void delay_us(int count); int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer P1DIR = 0xFF; //Port 1 Outputs P1OUT = 0x00; //Set PORT0 = 0 P2DIR |= BIT0 + BIT1 + BIT2; //BIT0 = RS; BIT1 = Enable P2OUT &= ~BIT2; BCSCTL1 = CALBC1_8MHZ; // Set DCO DCOCTL = CALDCO_8MHZ; UCB0CTL1 |= UCSWRST; //Enable SW reset UCB0CTL1 = UCSSEL_2 + UCSWRST; //Use SMCLK, keep SW reset UCB0BR0 = 80; //fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; //Clear SW reset, resume operation lcd_init(); write_lcd(); } void lcd_init() { /*Function Set*/ __delay_cycles(350000); //delay > 40ms P2OUT &= ~BIT0; //RS = 0 - Instruction set __delay_cycles(2); // delay 250ns P1OUT = 0x38; //DB0 - DB7 __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms /*Display ON/OFF*/ __delay_cycles(2); // delay 250ns P1OUT = 0x0C; //DB0 - DB7 __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms /*Display Clear*/ __delay_cycles(2); // delay 250ns P1OUT = 0x01; //DB0 - DB7 __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(20000); //delay > 2ms (0.5 + 1.5ms) /*Entry Mode Set*/ __delay_cycles(2); // delay 250ns P1OUT = 0x01; //DB0 - DB7 __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms P2OUT |= BIT2; } void write_lcd() { P2OUT &= ~BIT0; //RS = 0 - Instruction set __delay_cycles(2); // delay 250ns P1OUT = 0x80; //Set address DDRAM __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms P2OUT |= BIT0; //RS = 1 - Data set __delay_cycles(2); // delay 250ns P1OUT = 0x30; //Write char __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT2; } |
|
| Автор: | stefan63 [ Нед Апр 24, 2016 9:07 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Доколкото се ориентирам в Си-то, изглежда ми погрешен начина по който манипулираш порт2 - сякаш RS сигнала заема неподходящи стойности , нулираш го, но в последващи инструкции по енейбъла сякаш RS става единица, без да си го указал в коментар. Та товами изглежда подозрително. На тоя етап Vo трябва да е през потенциометър , дори да ти е перфектен кодът- неподходящо напрежение нама да ти позволи да видиш нищо. |
|
| Автор: | stefan63 [ Нед Апр 24, 2016 9:12 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Май не съм прав за RS сигнала. Сложи потенциометър. Потърси в код за инициализация на HD4470 - твоят ми изглежда твърде къс - обикноввено има няколко команди за ресет една след друга - с паузи от 50-на милисекунди между тях. |
|
| Автор: | stefan63 [ Нед Апр 24, 2016 9:16 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Е, само те обърквам, той и лцд контролерът е някакъв, разлличен от 4470 |
|
| Автор: | Simurai [ Нед Апр 24, 2016 10:39 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Да, контролерът е друг, а неговият дейташийт е по-скромен дори и от този на цялото LCD. Изглежда, че хваща първата инструкция и след това нищо. Иначе си прав за потензиометъра - в момента контрастът ми е такъв, че едва забелязах, че при различни стойности в Function Set, първите 8 символни блока всъщност не светят. Но под ъгъл се вижда ясно кои светят и кои не. Проблемът изглежда е в кода, но не разбирам къде, принципно спазвам всички паузи между сигналите. Мисля да пробвам да клатя и R/W пина - в момента е вързан към GND. Благодаря за интереса и идеите. |
|
| Автор: | stefan63 [ Нед Апр 24, 2016 11:24 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Две забележки - спред чаршафа E сигналът трябва да е около 1 микросек активен, ти го задържаш половин милисекунда, което е излишно. - в началото порт 1 се установява в 0, порт 2 ти е P2OUT &= ~BIT2, което май е вдигнатив 1 сигнали RS и E; Тоест вече изпълняваш някаква команда за запис на данни. Може би трябва да сложиш някакви резистори към маса (на Е)и захранване за останалите, докато потегли твоят контролер. Отделно първата инструкция я повтори няколко пъти през някаква пауза от 5-6 милисек . |
|
| Автор: | ike [ Нед Апр 24, 2016 11:49 pm ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
MSP430 тръгва още от 1.8 волта а дисплея много по-късно, чак когато напрежението стане над 3 волта сложи след WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer пауза от 1-2 секунди. Можеш да захраниш 5.0 LCD направо с 3.6В без DC/DC ако е от послените китайски дисплеи за $1.5: http://forum.43oh.com/topic/2637-36v-lc ... 0-for-231/ Можеш да пробваш това: http://forum.43oh.com/topic/1296-serial-fun/ само внимавай, че е за друг контролер и може би ще трябва да промениш малко нещата. |
|
| Автор: | Simurai [ Пон Апр 25, 2016 12:52 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Блъснах здрав delay преди въобще да тръгна да пращам към LCD, но резултатът е същият. Ето тази част минава, но след нея нищо: /*Function Set*/ __delay_cycles(350000); //delay > 40ms P2OUT &= ~BIT0; //RS = 0 - Instruction set __delay_cycles(2); // delay 250ns P1OUT = 0x38; //DB0 - DB7 __delay_cycles(2); // delay 250ns P2OUT |= BIT1; //Enable = 1 __delay_cycles(5000); //delay > 0.5ms P2OUT &= ~BIT1; //Enable = 0 __delay_cycles(5000); //delay > 0.5ms |
|
| Автор: | stefan63 [ Пон Апр 25, 2016 7:06 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Това, което Ike ти обясни е : При включване на захранването - то се покачва с някаква скорост , не мигновено. От момента , в който напрежението достигне около 2В - МСП430 тръгва , а ЛЦД то не е захранено добре . Едното решение е чип ресет 3Волта, който да не пуска МСП430 преди да е достигнато раб напрежение на системата. Второто решение е някакво разумно закъснение - 1-2 сек на тоя етап - между тръгване на процесора и ЛЦД_инит процедурата. 40 милисек може да е малко. Процесорът ти може да има и други опции. Всъщност защо си забил RW твърдо? |
|
| Автор: | Simurai [ Пон Апр 25, 2016 10:21 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
R/W е към GND, защото нямам намерение да чета от паметта на LCD-то, само ще пиша т.е. ще ползвам само тази му функция. Иначе би могло да се ползва за даннова памет, но просто за моя проект това не е необходимо. Опитах и да го вържа на I/O pin и да го клатя, но резултатът е същият. Иначе разбирам какво имаше предвид Ike и добавих съответния delay преди въобще да се обърна към LCD-то, за да съм сигурен, че работното напрежение достига необходимите стойности. Проблемът, с който се сблъсквам е, че частта Function set в функцията lcd_init() минава, но след нея - нищо. Т.е. ако сменя Function set на 0x30 (1 line mode), виждам как само последните 8 символа тръгват, докато ако го сменя на 0x38 (2 line mode) и презапиша процесора, виждам как всички 16 символа светват. След това обаче следва Display ON, Display Clear и Entry Mode Set, които не минават. |
|
| Автор: | ike [ Пон Апр 25, 2016 10:26 am ] | |||||||||
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA | |||||||||
А пробва ли това от примера
това е за 4 битово управление @ 1MHz. |
||||||||||
| Автор: | Simurai [ Пон Апр 25, 2016 10:37 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Дава ми някои идеи, ще пробвам като се прибера от работа. Благодаря! От къде го намери това? |
|
| Автор: | ike [ Пон Апр 25, 2016 11:31 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Пейснато е от тук: http://forum.43oh.com/topic/1296-serial-fun/ |
|
| Автор: | Simurai [ Вто Апр 26, 2016 2:43 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
Подкарах го, проблемът се оказа хардуерен - трябваше по-голямо съпротивление между Vo и -3.3V, при около 15к символите се виждат ясно. Благодаря за проявения интерес. |
|
| Автор: | stefan63 [ Вто Апр 26, 2016 8:15 am ] |
| Заглавие: | Re: MSP430 с LCD матричен дисплей AC161AYA |
А пробва ли Vo направо на маса или с потенциометър някакво напрежение между +3 и 0волта? Да не се окаже ,че изобщо не ти трябва ДЦДЦ. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|