Rutina pro LCD PC1602 z knihy Práce s mikr. Atmel AVR od BEN

dobrý den
zkouším pripojit lcd WC1602A0-SFYLYNC06 k atmega 16
ale ukáže mě první řádek bílý a druhý černý asi jsem ho špatně nainicializoval zkoušel jsem ukázkový program z Práce s uC atmel avr od ben
displej sem kupaval tady tme.eu/cz/katalog/#cleanPara … szukaj%3D+
když k němu připojím napájení je celý bílý a když se ho pokusim inicializovat druhy radek ztmavne a hned jak se snazim do uC nahrat jiny program všechno zbělá zkoušel sem protahovat časy mezi daty vysílanými na lcd ale pořád stejný výsledek přikládám ukázkový program který sem tam nahrál


	.NOLIST	
	.INCLUDE "m16def.inc"	
	.LIST	
		
	.DEF REG=R16	;prac. registr		
	.DEF POC=R20	;počítadlo
	.CSEG	;kódový segment	
	;hlavní program:	
START:	LDI REG,LOW(RAMEND)	
	OUT SPL,REG	;nastavení SP
	LDI REG,HIGH(RAMEND)	
	OUT SPH,REG	;na konec SRAM
	;inicializace LCD:	
	RCALL LCDINI	
	;nastavení adresy textu:
	LDI ZL,LOW(ADRZTX)	
	LDI ZH,HIGH(ADRZTX)	
	;smycka animace:	
SMYCKA:	;příprava na první řádek:
	LDI REG,$80	
	RCALL LCDWCM	;první řádek
	LDI POC,16	;počet sloupců
RADEK1:	LPM REG,Z+	;nahraj znak
	RCALL LCDWDT	;zapiš znak
	DEC POC	;konec řádku?
	BRNE RADEK1
	;příprava na druhý řádek:	
	LDI REG,$C0	
	RCALL LCDWCM	;druhý řádek
	LDI POC,16	;počet sloupců
RADEK2:	LPM REG,Z+	;nahraj znak
	RCALL LCDWDT	;zapiš znak
	DEC POC	;konec řádku?
	BRNE RADEK2
	;čekání 2 s:	
	RCALL CEK2S	
	;test konce animace:	
	CPI ZL,LOW(ADRKTX)	;porovná
	LDI REG,HIGH(ADRKTX)	;Z s ADRKTX
	CPC ZH,REG	
	BREQ START	;celé znovu
	;příprava na další krok:	
	SBIW ZL,16	;Z=Z-16
	RJMP SMYCKA	;další krok
		;text pro výpis:	
ZTEXT:	.DB "                "
	.DB "                "
	.DB "BEN uvadi:      "
	.DB "Udelejte si z PC"
	.DB "Prace s ",$E4,"C ATMEL"
	.DB "Cislicova tech. "
	.DB "C++ Builder     "
	.DB "USB prakticky   "
	.DB "Prvni kroky sAVR"
	.DB "LCD prakticky   "
	.DB "                "	
KTEXT:		;konec textu+1
	.EQU ADRZTX=2*ZTEXT	;adresa začátku textu
	.EQU ADRKTX=2*KTEXT	;adresa konce textu
	;vložení rurin pro LCD:	
	.INCLUDE "ATLCDTX2.INC"

ATLCDTX2.INC

	.DEF REG=R16	;pracovní registr
	.DEF CNT1=R17	;čítače průchodů
	.DEF CNT2=R18	;pro čekací
	.DEF CNT3=R19	;rutiny
	.EQU E=2	;signály
	.EQU RS=1	;pro řízení
	.EQU FL=0	;LCD
	.EQU DDR=DDRC	;řízení směru
	.EQU PORT=PORTC	;port

		;inicializace LCD
LCDINI:	LDI REG,$00	
	OUT PORT,REG	;výchozí hodnoty
	LDI REG,$7F	
	OUT DDR,REG	;výstup režim
	RCALL CEK15M	;čekej 15ms
	CBI PORT,RS	;RS=0
	SBI PORT,E	;E=1
	LDI REG,$1B	;DATA=$30
	OUT PORT,REG	
	CBI PORT,E	;E=0
	RCALL CEK4M1	;počkej 4,1ms
	SBI PORT,E	;E=1
	CBI PORT,E	;E=0
	RCALL CEK100	;počkej 100us
	SBI PORT,E	;E=1
	CBI PORT,E	;E=0
	RCALL CEK40	;čekej 40us
	LDI REG,$20	;4bitová komunikace
	RCALL LCDWCM	
	LDI REG,$28	;nastavanení funkce
	RCALL LCDWCM	
	LDI REG,$01	;smazání displeje
	RCALL LCDWCM	
	LDI REG,$08	;vypnutí kurzoru
	RCALL LCDWCM	
	LDI REG,$0C	;zapnutí displeje
	RCALL LCDWCM	
	LDI REG,$06	;režim inkrementace
	RCALL LCDWCM	
	RET	
		;čeká CNT1*us
CEK:	DEC CNT1	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	NOP	
	BRNE CEK	
	RET	
		;čeká 40us
CEK40:	LDI CNT1,40	
	RCALL CEK	
	RET	
		;čeká 100us
CEK100:	LDI CNT1,100	
	RCALL CEK	
	RET	
		;čeká CNT2*100us
CEKM:	RCALL CEK100	
	DEC CNT2	
	BRNE CEKM	
	RET	
		;čeká 1,6ms
CEK1M6:	LDI CNT2,16	
	RCALL CEKM	
	RET	
		;čeká 4,1ms
CEK4M1:	LDI CNT2,41	
	RCALL CEKM	
	RET	
		;čeká 15ms
CEK15M:	LDI CNT2,150	
	RCALL CEKM	
	RET	

		;čeká asi 2s
CEK2S:	LDI CNT1,100	
	LDI CNT2,0	
	LDI CNT3,0	
CEKV0:	DEC CNT3	
	BRNE CEKV0	;smyčka 1
	DEC CNT2	
	BRNE CEKV0	;smyčka 2
	DEC CNT1	
	BRNE CEKV0	;smyčka 3
	RET	
		;zapíše data/příkaz REG
LCDWDT:	SET	;T=1
	SBI PORT,RS	;RS=1
	RJMP LCDWR1
LCDWCM:	CLT	;T=0
	CBI PORT,RS	;RS=0
LCDWR1:	MOV CNT2,REG	;schovej REG
	SBI PORT,E	;E=1
	ANDI REG,$F0	;vymaskuj horní bity
	LSR REG	;>>1
	ORI REG,$04	;přidej E=1
	BLD REG,RS	;přidej RS(T)
	OUT PORT,REG	;vystav
	CBI PORT,E	;E=0
	SBI PORT,E	;E=1
	MOV REG,CNT2	;obnov REG
	ANDI REG,$0F	;vymaskuj dolní bity
	SWAP REG	;dej na místo horních
	LSR REG	;>>1
	ORI REG,$04	;přidej E=1
	BLD REG,RS	;přidej RS(T)
	OUT PORT,REG	;vystav
	CBI PORT,E	;E=0
	RCALL CEK40	;počkej 40us
	BRTS LCDWRE	;pokud T=1, konec
	MOV REG,CNT2	;obnov REG
	ANDI REG,$03	;pro $01, $02, $03
	BRNE LCDWR2	;čekej 1,6ms
LCDWRE:	RET	
LCDWR2:	RCALL CEK1M6	
	RET	

:arrow_right: administrator: přejmenováno z "problem s lcd 1602"

Žádná reakce, zdá se, že nikomu se už dnes nechce luštit asm (ani mně).
Doporučoval bych podívat se na Bascom.
Tam je např. práce s displejem takto jednoduchá:

[code]Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , _
Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2

‘’’’’’’’’’’’’’’’’’’’’’’’’’’ HLAVNI PROGRAM ‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
Cursor Off 'vypni kurzor
Cls 'vymaž displej
Lcd “Hello world” 'napiš text[/code]

