Sida 1 av 3
Hjälp med LM16A211 LCD
Postat: 3 oktober 2006, 18:08:23
av xezer
För er som läste min förra tråd så kan jag nu upplysa om att det till slut blev en LM16A211 LCD
Jag får dock inte denna att fungera riktigt som den ska, i sanningens ord så får jag den inte all fungera alls
jag har anslutit den som följande:
1 | VSS | GND
2 | VDD | +5V
3 | V0 | +3V
4 | RS | 0V
5 | R/W | 0V
6 | E |+5V
7-14 är databitar som jag har anslutit till ett K8055,
http://www.kjell.com/content/templates/ ... 7160&path=
Genom det har jag skrivit ett program i c++ som skickar ut dessa signaler som ska, om jag har förstått det, initiera LCDn.
00001100 //function set 8 bit
(vänta 5msek)
00001100 //function set 8 bit
(vänta 5msek)
00001100 //function set 8 bit
(vänta 5msek)
00111100 //Function set
(vänta 5msek)
00001000 //Display Off
(vänta 5msek)
00000001 // Display Clear
(vänta 5msek)
00000100 // Entry Mode Set
(vänta 5msek)
Jag är rätt osäker på att jag har initierat displayen rätt.
Sen när jag har anslutit +5V till VDDn så ligger så gott som alla pinnar på ca 4V, ska det vara så?
Postat: 3 oktober 2006, 18:12:08
av v-g
'E' måste du väl 'stroba' mellan varje kommando eller minns jag helt fel nu?
Postat: 3 oktober 2006, 18:24:05
av xezer
Om du med stroba menar att ge på-av för varje kommando så fungerade inte det heller :/
Postat: 3 oktober 2006, 18:25:06
av v-g
av på av så menade jag ja. Samtidigt måste datat finnas på "datapinnarna".
Postat: 3 oktober 2006, 18:31:31
av sodjan
Eftersom du har lagt både "E" och "RS" fast till 5V resp 0V så har du
uppenbarligen inte läst på tillräckligt om HD44780 LCD'er.
Läs på, koppla sedan rätt, och återkom om ändå inte fungerar.
Personligen tycker jag att de två PDF'erna på denna sida är bra :
http://www.epemag.wimborne.co.uk/resources.htm
Postat: 3 oktober 2006, 20:19:37
av xezer
Tack, har läst på lite nu och ska börja initiera LCDn i 4bits mode.
Som det är nu ser processen ut såhär:
RS = 0.
Kod: Markera allt
init_0011(); // 8bits function
strob();
init_0011();
strob();
init_0011(); // 4bits function
strob();
init_0010();
strob();
init_0010(); //
strob();
init_1010();
strob();
init_0000(); //Display off
strob();
init_1000();
strob();
init_0000(); //Clear display
strob();
init_0001();
strob();
init_0000(); //Set entry mode
strob();
init_0110();
strob();
init_0000(); //Display on, cursor, blink
strob();
init_1111();
strob();
init_XXXX() sänder ut värdet och sätter på E.
strob() sätter av E och tar bort alla signaler.
Jag får ingen reaktion ifrån LCDn, tycker att cursorn borde blinka :/
Vad kan jag ha gjort för fel?
Postat: 3 oktober 2006, 20:45:57
av v-g
Och du är säkert på att ditt vellemankort levererar några utsignaler? Kontrollera gärna med lysdiod + motstånd.
Annars är det bara att se till att (ex)kod 0011 verkligen ger 0011 på porten och att det är rätt kopplat till rätt del av portarna D0-D7. Sen strobe (av)-på-av

