Sari la conținut
ELFORUM - Forumul electronistilor

Probleme LCD controlat de PIC16F505


Vizitator dr_p

Postări Recomandate

Vizitator dr_p

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
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    1

  • lama

    1

Top autori în acest subiect

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări