LCD display init

20 отговора 516 прегледа
#1

LCD display init

Ot dosta vreme se mucha da podkaram edin LDC display (2 reda, 16 simvola nared) koito e chast ot edno ustroistvo. Problenut mislia che e neshto v initcializatciata.
Protcesorut koito upravliava tozi display e ot familiata PIC16F**, a ezikut razbira se e Assembler.
Po vreme na initcializatciata uj spazvam vsichki vreme diagrami koito sa harakteristika na tozi display no ne stava, a puk ako neshto stane to ne e tova koeto triabva.
Sluchvalo li mu se e na niakoi neshto takova? Razchitam na suveti.

Отговор
в отговор на System #2

Re: LCD display init

Kakvo stava - sled inicializaciyata, vmesto da otslabne
kontrasta i na dvata reda, gorniya so ostava s po-silen kontrast ?.
Predpolagam che klatish signala E kakto tryabva ...
I sled tova izdavash komandata "LCD enable", may beshe 0x01 ...
A otkade gledash algoritama za init ?

Отговор
в отговор на System #3

Re: LCD display init

Sled kato mine init -a dislplay -a samo sveti no tova si e ot naprejenieto koeto mu se podava. A algorituma za init i vsichki drugi vremediagrami gi vzimam ot dokumentatciata na samia display. Vchera ustamovih che programata mi se uspiva pri proverkata na edin "busy" flag na display -a tova e neposredstveno predi da se prashtat danni kum nego, no ne moga da razbera zashto.

Отговор
в отговор на System #4

Re: LCD display init

Tova uspivane po "busy" flaga v status registara sled izdavaneto na koya LCD komanda stava - nyakoya ot tezi v inicializaciyata ? Nali sled parvite
nyakolko komandi ot inicializaciyata se chaka neobhodimoto vreme za
izpalnenie a ne mozhe da proveryavash "busy" flaga (toy oshte ne validen)

Отговор
в отговор на Noble #5

Re: LCD display init

Znachi initcializatciata mi proticha po slednia nachi.

1. V rabotnia registur zarejdam edno chislo koeto mi opredelia vida na interfeisa za komunikatcia ( v sluchaia 8 bitov). Izprashtam go za izpulnenie.
2. Chakam izvestno vreme (koeto e v porqduka na 40 mikro sekundi).
3. V rabotnia registur zarejdam pak chislo koeto mi ukazva che display -a e 2 reda. Izprashtam go za izpulnenie.
4. Chakam pak sushtoto vreme kakto pri t.2
5. Tuk se povtariat gornite 4 -ri tochki. Ne znam s kakva tcel, no v documentation -a taka pishe a i drugi source code -ove koito sum gledal taka go praviat.
6. Tuk veche pochvat dopulnitelnite nastroiki. Zarejdam v rabotnia pak chislo dali dislpay -a da mi sveti.
7. Pak chakam sushtoto vreme.
8. Dali kursora da miga.
9. Pak chakam sushtoto vreme.
Da priemem che tova stiga. I tuk veche idva momenta v koito ekrana triabva da e veche initcializiran a da e gotov za izprashtane na danni kum nego. Kakvo pravi?
Primerno v rabotnia zarejdam ASCII koda primerno na simvola "A". I shte go izprashtam kum ekrana. Pozitcioniram upravliavashtite signali RS,RW,E v suotvetnoto polojenie taka che da izprashtat danni spazvaiki vsichki vremediagrami. S tazi protcedurka "busy" proveriavam dali ekrana e gotov da priema. Izprashtam dannite i do tuk na ekrana ne se poiaviava nishto. Ili ako se poiavi neshto to ne e simvola "A".

Отговор
в отговор на System #6

Re: LCD display init

S takav LCD ne sam rabotil ot 4 godini obache imam sledniya smaten
spomen za inicilaizacityata - vremeto v t.2 tryabvashe da e nakolko
miliseconds (may che 40 us ne stigat; to e dostatachno za povecheto
komandi no ne za vsichki). Opitay samo da napravish tova vreme 3 ms -
dano tova da e edinstveniya problem

Отговор
в отговор на Noble #7

Re: LCD display init

Ok, shte probvam i shte pisha. Thanks

Отговор
в отговор на System #8

Re: LCD display init

ia za nacalo zemi sloji edni golemi zakasnenia sled komandite...
ako tragne pocvas da namaliavas dokato vse oste raboti! :-)

Отговор
в отговор на CALL-151 #9

Re: LCD display init

Vseki ot upravliavashtite sugnali RS,RW,E ima opredeleno vreme prez koeto triabva da e v nivo "visoko" ili suotvetno nisko. Tezi vremena na sa ednakvi po harakteristika. Ta suveta Vi e da gi dam na maksimuma koito pozvoliava documentasciata li?

Отговор
в отговор на System #10

Re: LCD display init

