LCD display init
20 отговора
516 прегледа
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.
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.
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 ?
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 ?
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.
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)
nyakolko komandi ot inicializaciyata se chaka neobhodimoto vreme za
izpalnenie a ne mozhe da proveryavash "busy" flaga (toy oshte ne validen)
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".
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".
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
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
Re: LCD display init
ia za nacalo zemi sloji edni golemi zakasnenia sled komandite...
ako tragne pocvas da namaliavas dokato vse oste raboti! :-)
ako tragne pocvas da namaliavas dokato vse oste raboti! :-)
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?
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)
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)
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.
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 ...
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 ...
и при мене беше така
два дена го мъчих - научих се да псувам като каруцар!
накрая го подкарах, ама забравих де беше ключа за палатката та да те светна. за съжаление сорсовете ми не са на тоя компот, и не мога да погледна. нещо дребно беше, ама не се сещам. но не е от времената - нещо друго беше!
накрая го подкарах, ама забравих де беше ключа за палатката та да те светна. за съжаление сорсовете ми не са на тоя компот, и не мога да погледна. нещо дребно беше, ама не се сещам. но не е от времената - нещо друго беше!
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
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
Re: Vse oshte nishto ne stava. Davam malko code -ts
Сорс кода не съм го гледал.
Обаче има една подробност която всичките изпускате
Захранването при включване не трябва да се качва от 0 до 5v бавно(не си спомням времената)но ако ползваш 7805 и след него има кондензатор по голям от 10uf ще ти прави проблеми.
дисплеа не се ресетва в такъв случай.



Обаче има една подробност която всичките изпускате
Захранването при включване не трябва да се качва от 0 до 5v бавно(не си спомням времената)но ако ползваш 7805 и след него има кондензатор по голям от 10uf ще ти прави проблеми.
дисплеа не се ресетва в такъв случай.
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?
Re: Vse oshte nishto ne stava. Davam malko code -ts
Standartnata procedura po software reset na LCD-to se opravya v tozi sluzchay