obsluha LCD pomoci priznaku BF

Zkousel nekdo ovladani LCD displeje pomoci priznaku BF, teda zjistovat, ci se vykonala predchozi operace a je mozne pokracovat dalsim přikazem ??

Mam dost casove rizikovy program a nemuzu cekat ve smyckach na dokonceni kazde operace s displejem.
Protoze pracuji s Atmega328p, tak to davam sem.

Najprv musíš dať info, o aký LCD sa jedná… Ale ak o klasiku s radičom HD47780, tak v datasheete máš minimálne časy medzi jednotlivými príkazmi. Ak počkáš o pár ms dlhšie, nič sa nestane. Inak s riadením pomocou BF nemám skúsenosť, nepotreboval som to zatiaľ…

Nějak nevím, co je na tom nejasnýho. Vytvoříš si buffer s datama pro zápis do displeje. Pokud jsou v bufferu data, voláš rutinu pro zápis na LCD. Ta přečte byte z instrukčního registru LCD (RS=0). Pokud je BF=1, vrátí se rovnou do hlavní smyčky programu. Pokud je BF=0, vezme další byte z bufferu, pošle na LCD a vrátí se do hlavní smyčky programu. Předpokládám klasiku s HD44780 nebo kompatibilní.

Nejasné mi na tom nie je nič, ani som nič takého nepísal. Napísal som môj názor, ako aj to, že zatiaľ som to nepotreboval.
Ale píšeš, že máš dosť časovo náročný program, tak asi podľa nejakého časovača skočíš zistiť, či je BF = 1 alebo 0. Tak isto môžeš v časovači inkrementovať nejaký register (premennú) a v hlavnom programe zistiť, či prešiel daný čas na vykonanie cyklu v LCD, pričom ak daný čas prešiel, pošleš ďalšiu inštrukciu alebo znak pre LCD, ak nie, ideš ďalej…

To stanleyv: Odpovídal jsem na Zdenovo dotaz a naznačil mu jedno z možných řešení jeho dotazu. Čtení BF jsem taky nikdy nepotřeboval, ale ze zvědavosti jsem jej kdysi samozřejmě vyzkoušel. Většinou displeje používám na kabelu a používám pro ně sériovou komunikaci - nejčastěji s 74595-kou, takže čtení z LCD nepoužívám.

ups…prepáč, myslel som, že reaguješ na môj post :smiley:

to Balu: tak nejak jsem to myslel,
program rotuje v hlavnim menu a ceka na udalost. Protoze cteni priznaku BF je okamzite, neni problem ho zaradit do postupnosti v hlavnim menu. Asi nejvetsi problem bude napsat to v ASM, protoze Bascom a C+ tuto rutinu nepoznaji.

Nenech se zaskočit názvem. Rutina, podprogram, funkce - je úplně jedno, jak to nazveš. Klidně to můžeš napsat v Bascomu nebo v C. Pokud umíš přečíst hodnotu pinu a zapsat byte na port, pak je úplně jedno, v čem to napíšeš.

V ASM to může vypadat třeba takhle :

[code]#define LCD_PIN pinb ; Datová sběrnice LCD je připojená na pinech portu B
#define LCD_PORT portb ; Datová sběrnice LCD je připojená na pinech portu B
#define LCD_DDR ddrb ; Datová sběrnice LCD je připojená na pinech portu B
#define RW portc, 4 ; Signál RW je na C4
#define RS portc, 3 ; Signál RW je na C3
#define EN portc, 2 ; Signál RW je na C2
#define BF LCD_PIN, 7 ; Signál BF je na datovém pinu 7

;
;
;
Hlavni_smycka:
;
; Obsluha menu a ostatních událostí
;
;
; Pokud je příznak odeslání do LCD neaktivní, zkontrolovat buffer.
; Pokud jsou v bufferu data, načíst data a aktivovat příznak pro odeslání do LCD
;
; Pokud je příznak odeslání do LCD neaktivní, skočit na Hlavni_smycka
;
rcall Zapis_na_LCD
rjmp Hlavni_smycka
;
;
;
Zapis_na_LCD:
sbi RW ; Signál RW na read
cbi RS ; Signál RS na Command register
ldi Temp, 0xFF
out LCD_DDR, Temp
out LCD_PORT, Temp ; LCD port jako vstup s aktivními pull-up rezistory
sbi EN ; Signál EN do log. 1
sbic BF ; Pokud je BF v log. 0, pak následující instrukci přeskočit
rjmp Zapis_na_LCD_Skip ; Signál BF je v log. 1 - skočíme na konec
cbi EN ; Signál EN do log. 0

; Podle potřeby skočit na Command nebo Data

Zapis_na_LCD_Command:
cbi RS ; Signál RS na Command register
rjmp Zapis_na_LCD_Proved

Zapis_na_LCD_Command:
sbi RS ; Signál RS na Data register

Zapis_na_LCD_Proved:
cbi RW ; Signál RW na write
ldi Temp, 0x00
out LCD_DDR, Temp ; LCD port jako výstup
out LCD_PORT, regData

sbi EN

; Data byla odeslána do LCD => deaktivovat příznak pro odeslání do LCD
Zapis_na_LCD_Skip:
cbi EN ; Signál EN do log. 0
ret
[/code]

Myslím si, že tohle není problém napsat ani v Bascomu nebo C.

BTW: Nic ve zlém, ale píšeš, že máš program dost časově rizikový a programuješ
to v Bascomu nebo C ? To mi připadá, že jde tak nějak proti sobě …
V C píšu občas taky - psaní je přecijenom rychlejší. Obzvlášť když pracuješ s větším
množstvím dat, polema apod., ale pokud potřebuju opravdu rychlý a malý kód,
tak je v první řadě ASM.

nic neni tak horuce, jak se uvari. Prehlednost, opravitelnost a prenositelnost vyssich jazyku je jejich obrovska vyhoda. Takze v ASM pisem jen opravdu kriticke rutiny.
Problem je v tom, ze casy 1,64mS jsou opravdu dlouhe a za tu dobu muze leccos uteci. Nekdy je problem i 40uS zapisu na LCD, pokud je hodne posilanych znaku na display, kombinovanych s posunem displeje.
Ono by to chtelo rozsekat prikazy na displej tak, aby to podle priznaku BF posilalo jednotlive prikazy nebo data. Teda vytvorit buffer.
Jeste nad tim popremyslim.