E, ne ...
Prosto spazvay setup and hold vremenata na RS spryamo RW spryamo E;
kakto i min. aktivnoto vreme na E (sigurno e 500 ns po spec.).
Pone spored men problema idva ot nedostatacnoto izchakvane
sled zapis na komanda v control registara (taka che se zapisva nova
predi starsta da e izpalnena - "a recipe for disaster") - t.e. vremeto
ot deaktiviraneto na E do sledvashtoto aktivirane.
Imashe Application Notes na Microchip - i specialno za tozi LCD,
i nyakakav chasovnik s nego - nyama li da ti pomogne (ama ne sam
probwal dali koda v tezi App. notes raboti okay)

Отговор
в отговор на Noble #11

Re: LCD display init

Mojesh li da mi dadesh tochen link. Rovih iz saita na Microchip, no ne namerih nishto. A za source vse shte mi pomogne si mislia.

Отговор
в отговор на System #12

Re: LCD display init

A, i oshte neshto ...
Ako pravish inicializaciyata vednaga sled reset na PIC-a, dobre e da
izchakash primerno 500 ms sled PIC reset-a - v tova LCD ima generator
na 160 KHz i toku vizh ne se e stabiliziral v momenta v koyto pocvhash
inicializaciyata - PIC-a sigrno raboti na MHz-i i watreshniya mu reset pri
stabilizirane na oscilaciite sigurno otpada mnogo barzo sled puskane
na zahranvaneto.
Ama tuka otvorihme edna harduerna tema ... Bash programistite
sigurno shte ni naplyuyat ...

Отговор
в отговор на Noble #13

Re: LCD display init

[линк]
(AN587)

[линк]
(AN582)

Отговор
в отговор на System #14

и при мене беше така

два дена го мъчих - научих се да псувам като каруцар!
накрая го подкарах, ама забравих де беше ключа за палатката та да те светна. за съжаление сорсовете ми не са на тоя компот, и не мога да погледна. нещо дребно беше, ама не се сещам. но не е от времената - нещо друго беше!

Отговор
в отговор на System #15

Vse oshte nishto ne stava. Davam malko code -ts

Vse oshte nishto ne stava. Razgledah godovete koito mi dade Noble help -naha mi mnogo blagodaria. Osobeni razliki vuv funktciite koito izprashtat komandite i simvolite kum ekrana niamashe. Problemut vse oshte mai si ostava v init -a. Davam malko code -ts, ako niakoi moje da vidi neshto neredno.

list p=16f877
include "P16F877.INC"

LCD_TEMP equ 020h ; LCD subroutines internal use
R1 equ LCD_TEMP+1 ; Timing counters
R2 equ R1+1
TEMP equ R2+1 ; Temp variable for busy check

Row1 equ 050h ;16 bytes up to $5F (Array 16 el.)
Row2 equ Row1+010h ;16 bytes up to $6F (Array 16 el.)

;DELAY15 equ .19 ; (HIGH((4000/FREQ)*15000/770))+1
DELAY15 equ .50*5 ; (high((4000/FREQ)*15000/770))+1

LINE0 equ 0
LINE1 equ 040h

LCD_DATA_TRIS equ TRISB
LCD_DATA equ PORTB
LCD_CNTL equ PORTC

;TRIS_LCD equ TRISB
;PORT_LCD equ PORTB
;PORT_KBD equ PORT_LCD
;CONTROL_LCD equ PORTE
;PORTE
;E equ 1 ; LCD Enable control line
;RW equ 2 ; LCD Read/Write control line
;RS equ 0 ; LCD Register-Select control line

; PORTC bits
E equ 7 ; LCD Enable control line
RW equ 5 ; LCD Read/Write control line
RS equ 6 ; LCD Register-Select control line
Secur equ 4
KBD equ 3 ; Keyboard common output
PWM equ 2 ; 1-100% 1kHz output
Zum equ 1 ; Zummer (PWM)
Modul equ 0 ; Modulation

W_TEMP equ 70h
STATUS_TEMP equ W_TEMP+1
PCLATH_TEMP equ STATUS_TEMP+1


org 0x000 ; Start at the reset vector

Reset_Vector

nop
clrf PCLATH
goto Start

org 0x004 ; Interrupt vector

Service_Int

MOVWF W_TEMP
MOVF STATUS,W
MOVWF STATUS_TEMP

;Kod za obrabotka sled generirane na prekusvaneto

MOVF STATUS_TEMP, W
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W

retfie

Start:
bcf INTCON,GIE
btfsc INTCON,GIE
goto Start
clrf STATUS
banksel PORTC
clrf PORTC ;Clear PORTC

banksel TRISA
movlw b'00011111'
movwf TRISA
clrf TRISE
movlw b'00011000' ;PORTC(3) input -- kbd
movwf TRISC
clrf TRISB

banksel PORTC
clrf PORTC
clrf PORTB
clrf PORTE

;init LCD
call Delay_15ms1
clrf LCD_CNTL ;All port outputs Low

DISPLAY_INIT

movlw 0x038 ;Command for 8-bit interface
movwf LCD_DATA
BSF LCD_CNTL,E
BCF LCD_CNTL,E

Delay_15ms
movlw DELAY15 ; Wait for 15ms for LCD to get powered up
movwf R1
clrf R2
LCycle1
decfsz R2,F
goto LCycle1 ; 3*256
decfsz R1,F ; 3*256+1
goto LCycle1 ;(3*256+2)*R1=770*R1 in procesor cycles

movlw 0x038
movwf LCD_DATA
BSF LCD_CNTL,E
BCF LCD_CNTL,E

movlw B'00001000' ; disp.off, curs.off, no-blink
call SEND_CMD
movlw 1 ; LCD clear
call SEND_CMD
movlw B'00001100' ; disp.on, curs.off
call SEND_CMD
movlw B'00000110' ; auto-inc (shift-cursor)
call SEND_CMD

movlw 'P'
call SEND_CHAR
movlw 'L'
call SEND_CHAR
movlw 'A'
call SEND_CHAR
movlw 'M'
call SEND_CHAR
movlw 'E'
call SEND_CHAR
movlw 'N'
call SEND_CHAR


Idle nop
goto Idle



Delay_15ms1
movlw DELAY15 ; Wait for 15ms for LCD to get powered up
movwf R1
clrf R2
LCycle2
decfsz R2,F
goto LCycle2 ; 3*256
decfsz R1,F ; 3*256+1
goto LCycle2 ;(3*256+2)*R1=770*R1 in procesor cycles

return


SEND_CMD
movwf LCD_TEMP ; Command to be sent is from W saved
call BUSY_CHECK ; Wait for LCD to be ready
; Busy routine sets PORTC&PORT_LCD adequately
movf LCD_TEMP,W
movwf LCD_DATA ; Send data to LCD
bcf LCD_CNTL,RW ; Set LCD in read mode
bcf LCD_CNTL,RS ; Set LCD in command mode
bsf LCD_CNTL,E ; LCD E-line high
bcf LCD_CNTL,E ; LCD E-line Low

return

SEND_CHAR
movwf LCD_TEMP ; Character to be sent is from W saved
call BUSY_CHECK ; Wait for LCD to be ready
; Busy routine sets PORTC&PORT_LCD adequately
movf LCD_TEMP,W ; Restore character into W
movwf LCD_DATA ; Send data to LCD
bcf LCD_CNTL,RW ; Set LCD in read mode
bsf LCD_CNTL,RS ; Set LCD in data mode
bsf LCD_CNTL,E ; LCD E-line high
bcf LCD_CNTL,E ; LCD E-line Low

return

BUSY_CHECK
bsf STATUS,RP0 ; Select Register page 1
movlw 0FFh ; Set PORTB for input
movwf LCD_DATA_TRIS
bcf STATUS,RP0 ; Select Register page 0
bcf LCD_CNTL,RS ; Set LCD for command mode
bsf LCD_CNTL,RW ; Setup to read busy flag
bsf LCD_CNTL,E ; LCD E-line High
bcf LCD_CNTL,E ; Set E low
movf LCD_DATA,W ; Read busy flag + DDram address
movwf TEMP
btfsc TEMP,7 ; Check Busy flag, High = Busy KOMENTAR
goto BUSY_CHECK
bcf LCD_CNTL,RW
bsf STATUS,RP0 ; Select Register page 1
movlw 0
movwf LCD_DATA_TRIS ; Set PORTB for output
bcf STATUS,RP0 ; Select Register page 0

return


end

Отговор
в отговор на System #16

Re: Vse oshte nishto ne stava. Davam malko code -ts

Сорс кода не съм го гледал.
Обаче има една подробност която всичките изпускате
Захранването при включване не трябва да се качва от 0 до 5v бавно(не си спомням времената)но ако ползваш 7805 и след него има кондензатор по голям от 10uf ще ти прави проблеми.
дисплеа не се ресетва в такъв случай.

Отговор
в отговор на System #17

Re: Vse oshte nishto ne stava. Davam malko code -ts

tuka imam edin na LPT na PC. i nema nikakav problem .iskash li koda na C?

Отговор
в отговор на Milenn #18

Re: Vse oshte nishto ne stava. Davam malko code -ts

OK Dai mi go.

Отговор
в отговор на Mr.Nqkoj #19

Re: Vse oshte nishto ne stava. Davam malko code -ts

Standartnata procedura po software reset na LCD-to se opravya v tozi sluzchay

Отговор
в отговор на System #20

Re: Vse oshte nishto ne stava. Davam malko code -ts

[линк]

Отговор