Řízení LCD 40x4

DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO »

Jo to je ten princip. Ale myslím, že aplikační logiku nemáš úplně dobře, protože pro přepnutí půlky musíš poslat příkaz, tj. nemůžeš přepnout a hned poslat písmena.
Prakticky to ale asi nebude vadit, protože nejspíš budeš obvykle pro jistotu nastavovat i pozici kurzoru. Nicméně z hlediska obecného použití kódu to není dobře (pro optimalizaci si umím dost dobře představit, že vím, že ten kurzor je v obou půlkách správně, takže bych ho nemusel posílat a tím šetřil čas i paměťový prostor).

Já bych to napsal asi nějak takhle. Poslání 255 přepne na horní půlku, poslání 254 na dolní. Zbytek jako dřív, tj. pro příkazy posílám 253, příkaz a pro text rovnou ten text.

Kód: Vybrat vše

symbol baud = N4800_32	
symbol RX = C.0	
symbol RS = C.1	
symbol enableHORNI = C.2
symbol enableDOLNI = C.3
symbol nahore = bit0

main:
	gosub LCD_init
	nahore = 1

	do
		serin RX, baud, b1
		gosub zpracuj
	loop


zpracuj:
	select case b1
		case 255 			; mam prepnout na horni pulku
			nahore = 1		; zapamatuju si, ze co prijde, bude nahore
			return			; a to je pro tuto chvili vse

	 	case 254 			; mam prepnout na dolni pulku
			nahore = 0		; zapamatuju si, ze co prijde, nebude nahore
			return			; a to je pro tuto chvili vse

		case 253			; poslali mi prikaz
			low RS 			; nastavim RS na predani prikazu
			serin RX, baud, b1	; prijmu ten prikaz

		else
			high RS			; nastavim RS na predani dat
						; a data uz jsem prijal
	endselect

	pinsB = b1				; dam na vystup co tam ma jit, at uz to je prikaz nebo data (RS uz je nastaveny)
	if nahore = 1 then			; podle horni nebo dolni pulky tiknu horni nebo dolni pulce
		pulsout enableHORNI, 1
	else
		pulsout enableDOLNI, 1
	end if

	return					; a je to.

Při čtení příkazu bych ještě zvážil dát tam timeout, protože až čert bude chtít, zresetuje mi odesílatele zrovna ve chvíli, kdy poslal 253 ale ještě neposlal ten příkaz, no a já pak první další později poslanou věc pochopím jako příkaz (třeba po jeho resetu zase nějaké nastavení pozice kurzoru). serin 500, main, RX, baud, b1 ; prijmu ten prikaz
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

Zkusil jsem tam nahrát ten program a nějak to nefunguje. LCD sice něco zobrazí, ale jsou to jen nesmyslné znaky.
Buď tam posílám špatně ty data, nebo to nefunguje jak má.
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO »

Možný to je, psal jsem to nasucho :-)
Posílat se to tam ale musí se správnýma kódama, tvůj původní program z prvního příspěvku fungovat nebude - ta vyhrazená čísla kolem 255 jsou jinak. Snad nějak takhle:

Kód: Vybrat vše

;08m2
symbol baud=N4800
Pause 1000
serout C.1, baud, (255, 253,1)   ; smaže horní půlku LCD
serout C.1, baud, (254, 253,1)   ; smaže dolní půlku LCD

start:
serout C.1, baud, (255,253,128)   ; souřadnice první řádek, první pozice
serout C.1, baud, ("abcdefghijklmnopqrst")

serout C.1, baud, (254,253,128)   ; souřadnice třetí řádek, první pozice
serout C.1, baud, ("uvwxyz0123456789ABCD")
goto start
Nebo něco s jiným výpisem (to by mě zajímalo, jestli to fakt udělá, co jsem chtěl):

Kód: Vybrat vše

;08m2
symbol baud = N4800
symbol cislo = b0
do
	pause 1000
	serout C.1, baud, (255, 253,1)   ;smaže horní půlku LCD
	serout C.1, baud, (254, 253,1)   ;smaže dolní půlku LCD

	for cislo = 0 to 159
		let b1 = cislo%4 / 2
		let b2 = cislo/4
		serout C.1, baud, (255-b1, 253, cislo%2 *64 +128 +b2)	; vypisuje po sloupcich 
		serout C.1, baud, (cislo%26 +65)			; pismena A-Z dokola
		pause 250
	next b0
loop
Kdyby Picaxe nemělo TAK NAPROSTO ZMRŠENÝ vyhodnocování výrazů, napsal bych to jako normální výraz (255-(cislo%4)/2, 253, 128+cislo/4+(cislo%2)*64)
Potřebuju totiž sekvenci:
255 , 253 , 128
65
255 , 253 , 192
66
254 , 253 , 128
67
254 , 253 , 192
68
255 , 253 , 129
69
255 , 253 , 193
70
254 , 253 , 129
71
254 , 253 , 193
72
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

Tak bohužel nic. Asi bude chyba v tom programu řídící LCD :(
První program vypíše na první řádek pár nesmyslných znaků (a7vf ... pak následuje tuším čínština).
Druhý se nedá nahrát protože zřejmě příkaz serout neumožňuje matematické operace.
Po úpravě, viz níže, se sice něco začne vypisovat, ale je to spíše znaková sada LCD a vypisuje se jen za sebou na prvním řádku.

Kód: Vybrat vše

;08m2
symbol baud = N4800
symbol cislo = b0
do
	pause 1000
	serout C.1, baud, (255, 253,1)   ;smaže horní půlku LCD
	serout C.1, baud, (254, 253,1)   ;smaže dolní půlku LCD

	for cislo = 0 to 159
		let b1 = cislo%4 / 2
		let b3 = 255-b1
		let b2 = cislo/4
		let b4 =  cislo%2 *64 +128 +b2
		let b5 = cislo%26 +65
		
		serout C.1, baud, (b3, 253,b4)	; vypisuje po sloupcich 
		serout C.1, baud, (b5)			; pismena A-Z dokola
		pause 250
	next b0
loop
DavidO
Příspěvky: 1133
Registrován: 01 kvě 2013, 21:27

Re: Řízení LCD 40x4

Příspěvek od DavidO »

Jé, no jo, už zase jsem zapomněl, že ty výrazy v Picaxe jsou naprd ... :roll:

Popis jak se to chová mi trochu zní, jako kdyby přijímač nestíhal - nastavení pozice nefunguje, i když ty čísla jsou spočítaný správně. A když se už povede něco na displej vypsat, vypíše se to na pozici automaticky posunutou o znak doprava.
Tady jsem zkusil ten přijímač nějak ohnout, třeba jestli tam není někde nějaký zdržení (naprosto netuším, jak na tom Picaxe je výkonově ve vztahu k přijímání po seriové lince 4800Bd). Zkus prosímtě tohle:

Kód: Vybrat vše

;20M2 LCD 

symbol baud = N4800_32	
symbol RX = C.0	
symbol RS = C.1	
symbol enableHORNI = C.2
symbol enableDOLNI = C.3
symbol nahore = b0

main:
	gosub LCD_init
	nahore = 1

zpracuj:
	serin RX, baud, b1
	if b1 < 253 then 
			high RS			; nastavim RS na predani dat
						; a data uz jsem prijal
	else if b1 = 253 then			; poslali mi prikaz
			low RS 			; nastavim RS na predani prikazu
			serin RX, baud, b1	; prijmu ten prikaz

	else if b1 = 254 then 			; mam prepnout na dolni pulku
			nahore = 0		; zapamatuju si, ze co prijde, nebude nahore
			goto zpracuj		; a to je pro tuto chvili vse

	else if b1 = 255 then 			; mam prepnout na horni pulku
			nahore = 1		; zapamatuju si, ze co prijde, bude nahore
			goto zpracuj		; a to je pro tuto chvili vse

	end if

	pinsB = b1				; dam na vystup co tam ma jit, at uz to je prikaz nebo data (RS uz je nastaveny)
	if nahore = 1 then			; podle horni nebo dolni pulky tiknu horni nebo dolni pulce
		pulsout enableHORNI, 1
	else
		pulsout enableDOLNI, 1
	end if

	goto zpracuj				; a je to.

LCD_init: sem si dej ten kód pro inicializaci z konce tvého prvního příspěvku, jak tam jsou za sebou vždycky pulsout enable a enable2 akorát to bude enableHORNI a enableDOLNI
a ještě případně zkus to tam posílat po jednotlivejch bajtech, jen pro test asi takhle:

Kód: Vybrat vše

serout C.1, baud, (255)
serout C.1, baud, (253)
serout C.1, baud, (1)

a pak uvnitř toho cyklu

serout C.1, baud, (b3)
serout C.1, baud, (253)
serout C.1, baud, (b4)
serout C.1, baud, (b5)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

Jen pro upřesnění, dám sem program pro LCD a pak program který tam tak nějak funguje. Co to vypisuje na LCD je zde: https://youtu.be/o8oTN5iEynM
Ta verze po jednotlivých bajtech nefunguje.
LCD:

Kód: Vybrat vše

;20M2 LCD 

symbol baud = N4800_32	
symbol RX = C.0	
symbol RS = C.1	
symbol enableHORNI = C.2
symbol enableDOLNI = C.3
symbol nahore = b0
main:
	gosub LCD_init
	nahore = 1
zpracuj:
	serin RX, baud, b1
	if b1 < 253 then 
			high RS			; nastavim RS na predani dat
						; a data uz jsem prijal
	else if b1 = 253 then			; poslali mi prikaz
			low RS 			; nastavim RS na predani prikazu
			serin RX, baud, b1	; prijmu ten prikaz

	else if b1 = 254 then 			; mam prepnout na dolni pulku
			nahore = 0		; zapamatuju si, ze co prijde, nebude nahore
			goto zpracuj		; a to je pro tuto chvili vse

	else if b1 = 255 then 			; mam prepnout na horni pulku
			nahore = 1		; zapamatuju si, ze co prijde, bude nahore
			goto zpracuj		; a to je pro tuto chvili vse

	end if

	pinsB = b1				; dam na vystup co tam ma jit, at uz to je prikaz nebo data (RS uz je nastaveny)
	if nahore = 1 then			; podle horni nebo dolni pulky tiknu horni nebo dolni pulce
		pulsout enableHORNI, 1
	else
		pulsout enableDOLNI, 1
	end if
	goto zpracuj				; a je to.

LCD_init:
	dirsC = %10111110	
	dirsB = %11111111	
	pause 15 		
	pinsB = %00110000      
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1  
	pause 5 		
	pulsout enableHORNI, 1 	
	pulsout enableDOLNI, 1  
	pulsout enableHORNI, 1  	
	pulsout enableDOLNI, 1 
	setfreq m32			
	pinsB = %00111000 	
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1 
	pinsB = %00000001	
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1  	
	pause 8			
	pinsB = %00000010 
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1 
	pinsB = %00000110		
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1  	
	pause 1			
	pinsB = %00001100	
	pulsout enableHORNI, 1
	pulsout enableDOLNI, 1 
	pause 1
	return

Zdroj:

Kód: Vybrat vše

;08m2
symbol baud = N4800
symbol cislo = b0
do
	pause 1000
	serout C.1, baud, (255, 253,1)   ;smaže horní půlku LCD
	serout C.1, baud, (254, 253,1)   ;smaže dolní půlku LCD

	for cislo = 0 to 159
		let b1 = cislo%4 / 2
		let b3 = 255-b1
		let b2 = cislo/4
		let b4 =  cislo%2 *64 +128 +b2
		let b5 = cislo%26 +65
		
		serout C.1, baud, (b3, 253,b4)	; vypisuje po sloupcich 
		serout C.1, baud, (b5)			; pismena A-Z dokola
		pause 250
	next b0
loop
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

Tak jsem se po čase vrátil k tomu LCD a nastal problém, s kterým si nevím rady.
Pro řízení LCD používám picaxe 20M2 a ten můj prográmek z předešlé stránky, data posílám z 8M2. Mám tak zaplněné všechny pole dvěma stejnýma řádky, které se v intervalu 1s mění, viz první dva panely na obrázku. Po cca 10-20 minutách, někdy déle, bezproblémového chodu, se nejprve ve spodních 2 řádcích začnou nahodile vyskytovat chyby, znaky co tam nepatří, plné znaky viz třetí a čtvrtý panel. Během několika následujících minut, se od spodního řádku ty plné znaky začnou "množit", až zaplní celý spodní řádek a na druhém řádku se vypíše 0008 a čtyři plné znaky. V tom okamžiku se LCD zablokuje, znaky se už nemění a zůstane na něm výpis, viz poslední panel na obrázku. Po vypnutí a opětovném zapnutí vše opět pracuje jak má, těch dalších x minut.
Netušíte, kde je závada? Je vadný ten řadič LCD? Zapojení toho procesoru 20M2 a obdobný program na buzení LCD mám už vyzkoušeno na desítkách aplikací a nikdy jsem se s něčím takovým nesetkal. :(
lcd40.jpg
Pirx
Příspěvky: 181
Registrován: 24 úno 2013, 16:29
Kontaktovat uživatele:

Re: Řízení LCD 40x4

Příspěvek od Pirx »

jova píše: 19 led 2020, 14:23 Tak jsem se po čase vrátil k tomu LCD a nastal problém, s kterým si nevím rady.
Pro řízení LCD používám picaxe 20M2 a ten můj prográmek z předešlé stránky, data posílám z 8M2. Mám tak zaplněné všechny pole dvěma stejnýma řádky, které se v intervalu 1s mění, viz první dva panely na obrázku. Po cca 10-20 minutách, někdy déle, bezproblémového chodu, se nejprve ve spodních 2 řádcích začnou nahodile vyskytovat chyby, znaky co tam nepatří, plné znaky viz třetí a čtvrtý panel. Během několika následujících minut, se od spodního řádku ty plné znaky začnou "množit", až zaplní celý spodní řádek a na druhém řádku se vypíše 0008 a čtyři plné znaky. V tom okamžiku se LCD zablokuje, znaky se už nemění a zůstane na něm výpis, viz poslední panel na obrázku. Po vypnutí a opětovném zapnutí vše opět pracuje jak má, těch dalších x minut.
Netušíte, kde je závada? Je vadný ten řadič LCD? Zapojení toho procesoru 20M2 a obdobný program na buzení LCD mám už vyzkoušeno na desítkách aplikací a nikdy jsem se s něčím takovým nesetkal. :( lcd40.jpg
Tohle chovani mi vede na "memory leak", tj. s nekde se ti byte za bytem zvetsuje (zmensuje) velikost nejakeho pole nebo ti nekde cestuje ukazatel tak dlouho, az se prepise oblast nutna pro beh programu (nejcasteji zasobnik) a program zhavaruje.
Soldering fumes make you stronger!
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

A jaký program by to měl být konkrétně?
V té 8M2 co posílá znaky, to běží určitě dál. Kontroloval jsem to na dalším připojeném LCD.
20M2 co obsluhuje LCD, ho jen inicializuje, pak přijímá data a posílá je dál, ani jeden s pamětí nepracuje.
Takže by byla závada v LCD?
jova
Příspěvky: 361
Registrován: 16 pro 2013, 11:40

Re: Řízení LCD 40x4

Příspěvek od jova »

Tak jsem zapojil další LCD a chová se to stejně :?
Musím závadu hledat v tom programu 20M2 co řídí LCD.
Odpovědět