nešlo o ten program ale o displej který nejede a nevim proc. ten program funguje jinak by ho tam nedali

Ahoj.
To je prave veliky omyl, ne vzdy program, ktery je uverejneny na internetu funguje doma… Je potreba udelat upravy, aby to chodilo…
Taky se primlouvam, aby si zkusil Bascom, nebo WinAVR, muzes pouzit knihovny, ktere jsou overene 100x a vsichni vime, ze funguji…

Co se tyce assembleru, urcite se najdou lidi co v tom programuji, ale myslim si, ze se jim ten tvuj program lustit nechce.

Pises ze kdyz display zapnes tak prvni radek je bily a druhy cerny. Obycejne je to naopak. Jsi si jisty, ze display nemas otoceny o 180 stupnu a ze mas piny spravne zapojeny?
Idealni by bylo, kdyby si poslal schema zapojeni jak ho mas (ne schema zapojeni jak by to melo byt) a taky nejakou fotku jak to mas zapojene…
Byli tady situace, ze display byl spatne zapojeny a nechodilo to jenom kvuli tomu…
Zatim

Mně v té knize něco nesedí.
Kód je evidentně psaný pro toto zapojení:

mproc      displej
PC7         DB7
PC6         DB6
PC5         DB5
PC4         DB4
PC2         E
PC1         RS

Ale ve schematu to vypadá jakoby DB7 šlo na PC6, DB6 na PC5 atd.
lcd.png

AB: není to tak když to zapojím podle tebe nestane se nic ale když to zapojím podle knížky tak zčerná ten druhý řádek
detasheet displeje
jen sem nezjistil na co je to V0



Omlouvám se, teď vidím, že kód je opravdu napsaný pro zapojení v knize.
Na Pinu 3 displeje se nastavuje kontrast.
Dej tam trimr podle schematu (10k-50k).
Pak spusť program a nastav kontrast.

ne kontrast nastavuje LED+ a LED-

LED± nastavuje intenzitu podsvětlení.
Poslechni dobrou radu.

buď je to špatný datasheet nebo nevim když jsem dal led+ na 0v tak tam je maximalní kontrast

Teď v tom mám zmatek.
Čemu říkáš led+ ?

druhý pin zprava pin15

Ahoj.
Tak display je opravdu o 180 stupnu prosim otocit.
At koukam na fotku jak chci, tak to mas spatne zapojene.
Melo by to by takto:
PIN 1 GND
PIN 2 5V ( v tvem pripade OK)
PIN3 pres odpor 1k na GND (u tebe nezapojeno)
PIN4 k atmega RS (Asi OK)
PIN5 k ATMEGA R/W u tebe zapojeno ke GND ale podle nakresu spravne
PIN6 k Atmega E (asi OK)
Piny7-10 bych nepripojoval k zemi, me to delalo neplechu,
Ostatni v poradku.
Takze jediny problem vidim zatim ten PIN3
Kontrast nastavuje Pin3 versus PIN1, podsviceni nastavuje LED+ a LED-, tam ma byt cca 4,7V snese to i 5V
Kde mas ve schematu ten kondenzator (Mozna je to pojistka)? Podle tvaru to vypada ze je v radech pF a nema zadny ucel, pripadne zvlneni ti stejne nezachyti… Dej ho pryc.

mohl by mě sem někdo dát .hex kerý zobrazí nějaký text na a zapojení abych mohl skusit funkčnost lcd

Zkus toto se zapojením které máš teď.
lcd_test.hex (1.58 KB)

Nepočítáš ty piny opačně?
Jsou u nich napsané čísla?

VYŘEŠENO já debil jsem ho měl celý o 180° otočený
myslel sem že kontakty jsou naspodu a řídil sem se tím celou dobu ale oni jsou nahoře

Vzdyt jsem ti to povidal :slight_smile:
Tak hodne zabavy s LCD, hlavne si nakresli jak to mas zapojeny az priste to budes delat znova…