www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

LPC2148 in LCD 4x20

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Hi-End
Član
Član



Pridružen-a: Sre 25 Feb 2004 11:51
Prispevkov: 284
Aktiv.: 1.20
Kraj: Višnja Gora

PrispevekObjavljeno: Pet Jun 29, 2007 9:18 am    Naslov sporočila:  LPC2148 in LCD 4x20 Odgovori s citatom

Včeraj popoldne sem se nekaj igral in poizkusil napisati enostavni gonilnik za LCD 4x20 znakov. Kot že zgoraj omenjeno, sem ga priključil na LPC2148 in sicer na Keilovo MCB2140. Uporabil sem GPIO-je od P1.16 do P1.22, ter za napajanje vzel kar USB napetost +5V. Vezal sem ga tako, da uporabljam 4 bitni način naslavljanja (DB4-DB7), ter da krmilim signale R/W, RS in EN. Pri pisanju sem si pomagal z raznimi gonilniki, ki sem jih našel na internetu. Seveda pa mi LCD ne deluje tako kot bi moral. Če LCD ni priključen na MCU, potem polno svetijo vsi elementi v prvi in tretji vrstici. Če ga priključim na MCU in poženem inicializacijo, potem se LCD popolnoma počisti, kar naj bi naredila tudi inicializacijska funkcija. Ko pa vpišem katero drugo od komand, npr. naj prikaže kurzor, ali pa ko hočem kaj izpisati na LCD se ne zgodi nič. Razlogov je več, zdaj pa ne vem katerega naj prvo eliminiram.

LCD je starejšega datuma, a je nerabljen in mislim da povsem brezhiben. Možen problem je v tem, da je I/O LPC-ja 3.3V in da LCD-ju to ne ustreza, čeprav je borisz nekje napisal, da to njemu deluje tudi tako. Razmišljam, da bi vezal pull-up upore na +5V na vseh podatkovnih in krmilnih linijah. Ne vem pa kaj naj naredim z preostalimi štirim podatkovnimi linijami (D0-D). Naj jih pustim v zraku, ali jih vežem preko uporov na GND ali +5V?

LCD ima vgrajen HD44780A00 kontroler. Prvi del oznake kaže na standardni kontroler, kaj pomeni suffix A00 pa ne vem. Tudi datasheet-a, takole na hitro nisem uspel najti. Ga morda kdo od vas ima?

Kako je z timing-i posameznih signalov, predvsem EN in RW? So le ti problematični. Jaz sem po vsakem preklop naredil pavzo 1ms. Je to preveč? Imam revijo Practical Electronics, kjer je razloženo delovanje LCD-ja, ter prikazano testno vezje, zloženo na protobordu, ker posamezna stanja nastavljajo z stikali, za EN pa uporabljajo tipkalo, kar pomeni da timing-i po moje niso problem.

Kako je z inicializacijo in kakšen je postopek inicializacije? Bral sem, da je dobro, da se ob vklopu napajanja počaka nekaj 10ms, tipično 35ms, predno se začne z pisanjem komand. To sem tudi naredil. Potem sem poslal dol komadno za preklop v 4-bit mode, ter še nekaj ostalega. Se pravi 0x28 in sicer prvo 0x2, potem pa še 0x8. Potem pa še ostale komande, za brisanje zaslona, za postavitev na začetek.

Še najbolj čudno se mi zdi to, da se display pobriše. Ali je to naključno, ali pa nekaj za silo deluje.

Morda kakšen namig?

Mogoče za začetek pripnem še WriteCommand funkcijo, ki je sicer narejena precej neoptimalno.