Postat: 3 oktober 2006, 20:47:07
av sodjan
Prova att lägga kontrastpinnen till 0V istället för 3V.
Bäst är att lägga dit en 10k trimpot så att du kan justera
kontrsatspänningen enkelt. Varför har du valt just 3V ??
Postat: 3 oktober 2006, 21:07:32
av xezer
V-G: När jag läste av ut-strömmen från kortet så var den inte på mer än 0.6V och det slog mig att den spänningen ändast var till som collector-spänning, och visst var det så..
Har bara behövt använda de digitala input kanalerna tidigare så hade inte stor koll på outputen.
Klantigt misstag..
Nu blir det inköp av transistorer imorgon
Sodjan: Det stod i databladet att man skulle ha en spänning inom intervallet 0-5V, så 3 kändes bra

Har ingen trimpot hemma :/
Såg senare i en av pdf:erna du länkade till att vissa LCDer ville ha en negativ spänning och att man därför bör sätta den som 0V.
Postat: 3 oktober 2006, 21:38:46
av sodjan
De som vill ha en negativ kontrastspänning är de som kallas
"extended temperature range". Det gäller inte för just denna.
De flesta LCD'er ger en "bild" (kanske inte optimal) om man "jordar"
kontrastpinnen. Med en 10 k trimpot kan man justera kontrasten som
man vill ha den.
> Nu blir det inköp av transistorer imorgon...
Till vadå ?
Postat: 4 oktober 2006, 01:11:02
av xezer
Nu är det strax dags att lägga ner det här och gå och lägga sig, men innan;
Jag skrotade K8055an och stack till stan och köpte mig en PIC16F628A
Har suttit och försökt lista ut vad som är fel med koden i några timmar nu men kan inte finna vad det är
såhär ser kopplingen ut:
RB0 -> E
RB1 -> RS
RB2 -> RW
RB3-RB7 -> DB4-DB07
Finns säkert ett flertal konkreta fel som jag inte lagt märke till.
Tack på förhand!
Sodjan:
Det blev mycket bättre när man jordade kontrastpinnen, nu ser jag fyrkanterna

