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 

Inicializacija LCD displaya
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
denis18
Neznanec
Neznanec



Pridružen-a: Pet 24 Maj 2013 16:26
Prispevkov: 6
Aktiv.: 0.05
Kraj: Celje

PrispevekObjavljeno: Pet Maj 24, 2013 5:12 pm    Naslov sporočila:  Inicializacija LCD displaya Odgovori s citatom

Zdravo!
Napisal sem program, ki inicializira display in izpiše nekaj črk, vendar ne deluje.
Kontrast na LCD je vredu. Uporabljam pa LCD DEM 16212 SYH-LY ver.2 in Atmega32. Prosim, če mi lahko poveste kaj je narobe.

To je pa koda:
Koda:


//Zaglavje
#define F_CPU 4000000UL

#include <avr/io.h>
#include <util/delay.h>




#define   LCD_DATAP    PORTA            //Podatkovni pini
#define LCD_DATAD   DDRA            //Registri za podatkovne pine
#define LCD_CTRLP   PORTB            //Kontrolni pini
#define LCD_CTRLD   DDRB            //Registri za kontrolne pine
#define   RS         0               //RS---1->podatki---0->komande               
#define   RW         1               //RW--read->1---write->0                        
#define E         2                 //E, ko pošiljamo->1, za procesiranje->0         


/*
#define LCD_CLR            0x01
#define LCD_HOME         0x03
#define LCD_ENTRY_MODE      0x06
#define LCD_ON            0x0C
#define LCD_OFF            0x08
#define LCD_FUNCTION_SET   0x38
*/


void Lcd_Init(void);               //Inicializacija LCD
void Check_Busy(void);               //Preveri, če je LCD zaseden
void Enable_On_Off(void);            //postavi E na 1, nato pa nazaj  na 0         
void Send_A_Command(unsigned char command);      //Pošlje komando
void Send_A_Character(unsigned char character);   //Pošlje črko

      
//Začetek glavne zanke
void main(void){
   

   Lcd_Init();
   Send_A_Character(0x44);  //Črka "D"
   Send_A_Character(0x65);  //Črka "e"
   Send_A_Character(0x6E);  //Črka "n"
   Send_A_Character(0x69);  //Črka "i"
   Send_A_Character(0x73);  //Črka "s"
}      
      
void Lcd_Init(void){
   
   LCD_CTRLP = 0x00;               //Pini so low=0V
   LCD_CTRLD |= 1<<RS | 1<<RW | 1<<E;   //Pini so izhodi
   LCD_DATAP = 0x00;               //Pini so low = 0V
   LCD_DATAD = 0xFF;               //Pini so izhodi
   
   _delay_ms(60);
   
   Send_A_Command(0x38);   //FUNCTION SET-->2-line, 5x7 dots
   _delay_us(80);
   Send_A_Command(0x0E);   //DISP. ON/OFF CONTROL-->disp. on, cursor on, blink off
   _delay_us(80);
   Send_A_Command(0x01);   //DISPLAY CLEAR
   _delay_ms(3);
   Send_A_Command(0x06);   //ENTRY MODE SET-->increment right, shift off

}

void Check_Busy(void){

   LCD_CTRLD = 0;
   
   LCD_CTRLP |= 1<<RW;
   LCD_CTRLP &= ~1<<RS;
   LCD_CTRLP |= 1<<E;
   
   while(LCD_DATAP >= 0x80){//0b10000000--0x80
      Enable_On_Off();
   }
   LCD_CTRLD = 0xFF; //0b11111111   
}

void Enable_On_Off(){
   
   LCD_CTRLP |= 1<<E;
   asm volatile ("nop");
   asm volatile ("nop");
   LCD_CTRLP &= ~1<<E;   
}

