|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
denis18 Neznanec
Pridružen-a: Pet 24 Maj 2013 16:26 Prispevkov: 6 Aktiv.: 0.05 Kraj: Celje
|
Objavljeno: Pet Maj 24, 2013 5:12 pm Naslov sporočila: Inicializacija LCD displaya |
|
|
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 |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pet Maj 24, 2013 5:24 pm Naslov sporočila: |
|
|
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 |
|
|
denis18 Neznanec
Pridružen-a: Pet 24 Maj 2013 16:26 Prispevkov: 6 Aktiv.: 0.05 Kraj: Celje
|
Objavljeno: Pet Maj 24, 2013 7:02 pm Naslov sporočila: |
|
|
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 |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Pet Maj 24, 2013 7:55 pm Naslov sporočila: Re: Inicializacija LCD displaya |
|
|
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 |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pet Maj 24, 2013 8:10 pm Naslov sporočila: |
|
|
Č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 |
|
|
denis18 Neznanec
Pridružen-a: Pet 24 Maj 2013 16:26 Prispevkov: 6 Aktiv.: 0.05 Kraj: Celje
|
Objavljeno: Pet Maj 24, 2013 8:11 pm Naslov sporočila: |
|
|
@int47:Kakšno optimizacijo misliš?
@matjazkariz: S timingi sem že poizkušal, vendar brez uspeha. Bom preveril še vse enkrat. |
|
Nazaj na vrh |
|
|
matjazkariz Član
Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.60
|
Objavljeno: Pet Maj 24, 2013 8:21 pm Naslov sporočila: |
|
|
Č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 |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.27 Kraj: Ljubljana
|
Objavljeno: Pet Maj 24, 2013 8:23 pm Naslov sporočila: |
|
|
Če uporabljaš AVR Studio z WinAvr, so nastavitve v Project -> Configuration Options. "Optimization" nastavi na karkoli razen "-O0". |
|
Nazaj na vrh |
|
|
denis18 Neznanec
Pridružen-a: Pet 24 Maj 2013 16:26 Prispevkov: 6 Aktiv.: 0.05 Kraj: Celje
|
Objavljeno: Pet Maj 24, 2013 8:27 pm Naslov sporočila: |
|
|
Optimizacija je nastavljena na -Os. |
|
Nazaj na vrh |
|
|
denis18 Neznanec
Pridružen-a: Pet 24 Maj 2013 16:26 Prispevkov: 6 Aktiv.: 0.05 Kraj: Celje
|
Objavljeno: Ned Jun 02, 2013 12:42 pm Naslov sporočila: |
|
|
Še ima kdo kakšno idejo, kaj bi bilo narobe, ker jaz res ne vem kaj bi lahko bilo? |
|
Nazaj na vrh |
|
|
HeBird Član
Pridružen-a: Ned 16 Avg 2009 16:36 Prispevkov: 79 Aktiv.: 0.44 Kraj: Domžale
|
Objavljeno: Pon Jun 03, 2013 12:20 pm Naslov sporočila: |
|
|
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 |
|
|
S53DZ Član
Pridružen-a: Čet 28 Apr 2011 9:27 Prispevkov: 951 Aktiv.: 6.01 Kraj: Ljubljana
|
Objavljeno: Pon Jun 03, 2013 3:22 pm Naslov sporočila: |
|
|
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.68 Kraj: Ig
|
Objavljeno: Pon Jun 03, 2013 9:32 pm Naslov sporočila: |
|
|
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 |
|
|
tilz0R Član
Pridružen-a: Čet 31 Maj 2012 15:39 Prispevkov: 898 Aktiv.: 6.20 Kraj: Črnomelj
|
Objavljeno: Pon Jun 03, 2013 9:38 pm Naslov sporočila: |
|
|
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 |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.68 Kraj: Ig
|
Objavljeno: Tor Jun 04, 2013 8:09 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|