Ska se om Kjell&Co har någon trimpot imorgon.
Kanske missförstod, men jag trodde man skulle leda den svaga spänningen från K8055 till basen på en transistor och dra 5V där igenom?
Kod: Markera allt
DISP_E EQU b'00000001' ;Enable
DISP_RS EQU b'00000010' ;Register-select
DISP_RW EQU b'00000100' ;Read/Write
DISP_STAT EQU b'00000000' ;Håller i statusen för DISP_RS och DISP_RW
;*********************************************
;* Sänder data till display *
;*********************************************
DISPLAY_SEND:
IORLW DISP_STAT ;Lägger till eventuella status-bitar som E och RS
MOVWF PORTB ;Skickar till displayen
XORLW DISP_E ;Tar bort Enable
MOVWF PORTB
CALL Delay_5ms ;Dröjer 5mSek
XORLW W
MOVWF PORTB
RETURN
;*********************************************
;* Initiera display *
;*********************************************
DISPLAY_INIT:
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms
CALL Delay_5ms ;Låter displayen starta upp i 20mSek
MOVLW b'00011000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00011000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00011000'
CALL DISPLAY_SEND ; 8-bit
MOVLW b'00010000'
CALL DISPLAY_SEND ; 4-bit
MOVLW b'00010000'
CALL DISPLAY_SEND
MOVLW b'01000000'
CALL DISPLAY_SEND ; 2rader och 5x7pixlars font
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'01000000'
CALL DISPLAY_SEND ; Display off, curs off, blink off
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'00001000'
CALL DISPLAY_SEND ; Clear display
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'00110000'
CALL DISPLAY_SEND ; Display shift off
MOVLW b'00000000'
CALL DISPLAY_SEND
MOVLW b'01111000'
CALL DISPLAY_SEND ; Display on, curs on, blink on
RETURN
;*********************************************
;* Start rutinen *
;*********************************************
START:
;###Initiera PICen
MOVLW b'00000111'
MOVWF CMCON ;Alla pinnar ska vara digitala
BSF STATUS, RP0 ;Switchar till Bank1
MOVLW b'11111'
MOVWF TRISA ;Alla pinnar på PortA är inputs
MOVLW b'0000000'
MOVWF TRISB ;Alla pinnar på PortB är outputs
BCF STATUS, RP0 ;Switchar tillbaka till Bank0
;###
BSF DISP_STAT,DISP_E ;Sätter Enable pinnen
CALL DISPLAY_INIT ;Initiera displayen
BSF DISP_STAT,DISP_RS ;Sätter RS-flaggan så det är tecken vi handskas med nu
Postat: 4 oktober 2006, 13:17:08
av sodjan
Ett par småsaker...
R/W. Om du inte vill läsa från modulen, så kan du lägga den fast i "write" läge.
En pinne mindre att hantera...
> RB3-RB7 -> DB4-DB07
Hur har du kopplat 5 pinnar på PIC'en till 4 pinnar på modulen ???
Hur kommer koden till "START" ??
Jag för står inte hur "E" togglas i "DISPLAY_SEND", jo förresten, det gör jag,
men det var snårigt skrivet...
> RB1 -> RS
> DISP_RS EQU b'00000010'
> BSF DISP_STAT, DISP_RS
Detta stämmer inte överens.
RB1 är bit *1* i PORTB (alltså andra biten).
DISP_RS sätts till värdet 2 och BSF'en sätter bit 2 i DISP_STAT (alltså tredje biten).
> jag trodde man skulle leda den svaga spänningen från K8055 till basen på en transistor och dra 5V där igenom?
Jag vet inte hur K8055 ser ut, men det låter konstigt... Vilken "5V" och till vad ?
Postat: 4 oktober 2006, 14:32:02
av vfr
> RB1 -> RS
> DISP_RS EQU b'00000010'
> BSF DISP_STAT, DISP_RS
Detta stämmer inte överens.
RB1 är bit *1* i PORTB (alltså andra biten).
DISP_RS sätts till värdet 2 och BSF'en sätter bit 2 i DISP_STAT (alltså tredje biten).
För att förtydliga det sodjan skriver lite: Bit-parametern till "BSF" skall vara bitnumret (0-7) och inte en bitmask.
Postat: 4 oktober 2006, 14:34:56
av xezer
Lite framsteg, cursorn blinkar, fast vid 5:e tecknet och hela raden är fyllt med 4kanter.
Den verkar som sagt inte vilja clear:a vid initieringen, sen att den hoppar 5steg har jag ingen aning om varför.
Såhär ser initieringen ut nu:
0011
0011 ; 8-bit
0011
0010 ; 4bit!
0010
1000 ; 2rader och 5x7pixlars font
0000
1000 ; Display off, curs off, blink off
0000
0001 ; Clear display
0000
0110; Display shift off
0000
1111 ; Display on, curs on, blink on
Något jag missat?
Sodjan:
Det där med 5pinnar till 4pinnar är även för mig ett mysterium
RB4->RB7 ska det vara
Koden kommer till start genom:
Kod: Markera allt
ORG 0 ;Resettar vector addressen
GOTO RESET ;Hoppa till START vid boot
Ville inte posta för mycket kod, så försökte hålla mig till det som jag antog var fel. Fast det är klart, vad jag antar hör oftast inte hit då jag brukar ha fel
Detta stämmer inte överens.
RB1 är bit *1* i PORTB (alltså andra biten).
DISP_RS sätts till värdet 2 och BSF'en sätter bit 2 i DISP_STAT (alltså tredje biten).
Det där är ordnat nu

Postat: 4 oktober 2006, 14:39:06
av sodjan
> RB4->RB7 ska det vara
OK, men då ser detta konstigt ut :
> MOVLW b'00011000'
> CALL DISPLAY_SEND ; 8-bit
Du sätter RB3-RB6...
Håll reda på bitarna !!
EDIT :
V.v förklara vad du tror att "XORLW W" i DISPLAY_SEND gör !