Koda:
void LCD_WriteCommand(char command)
{
   char firstVal = FirstNibble(command);
   char lastVal = LastNibble(command);

   // nastavimo vse izhodne signale na 0
   LCDPORTCLR |= (RS | RW |EN );   // RS=0, R/W=0, E=0   

   //outport(LCD_CONTROL_ADDRESS,0x02);   // RS=0, R/W=0, E=1
   LCDPORTSET |= EN;   
   Delay(1);
   
   // posljemo polovico komande na port      
   if((firstVal & 0x01) == 1)
      LCDPORTSET |= D4;
   else
      LCDPORTCLR |= D4;

   if((firstVal & 0x02) == 2)
      LCDPORTSET |= D5;
   else
      LCDPORTCLR |= D5;

   if((firstVal & 0x04) == 4)
      LCDPORTSET |= D6;
   else
      LCDPORTCLR |= D6;

   if((firstVal & 0x08) == 8)
      LCDPORTSET |= D7;
   else
      LCDPORTCLR |= D7;

   //outport(LCD_CONTROL_ADDRESS,0x03);   // RS=0, R/W=0, E=0
   LCDPORTCLR |= EN;
   Delay(1);

   //outport(LCD_CONTROL_ADDRESS,0x02);   // RS=0, R/W=0, E=1
   LCDPORTSET |= EN;   
   Delay(1);

   // posljemo se drugo polovico komande na port      
   if((lastVal & 0x01) == 1)
      LCDPORTSET |= D4;
   else
      LCDPORTCLR |= D4;

   if((lastVal & 0x02) == 2)
      LCDPORTSET |= D5;
   else
      LCDPORTCLR |= D5;

   if((lastVal & 0x04) == 4)
      LCDPORTSET |= D6;
   else
      LCDPORTCLR |= D6;

   if((lastVal & 0x08) == 8)
      LCDPORTSET |= D7;
   else
      LCDPORTCLR |= D7;

   //outport(LCD_CONTROL_ADDRESS,0x03);   // RS=0, R/W=0, E=0
   LCDPORTCLR |= EN;
   Delay(1);
   
   //outport(LCD_CONTROL_ADDRESS,0x01);   // RS=0, R/W=1, E=0
   LCDPORTSET |= RW;

   Delay(10);
}

_________________
Music is a part of my life, DIY is my life !
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70692.54

PrispevekObjavljeno: Pet Jun 29, 2007 9:48 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Hi-End
Član
Član



Pridružen-a: Sre 25 Feb 2004 11:51
Prispevkov: 284
Aktiv.: 1.20
Kraj: Višnja Gora

PrispevekObjavljeno: Pet Jun 29, 2007 10:20 am    Naslov sporočila:   Odgovori s citatom

Sem že mislil da sem jaz na hitro napisal kodo, pa vidim da je ta na tem linku še precej bolj na hitro je pa res da verjetno dela. Našel sem že eno napako in sicer RS signala pri pošiljanju podatkov nisem postavil na 1, kar je gotovo razlog, da podatki ne gredo na LCD. To je pa tako če to pišeš ob polnoči Wink Bom poizkusil danes zvečer, ali bo sedaj šlo. Je pa res, da mi tudi komande ne delujejo tako kot bi morale, saj mi komanda za vklop kurzorja prav tako ne deluje. Čudne reči se dogajajo. Pri vsem tem je najbolj problematično to, da človek ne ve ali je hardware brezhiben (oziroma so potenciali OK), ali je problem v kodi. Lahko popravljam kodo kolikor hočem, pa če mi logični nivoji ne špilajo, bom samo čas zapravljal.

Sem pa vzel tole literaturo in pogledal če je še kaj na tem.
http://home.iae.nl/users/pouweha/lcd/lcd0.shtml

_________________
Music is a part of my life, DIY is my life !
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Hi-End
Član
Član



Pridružen-a: Sre 25 Feb 2004 11:51
Prispevkov: 284
Aktiv.: 1.20
Kraj: Višnja Gora

PrispevekObjavljeno: Pet Jun 29, 2007 9:23 pm    Naslov sporočila:   Odgovori s citatom

Pa mi je le uspelo oživiti LCD da mi je izpisal prve znake. Razlogov je več, med drugim tudi ta, da me je zafrkaval RW signal, ki sem ga postavil na 0 in ga ne preklapljam, kot sem to videl pri enem v kodi. Drugo pa je, da sem na vse povezane linije dal 10K pull-up upore, ter na D0-D3 10K pull-down upore. Sploh ne bi opazil da je kaj narobe, vendar sem šel meriti napetost na D0-D3, ki je bila 1.1V, morala pa bi biti 0, zato sem pomislil, da do nastavljeni kot izhod in s pomočjo R/W signala so res bili. Zdaj se lahko lotim čiščenja in dokončne implementacije gonilnika Wink
_________________
Music is a part of my life, DIY is my life !
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 2 dni


Powered by phpBB © 2001, 2005 phpBB Group