void Send_A_Command(unsigned char command){
   
   Check_Busy();
   LCD_DATAP = command;
   LCD_CTRLP &= ~( 1<<RW | 1<<RS );
   Enable_On_Off();
   LCD_DATAP = 0;
}
void Send_A_Character(unsigned char character){

   Check_Busy();
   LCD_DATAP = character;
   LCD_CTRLP &= ~( 1<<RW );
   LCD_CTRLP |= 1<<RS;
   Enable_On_Off();
   LCD_DATAP = 0;   
}



Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.62

PrispevekObjavljeno: Pet Maj 24, 2013 5:24 pm    Naslov sporočila:   Odgovori s citatom

Poskusi najprej z drugim displayem. Mislim drugim modelom. Namreč ta tvoj ima nek kontroler, ki naj bi bil HD44780 kompatibilen, vendar se ponavadi izkaže, da je v detajlih hudič.
Preberi tudi datasheet LCDja in preveri, če se tvoja inicializacija pokriva z zahtevami za ta display.

Kaj se ti prikaže na ekranu? V prvi vrsti kvadratki?

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
denis18
Neznanec
Neznanec



Pridružen-a: Pet 24 Maj 2013 16:26
Prispevkov: 6
Aktiv.: 0.05
Kraj: Celje

PrispevekObjavljeno: Pet Maj 24, 2013 7:02 pm    Naslov sporočila:   Odgovori s citatom

Drugega LCDja trenutno nimam.
Inicializacijo sem naredil tako, kot piše v datasheetu, tako da bi mogla biti pravilna.
Če preizkusim simulacijo v Proteusu, mi pokaže na prvem mestu na LCD črtico(-), če pa na ploščici pa imam črne kvadratke.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Pet Maj 24, 2013 7:55 pm    Naslov sporočila:  Re: Inicializacija LCD displaya Odgovori s citatom

denis18 je napisal/a:
Koda:
#define LCD_DATAD   DDRA            //Registri za podatkovne pine
#define LCD_CTRLD   DDRB            //Registri za kontrolne pine

Si nastavil smer v DDRx in začetne vrednosti PORTx ?

Edit:
Moja napaka, sem iskal DDRB, namesto LCD_CTRLD.

Imaš vključeno optimizacijo ? Brez tega delay.h ne deluje prav.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.62

PrispevekObjavljeno: Pet Maj 24, 2013 8:10 pm    Naslov sporočila:   Odgovori s citatom

Če imaš na LCDju črne kvadratke, pomeni, da nisi pravilno izvedel inicializacije LCDja. Poskusi se poigrati s timingi. Navadno, če časovna baza ni dobra, zna delovanje nagajati. Seveda, kot je že int47 namignil, tudi preveri, da imaš vse I/O pravilno priklopljene in skonfigurirane.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
denis18
Neznanec
Neznanec



Pridružen-a: Pet 24 Maj 2013 16:26
Prispevkov: 6
Aktiv.: 0.05
Kraj: Celje

PrispevekObjavljeno: Pet Maj 24, 2013 8:11 pm    Naslov sporočila:   Odgovori s citatom

@int47:Kakšno optimizacijo misliš?

@matjazkariz: S timingi sem že poizkušal, vendar brez uspeha. Bom preveril še vse enkrat.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.62

PrispevekObjavljeno: Pet Maj 24, 2013 8:21 pm    Naslov sporočila:   Odgovori s citatom

Če uporabljaš AVRStudio, imaš pod Project -> Configuration Options -> zavihek General opcijo (drop down lista) za nastavitev optimizacije. Na podlagi te nastavitve prevajalnik različno intenzivno optimira končno sliko programa. Tako se navadno zgodi, da umetno narejene zakasnitve razpozna kot odvečno kodo in jih v procesu optimizacije izloči.
_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Pet Maj 24, 2013 8:23 pm    Naslov sporočila:   Odgovori s citatom

Če uporabljaš AVR Studio z WinAvr, so nastavitve v Project -> Configuration Options. "Optimization" nastavi na karkoli razen "-O0".
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
denis18
Neznanec
Neznanec



Pridružen-a: Pet 24 Maj 2013 16:26
Prispevkov: 6
Aktiv.: 0.05
Kraj: Celje

PrispevekObjavljeno: Pet Maj 24, 2013 8:27 pm    Naslov sporočila:   Odgovori s citatom

Optimizacija je nastavljena na -Os.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
denis18
Neznanec
Neznanec



Pridružen-a: Pet 24 Maj 2013 16:26
Prispevkov: 6
Aktiv.: 0.05
Kraj: Celje

PrispevekObjavljeno: Ned Jun 02, 2013 12:42 pm    Naslov sporočila:   Odgovori s citatom

Še ima kdo kakšno idejo, kaj bi bilo narobe, ker jaz res ne vem kaj bi lahko bilo?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
HeBird
Član
Član



Pridružen-a: Ned 16 Avg 2009 16:36
Prispevkov: 79
Aktiv.: 0.44
Kraj: Domžale

PrispevekObjavljeno: Pon Jun 03, 2013 12:20 pm    Naslov sporočila:   Odgovori s citatom

Jaz sem imel hude težave z LCD na začetku, dokler mi ni kolega pokazal, da sem potenciometer narobe vezal. V vrsticah sem imel črne kvadratke, kontrast je pa sicer delal.

Tako da, preveri, če imaš E, RS, maso in napajanje pravilno s potenciometrom povezano.

_________________
Gašper
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
S53DZ
Član
Član



Pridružen-a: Čet 28 Apr 2011 9:27
Prispevkov: 951
Aktiv.: 6.05
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jun 03, 2013 3:22 pm    Naslov sporočila:   Odgovori s citatom

Pravijo, da je pri LCD-jih dobra praksa inicializacije tale:

1. po pwr restartu čakati vsaj 100ms, da napajanje naraste nad 4,5V (če je LCD za 5V)
2. 3 x ponoviti vpis 0x30 z zakasnitvijo 15us med njimi in brez čekiranja busy bita!
3. vpisati 0x38 (8bit) ali 0x28 (4bit data)
4. nato pa 0x08 (display off), 0x01 (clr), 0x06 (incr.add.) in na primer 0x0c (display on)

EDIT: Meni se tako zaporedje izide za 3V in 5V LCD-je.
je pa res, da so nekateri LCD-ji nezanesljivi in ni nujno, da tisti najcenejši.
Ponavadi so nezanesljivi zaradi pomanjkanja pravih datasheet-ov zanje.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pon Jun 03, 2013 9:32 pm    Naslov sporočila:   Odgovori s citatom

Poglej si TALE tutorial, pa še naslednja dva v vrstici, ki se nanašata na LCD in ti bo precej bolj jasno. Osebno mislim, da so tole eni boljših tutorialov za začetnike. Lahko tudi pišeš avtorju, je izredno prijazen in ponavadi odgovori v roku 48 ur.

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Pon Jun 03, 2013 9:38 pm    Naslov sporočila:   Odgovori s citatom

RGorazd je napisal/a:
Poglej si TALE tutorial, pa še naslednja dva v vrstici, ki se nanašata na LCD in ti bo precej bolj jasno. Osebno mislim, da so tole eni boljših tutorialov za začetnike. Lahko tudi pišeš avtorju, je izredno prijazen in ponavadi odgovori v roku 48 ur.

LP G


Sej ta koda je iz tiste strani. Ampak deluje (preizkušeno) samo na 1MHz.

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Tor Jun 04, 2013 8:09 pm    Naslov sporočila:   Odgovori s citatom

LCDji so precej počasna stvar. Z višanjem clock-a je potrebno ustrezno popraviti tudi vse delay-e, še posebej take, ki niso v stilu wait_ms(3); ampak so narejene v stilu for zanke.


Pa še to. Kje je del kode, ki alternira E signal?

Če rabiš tole za učenje, pol nadaljuj, če pa potrebuješ delujočo knjižnico za LCD - za AVRje pisano v Cju, me kontaktiraj pod , da ne smetim teme.
LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group