Vizitator dr_p Postat August 16, 2012 Partajează Postat August 16, 2012 Salut! Am un LCD 8x2 pe baza de HD44780. E controlat de un 16F505 pe 4 biti+RS+E. Pinii RW, DB0-DB3 si V0(contrast) sunt la masa. Displayul se initializeaza corect, pot afisa caractere, pot timite comenzi. Problema e ca se initializeaza corect la fiecare al doilea restart. Programul e facut sa initieze LCD-ul apoi sa scrie "TEST". Prima pornire nu face nimic, la a doua pornire e totul ok, la a treia ramane cumva "TEST" pe ecran pe linia 1, dar in acelasi timp toata linia 1 e semi-neagra si cursorul nu e vizibil. Ca si cand nu s-ar fi initializat corect. A parta pornire e ok, si tot asa. Prin pornire ma refer la butonul de "Program device" din MPLAB. Codul sursa e in CCSC (din MPLAB) si din amintiri e cam asa:(e pe laptop si nu am acces acum la el) #include<16F505.h>#fuses NOMCRL(E?), NOPROTECT,NOWDT, INTRC_IO...// pe pin B5 este LCD_Enable, dar dau 255 in tot portul, ca-mi e mai simplu// pe pin C0-C3 sunt LCD_DB4-LCD_DB7// pe pin C4 este LCD_RSvoid main(){ delay_ms(50); //power on and wait for internal initialize to finish//prima jumatate din prima comanda(primul nibble)=0011 output_c(0b00011); //RS=0 + DB7-DB4 output_b(255); // LCD_Enable = 1->0 output_b(0); delay_us(50); //wait//a doua jumatate din prima comanda(al doilea nibble)=0100 output_c(0b00100); //RS=0 + DB7-DB4 output_b(255); // LCD_Enable = 1->0 output_b(0); delay_us(50); //wait...while (TRUE) {}}Nu am folosit functii, ca e prima tangenta cu LCD-uri si am vrut sa fac programul cat mai simplu si clar, ca sa pricep. Schema e simpla, PIC-ul, LCD-ul, 6 rezistori+LED-uri "martori" care mi-au folosit sa-mi confirme starea pinilor (cresteam delay-ul foarte mult sa am timp sa le vad aprinse) si un 0.1uF pe alimentare. Alimentarea (4.78V masurat) o ia din PicKit2 pe USB cu care se face si programarea. E posibil ca tensiunea data de PicKit2 sa urce la 3-4V, PIC-ul sa porneasca initializarea, dar LCD-ul nu e gata, deoarece nu a primit 4.5V inca? Si asta tot nu explica de ce fiecare a doua initializare merge OK. Am pus delay-ul initial, inainte de program si la 2000ms, si tot la fel face. E just ca nu citesc Busy Flag(la initializare nici nu as putea), dar ii dau delay destul. Nu stiu ce sa-i mai fac, poate s-a lovit cineva de situatia asta sau are vreo idee. Multumesc. Link spre comentariu
lama Postat August 17, 2012 Partajează Postat August 17, 2012 Salut.Nu spun ca asta e, dar la o chinezarie pe care am folosito(clona dupa 16x2) timpi pentru initializare sunt de 2 ori mai mari.Poate si la tine? Link spre comentariu
Liviu M Postat August 17, 2012 Partajează Postat August 17, 2012 Nu stiu exact cum e la modelul tau, da' la toate LCD-urile pe care le-am vazut eu pana acum (3-4, nu mai multe) comanda 0b00 0011 xxxx (RS RW DB7..DB0) inseamna interfata pe 8 biti. Varianta cu care am reusit sa dau de cap unui astfel de LCD a fost: LE Pinii de date pe care i-am folosit sunt RD7..RD4, de-aia la mine utili sunt bitii 7..4. Si acum vad, comentariul e neactualizat, in cod e bine, trebuie b'0010 1000'. void lcdInit(void){ unsigned char i;// Function set - comunicatie pe 4 biti => b'0010 0000' twice(?) ; LCD_PORT = 0x20; LCD_STROBE(); // first LCD_PORT = 0x80; // 4 biti LCD_STROBE(); DelayUs(DELAY); /*min 39us*/ // Function set - comunicatie pe 4 biti => b'0010 0000' twice(?) ; LCD_PORT = 0x20; LCD_STROBE(); // first LCD_PORT = 0x80; // 4 biti LCD_STROBE(); DelayUs(DELAY); /*min 39us*/// Display on, cursor off, blink off LCD_PORT = 0x00; LCD_STROBE(); LCD_PORT = 0xC0; LCD_STROBE(); DelayUs(DELAY); /*teoretic 39us*/// Clear all, cursor at home lcdClear(); // Write somthing on LCD to see if it works for(i=0;i<16;i++) lcdScrieChar('*'); lcdToPos(2,1); for(i=16;i<32;i++) lcdScrieChar('*'); DelayMs(200);} LE lcdClear() e void lcdClear(void){// should send RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0// 0 0 0 0 0 0 0 0 0 1// PIC pins RD0 RD1 RD7 RD6 RD5 RD4 RD7 RD6 RD5 RD4// in 2 steps// 1 RS RW DB7 DB6 DB5 DB4// 0 0 0 0 0 0// 2 RS RW DB3 DB2 DB1 DB0// 0 0 0 0 0 1 LCD_PORT = 0x00; // high nibble = 0 LCD_STROBE(); LCD_PORT = 0x10; // low nibble = 1 LCD_STROBE(); DelayMs(5);} iar lcdScrieChar() void lcdScrieChar(unsigned char c){ unsigned char nibble;// volatile unsigned char cPortD; // should send RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0// 1 0 c7 c6 c5 c4 c3 c2 c1 c0// PIC pins RD0 RD1 RD7 RD6 RD5 RD4 RD7 RD6 RD5 RD4// in 2 steps// 1 RS RW DB7 DB6 DB5 DB4// 1 0 c7 c6 c5 c4// 2 RS RW DB3 DB2 DB1 DB0// 1 0 c3 c2 c1 c0 LCD_PORT = 0x01; //RS = 1 nibble = c & 0xF0; //c7..c4 nibble |= 0x01; LCD_PORT = nibble; LCD_STROBE(); nibble = c & 0x0F; //c3..c0 nibble <<= 4; nibble |= 0x01; LCD_PORT = nibble; LCD_STROBE(); DelayUs(DELAY);} Probabil se pot scrie si mai bine/frumos/eficient, da' m-am oprit cand au functionat Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum