Stránka 2 z 3
Re: Řízení LCD 40x4
Napsal: 14 pro 2019, 12:01
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
Re: Řízení LCD 40x4
Napsal: 14 pro 2019, 22:26
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á.
Re: Řízení LCD 40x4
Napsal: 15 pro 2019, 01:14
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
Re: Řízení LCD 40x4
Napsal: 15 pro 2019, 10:02
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
Re: Řízení LCD 40x4
Napsal: 15 pro 2019, 10:49
od DavidO
Jé, no jo, už zase jsem zapomněl, že ty výrazy v Picaxe jsou naprd ...
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)
Re: Řízení LCD 40x4
Napsal: 15 pro 2019, 20:50
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
Re: Řízení LCD 40x4
Napsal: 19 led 2020, 14:23
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.
Re: Řízení LCD 40x4
Napsal: 19 led 2020, 17:16
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.
Re: Řízení LCD 40x4
Napsal: 19 led 2020, 18:08
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?
Re: Řízení LCD 40x4
Napsal: 19 led 2020, 22:19
od jova
Tak jsem zapojil další LCD a chová se to stejně
Musím závadu hledat v tom programu 20M2 co řídí LCD.