hadv
Just find out what you like and let it kill you
Heeft er hier iemand ervaring met het aansturen van een GLCD met SED1531 controller.
Ik heb arduino code, maar vertaald naar PicBasic doet dit niets.
Er is een datasheet, maar die is onvolledig.
PicBasic of Pic assembler hebben mijn voorkeur, maar een goede uitleg kan ook al een stuk helpen.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Ik heb via V&A 100 van deze displays gekocht, toen 2 weken zitten stoeien, uiteindelijk kwam ik er achter dat de pinlayout in het datasheet niet correct was en de init sequence.
Hieronder mijn werkende Bascom code:
'******************************************************************************
' *
' Filename: sed1531_v0.4.bas *
' Date: 20-07-2012 *
' Last update: 26-07-2012 *
' File Version: 0.4 *
' Size: 2560 Suitable for demoversion Bascom: Yes *
' Author: Roland van Leusden sayang@zonnet.nl *
' *
' Text demo for the MG1004A-SYL-4 GLCD from Everbouquet International Co. *
' Controller: SED1531 Size: 48 * 100 *
'******************************************************************************
'Pin layout display:
' 1 2 3 4 5 6 7 8 9 10 11 12 13 14
' GND 5V BL A0 RW E DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
'
' Connect BL to GND to turn on backlight
' NOTE: Pinlayout in datasheet is NOT correct !
'
'---------------------------
'Read from display :
'Set R/W high, set E high enable outputs
'---------------------------
'Write to display
'Set R/W low, on E neg.edge data will be latched into display
'---------------------------
$regfile = "m8535.dat"
$crystal = 4000000
Config Portd = Output ' Dataport
Config Portc = Output 'Controlport
E Alias Portc.0 ' Enable
Rw Alias Portc.1 ' R = 1 W = 0
A0 Alias Portc.2 ' Command = 0 Data = 1
Display_power Alias Portc.7 'VDD Display
Declare Sub Lcdinit()
Declare Sub Write_cmd_display(byval Cmd As Byte)
Declare Sub Write_data_display(byval Dat As Byte)
Declare Sub Set_marker(byval Marker As Byte , Byval Aan_uit As Byte)
Declare Sub Lcd_char(byval Text As String )
Declare Sub Set_row(byval Row As Byte)
Dim X As Byte
'Main
Reset Display_power
Wait 1
Set Display_power
Wait 3 'Display needs some time after powerup
Call Lcdinit()
Wait 1
Call Set_row(1) 'Write some characters
Call Lcd_char( "0123456789")
Call Set_row(2)
Call Lcd_char( "ABCDEFGHIJKLMN")
Call Set_row(3)
Call Lcd_char( "opqrstuvwxyz")
Call Set_row(4)
Call Lcd_char( "!#$%&'( )@^-")
Call Set_row(5)
Call Lcd_char( "*+-/<>?;:[]")
Call Set_row(6)
Call Lcd_char( "Bascom Rocks !")
Do
Call Set_marker(4 , 1) 'Make the battery sign blink
Waitms 400
Call Set_marker(4 , 0)
Waitms 400
Loop
End 'end program
'LCD Init commands
'******************************************************************************************
Sub Lcdinit() 'the followingactions are performed to init the lcd
Call Write_cmd_display(&He2) 'reset display by soft
Wait 1
Call Write_cmd_display(&Ha1) 'ADC select
Call Write_cmd_display(&Ha2) 'lcd bias 1/8
Call Write_cmd_display(&H2c) 'power
Call Write_cmd_display(&H2e) 'power
Call Write_cmd_display(&H2f) 'power
Call Write_cmd_display(&Ha6) 'normal / reverse
Call Write_cmd_display(&H8f) 'set electronic control
Call Write_cmd_display(&Ha4) 'display off
Call Write_cmd_display(&Haf) 'display on
Call Write_cmd_display(&H40) 'sel dram line 1 for com1
End Sub
'Put COMMAND to display (for configuration purpose)
'******************************************************************************************
Sub Write_cmd_display(byval Cmd As Byte)
Reset Rw
Reset A0
Portd = Cmd
Set E
Waitus 10
Reset E
Waitus 10
Set E
End Sub
' Put DATA to display (pixel data)
'******************************************************************************************
Sub Write_data_display(byval Dat As Byte)
Reset Rw
Set A0
Portd = Dat
Set E
Waitus 10
Reset E
Waitus 10
Set E
End Sub
' Select the row where to write the text
'******************************************************************************************/
Sub Set_row(byval Row As Byte)
Dim Page As Byte
Select Case Row
Case 1 : Page = &HB0
Case 2 : Page = &HB1
Case 3 : Page = &HB2
Case 4 : Page = &HB3
Case 5 : Page = &HB4
Case 6 : Page = &HB5
End Select
Call Write_cmd_display(page)
Call Write_cmd_display(&H08)
Call Write_cmd_display(&H00)
Call Lcd_char( " ") 'Make page empty
Call Write_cmd_display(page)
Call Write_cmd_display(&H08)
Call Write_cmd_display(&H00)
End Sub
' Control de markers boven in het display
'******************************************************************************************/
Sub Set_marker(byval Marker As Byte , Byval Aan_uit As Byte)
'MARKER1 20 // pijltjes boven elkaar
'MARKER2A 31 // 2 horiz. streepjes van barcode
'MARKER2B 32 // barcode
'MARKER3 57 // batterij
'MARKER4 69 // sterretje
'MARKER5 78 // pijltje UP
Dim High_nibble As Byte ' 0001 A7 A6 A5 A4
Dim Low_nibble As Byte ' 0000 A3 A2 A1 A0
Select Case Marker
Case 1 : Marker = 20
Case 2 : Marker = 31
Case 3 : Marker = 32
Case 4 : Marker = 57
Case 5 : Marker = 69
Case 6 : Marker = 78
End Select
Low_nibble = Marker And &B00001111 'mask out upper nibble
High_nibble = Marker 'copy original Value to Highnibble
Shift High_nibble , Right , 4 'Shift upper 4 bits to lower 4 bits
Set High_nibble.4 'Set 5th bit
Call Write_cmd_display(&Hb6) 'SET PAGE ADDRESS
Call Write_cmd_display(high_nibble) 'SET COLUMN ADDRESS HIGH NIBBLE
Call Write_cmd_display(low_nibble) 'SET COLUMN ADDRESS LOW NIBBLE
If Aan_uit = 1 Then
Call Write_data_display(&H01);
Else
Call Write_data_display(&H00);
End If
End Sub
' Send text string to display
'******************************************************************************************/
Sub Lcd_char(byval Text As String )
Dim Tempdata As Byte , Tempbyte As Integer , Chars As Byte , Charcount As Byte , Tempstring As String * 1
Charcount = Len(text) 'Count the number of characters in the string
If Charcount > 16 Then 'There is only room for 16 characters
Charcount = 16
End If
Call Write_cmd_display(&He0) 'Start Read-Modify-Write
For Chars = 1 To Charcount 'do the loop as much as there are characters
Tempstring = Mid(text , Chars , 1) 'Take out 1 character that we need to handle now
Tempbyte = Asc(tempstring) 'Get the ascii value of this character
Tempbyte = Tempbyte - 32 'Character table starts at Ascii-32, so deduct 32 to get it even with the ascii table
Tempbyte = Tempbyte * 5 'Font 5x7
Restore Characterslookup 'Rewind ASCII table
For X = 1 To 5
Tempdata = Lookup(tempbyte , Characterslookup) 'Read data from ASCII table for this character
Call Write_data_display(tempdata) 'And send to LCD
Tempbyte = Tempbyte + 1
Next
Call Write_data_display(&H00) 'Empty Row, spacing between characters
Next
Call Write_cmd_display(&Hee) 'End Read-Modify-Write
End Sub
Characterslookup: '5x7 Font
Data &H00 , &H00 , &H00 , &H00 , &H00 '(space)
Data &H00 , &H00 , &H5F , &H00 , &H00 '!
Data &H00 , &H07 , &H00 , &H07 , &H00 '"
Data &H14 , &H7F , &H14 , &H7F , &H14 '#
Data &H24 , &H2A , &H7F , &H2A , &H12 '$
Data &H23 , &H13 , &H08 , &H64 , &H62 '%
Data &H36 , &H49 , &H55 , &H22 , &H50 '&
Data &H00 , &H05 , &H03 , &H00 , &H00 ' '
Data &H00 , &H1C , &H22 , &H41 , &H00 '(
Data &H00 , &H41 , &H22 , &H1C , &H00 ')
Data &H08 , &H2A , &H1C , &H2A , &H08 '*
Data &H08 , &H08 , &H3E , &H08 , &H08 '+
Data &H00 , &H50 , &H30 , &H00 , &H00 ',
Data &H08 , &H08 , &H08 , &H08 , &H08 '-
Data &H00 , &H60 , &H60 , &H00 , &H00 '.
Data &H20 , &H10 , &H08 , &H04 , &H02 '/
Data &H3E , &H51 , &H49 , &H45 , &H3E '0
Data &H00 , &H42 , &H7F , &H40 , &H00 '1
Data &H42 , &H61 , &H51 , &H49 , &H46 '2
Data &H21 , &H41 , &H45 , &H4B , &H31 '3
Data &H18 , &H14 , &H12 , &H7F , &H10 '4
Data &H27 , &H45 , &H45 , &H45 , &H39 '5
Data &H3C , &H4A , &H49 , &H49 , &H30 '6
Data &H01 , &H71 , &H09 , &H05 , &H03 '7
Data &H36 , &H49 , &H49 , &H49 , &H36 '8
Data &H06 , &H49 , &H49 , &H29 , &H1E '9
Data &H00 , &H36 , &H36 , &H00 , &H00 ':
Data &H00 , &H56 , &H36 , &H00 , &H00 ';
Data &H00 , &H08 , &H14 , &H22 , &H41 '<
Data &H14 , &H14 , &H14 , &H14 , &H14 '=
Data &H41 , &H22 , &H14 , &H08 , &H00 '>
Data &H02 , &H01 , &H51 , &H09 , &H06 '?
Data &H32 , &H49 , &H79 , &H41 , &H3E '@
Data &H7E , &H11 , &H11 , &H11 , &H7E 'A
Data &H7F , &H49 , &H49 , &H49 , &H36 'B
Data &H3E , &H41 , &H41 , &H41 , &H22 'C
Data &H7F , &H41 , &H41 , &H22 , &H1C 'D
Data &H7F , &H49 , &H49 , &H49 , &H41 'E
Data &H7F , &H09 , &H09 , &H01 , &H01 'F
Data &H3E , &H41 , &H41 , &H51 , &H32 'G
Data &H7F , &H08 , &H08 , &H08 , &H7F 'H
Data &H00 , &H41 , &H7F , &H41 , &H00 'I
Data &H20 , &H40 , &H41 , &H3F , &H01 'J
Data &H7F , &H08 , &H14 , &H22 , &H41 'K
Data &H7F , &H40 , &H40 , &H40 , &H40 'L
Data &H7F , &H02 , &H04 , &H02 , &H7F 'M
Data &H7F , &H04 , &H08 , &H10 , &H7F 'N
Data &H3E , &H41 , &H41 , &H41 , &H3E 'O
Data &H7F , &H09 , &H09 , &H09 , &H06 'P
Data &H3E , &H41 , &H51 , &H21 , &H5E 'Q
Data &H7F , &H09 , &H19 , &H29 , &H46 'R
Data &H46 , &H49 , &H49 , &H49 , &H31 'S
Data &H01 , &H01 , &H7F , &H01 , &H01 'T
Data &H3F , &H40 , &H40 , &H40 , &H3F 'U
Data &H1F , &H20 , &H40 , &H20 , &H1F 'V
Data &H7F , &H20 , &H18 , &H20 , &H7F 'W
Data &H63 , &H14 , &H08 , &H14 , &H63 'X
Data &H03 , &H04 , &H78 , &H04 , &H03 'Y
Data &H61 , &H51 , &H49 , &H45 , &H43 'Z
Data &H00 , &H00 , &H7F , &H41 , &H41 '[
Data &H02 , &H04 , &H08 , &H10 , &H20 '\
Data &H41 , &H41 , &H7F , &H00 , &H00 ']
Data &H04 , &H02 , &H01 , &H02 , &H04 '^
Data &H40 , &H40 , &H40 , &H40 , &H40 '_
Data &H00 , &H01 , &H02 , &H04 , &H00 '`
Data &H20 , &H54 , &H54 , &H54 , &H78 'a
Data &H7F , &H48 , &H44 , &H44 , &H38 'b
Data &H38 , &H44 , &H44 , &H44 , &H20 'c
Data &H38 , &H44 , &H44 , &H48 , &H7F 'd
Data &H38 , &H54 , &H54 , &H54 , &H18 'e
Data &H08 , &H7E , &H09 , &H01 , &H02 'f
Data &H08 , &H14 , &H54 , &H54 , &H3C 'g
Data &H7F , &H08 , &H04 , &H04 , &H78 'h
Data &H00 , &H44 , &H7D , &H40 , &H00 'i
Data &H20 , &H40 , &H44 , &H3D , &H00 'j
Data &H00 , &H7F , &H10 , &H28 , &H44 'k
Data &H00 , &H41 , &H7F , &H40 , &H00 'l
Data &H7C , &H04 , &H18 , &H04 , &H78 'm
Data &H7C , &H08 , &H04 , &H04 , &H78 'n
Data &H38 , &H44 , &H44 , &H44 , &H38 'o
Data &H7C , &H14 , &H14 , &H14 , &H08 'p
Data &H08 , &H14 , &H14 , &H18 , &H7C 'q
Data &H7C , &H08 , &H04 , &H04 , &H08 'r
Data &H48 , &H54 , &H54 , &H54 , &H20 's
Data &H04 , &H3F , &H44 , &H40 , &H20 't
Data &H3C , &H40 , &H40 , &H20 , &H7C 'u
Data &H1C , &H20 , &H40 , &H20 , &H1C 'v
Data &H3C , &H40 , &H30 , &H40 , &H3C 'w
Data &H44 , &H28 , &H10 , &H28 , &H44 'x
Data &H0C , &H50 , &H50 , &H50 , &H3C 'y
Data &H44 , &H64 , &H54 , &H4C , &H44 'z 122
Data &H00 , &H08 , &H36 , &H41 , &H00 '{ 123
Data &H00 , &H00 , &H7F , &H00 , &H00 '| 124
Data &H00 , &H41 , &H36 , &H08 , &H00 '} 125
Data &H08 , &H08 , &H2A , &H1C , &H08 '-> 126
Data &H08 , &H1C , &H2A , &H08 , &H08 '<- 127
hadv
Just find out what you like and let it kill you
Hoi Roland,
Bedankt hoor!
Ik ga het er mee proberen.
Overigens is in de datasheet die ik heb de pinout gelijk aan wat jij hebt beschreven, blijkbaar een andere datasheet.
Is het trouwens nodig om het display aan te sturen via een I/O pin, kan die niet direct aan de voeding?
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Kan direct aan de voeding. Ik had het gedaan omdat het display na power-up vrij traag is, je moet ongeveer 3 sec wachten voordat je de init stuurt.
Er zijn 2 datasheets in omloop, de originele van Everbouquet met fout, en een gecorrigeerde van de verkoper van de displays.
Ik heb ook nog code met de 74HC164 wat je een aantal pinnen op je uC bespaard.
hadv
Just find out what you like and let it kill you
I/O pinnen is het probleem niet.
Bedankt over de wachttijd.
En vooral bedankt voor je code, ik zeg niet dat het al feilloos werkt, maar ik krijg nu voor het eerste pixels op het display, dus het doet nu in ieder geval iets.
Op 23 december 2012 22:06:15 schreef Roland van Leusden:
Kan direct aan de voeding. Ik had het gedaan omdat het display na power-up vrij traag is, je moet ongeveer 3 sec wachten voordat je de init stuurt.
Vreemd ik heb het probleem dat ik het display wel geinitialiseert krijg direct nadat de spanning er op gezet wordt. Maar als ik dan de uController reset krijg ik het display niet meer geinitialiseert. Code die ik gebruik is voor een arduino en gebaseert op de Bascom code van jou. Enige wijziging die ik heb aangebracht is dat ik ook een 74164 gebruik om wat datalijnen te sparen.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Maar als ik dan de uController reset krijg ik het display niet meer geinitialiseert.
Dan hang je de voeding van het display aan een I/O pin, zo kun je dan ook het display "resetten".
Vind ik niet erg netjes. Daar bij wil ik ook de backlight gebruiken dus dan moet het al via een fet. Als het echt niet anders kan ga ik dat wel doen.
hadv
Just find out what you like and let it kill you
Roland!
Het werkt. Na wat ultrastomme fouten mijnerzijds (nee, ik ga ze niet vertellen, ik schaam mij diep, wou weer veel te snel en lette dus niet goed op) heb ik nu het hele display vol met karakters.
Oftewel, U is van harte bedankt.
Zoals mijn grootmoeder, moge zij rusten in vrede, altijd zei: Hulde, Hulde, geen bloemen maar een gulden!.
Nou nog wat nette macro's koekebakken.
@driessens_nl: die kun je toch gewoon aan de ground hangen, doe ik ook, werkt prima, geen FET nodig.
Bij mij hangt het display direct aan de voeding en pin 3 aan de ground.
[Bericht gewijzigd door hadv op (25%)]
Op 24 december 2012 02:18:56 schreef hadv:
@driessens_nl: die kun je toch gewoon aan de ground hangen, doe ik ook, werkt prima, geen FET nodig.
Bij mij hangt het display direct aan de voeding en pin 3 aan de ground.
Klopt, maar mijn probleem is dat als ik het display eenmaal geinitialiseert heb en dan de uContr. reset ik het display niet meer aan de praat krijg. De door Roland aangedragen oplossing is om de Vcc aan een I/O pin te hangen en die even laagte maken en dan weer hoog om zo het dislay zijn ingebouwde power-on reset te laten doen.
Maar als ik de Vcc aan een I/O pin hang moet die ook de stroom leveren van de backlight (+/- 80mA) en dat is te veel.
KAn jij een proberen wat er gebeurt als je de uCont. reset nadat het display geinitialiseert is ?
Edit: probleem opgelost. Ik had al het E en A0 signaal naar massa getrokken middels een 10k weerstand om geen rotzooi het display in te klokken gedurende een reset als de E en A0 zwevend zijn. Maar helaas was ik vergeten de weerstanden hiervoor aan massa te leggen 
[Bericht gewijzigd door driessens_nl op (14%)]
hadv
Just find out what you like and let it kill you
@Roland: heb jij al geprobeerd de data van het display RAM te lezen.
Ik wil nl. pixels aan- en uitzetten zonder de andere pixels in die rij/kolom te veranderen. Dan moet ik uiteraard eerst het byte van die rij/kolom uitlezen en het gewenste bit (re)setten en vervolgens terugschrijven.
In mijn datasheet staat dat ik het volgende moet doen:
RW: 1
A0: 1
E: 0
Uiteraard na de juiste rij en kolom te hebben geadresseerd.
Maar wat ik dan op de poort ontvang lijkt nog het meeste op de lower adress nibble van de kolom.
Het timing diagram helpt me hier niet echt bij, daar lijkt het er op dat E wel degelijk naar 1 moet gaan.
Verder staat daar nog:
Enable Read low pulse width 70 ns min
Enable Read high pulse width 70 ns min
Ik heb al het eea aan combinatie's geprobeerd, maar het resultaat is telkens hetzelfde.
droid
Do Androids Dream of Electric Sheep?
Het viel mij ook op dat Enable voor lezen laag zou moeten zijn. Erg onlogisch, dan krijg je conflicten als je meerdere displays of andere dingen parallel op de databus hangt.
Heb het nog niet geprobeerd, maar denk dat E en Rw beide gewoon hoog moet zijn voor lezen. Met de A0 maak je dan keuze uit status of data lezen.
Uit het timingdiagram haal ik dat na Enable=hoog de databus na max 70ns stabiel is om te lezen. En stabiel blijft tot 50ns na het weer laag worden.
Edit: bovenstaande is gebaseerd op het timing diagram!
Nu ik mijn software nog eens bekeek, is Enable juist aktief LOW.
Zoals in het plaatje CS1~
Overigens zojuist wat zitten proberen om het display uit te lezen, maar zonder resultaat.
[Bericht gewijzigd door droid op (21%)]
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
@Roland: heb jij al geprobeerd de data van het display RAM te lezen.
Nee, aangezien ik de displays voornamelijk voor tekst gebruik. Ik heb wel wat lijntjes ed getekend.
<Edit>
Code om een pixel te zetten:
'Turn a pixel on x,y position on
'*******************************************************************************
Sub Set_pix(byval Gx As Byte , Byval Gy As Byte)
Local Pixpos As Byte
Local Pixrow As Byte
Local Pixdata As Byte
'check boundaries
If Gx > 100 Then
Gx = 100
End If
If Gy > 48 Then
Gy = 48
End If
'First determine row based on Gy
Pixrow = Gy / 8 'Get the row
Pixpos = Gy Mod 8 'Get the position in row (Bit 0 ~ 7)
If Pixpos = 0 Then
Pixpos = 7 'Position 40 => Row 5 Bit 7
Else
Pixrow = Pixrow + 1 'Position 41 => Row 6 Bit 1
Pixpos = Pixpos - 1 'Position 1 is position 0 in Byte
End If
Pixdata = 0 'Clear previous, this will clear 7 other pixels as well...
Set Pixdata.pixpos 'Set new
Call Set_row(pixrow)
' Process Gx position in row
Gx = Gx - 1 'People start at 1, display at 0
Call Set_col(gx)
Call Write_data_display(pixdata)
End Sub
' Select the Row where to write
'*******************************************************************************
Sub Set_row(byval Row As Byte)
Select Case Row
Case 1 : Page = &HB0
Case 2 : Page = &HB1
Case 3 : Page = &HB2
Case 4 : Page = &HB3
Case 5 : Page = &HB4
Case 6 : Page = &HB5
End Select
Call Write_cmd_display(page)
Call Set_col(0)
End Sub
' Select the Column where to write
'*******************************************************************************
Sub Set_col(byval Col As Byte)
Local High_nibble As Byte ' 0001 A7 A6 A5 A4
Local Low_nibble As Byte ' 0000 A3 A2 A1 A0
Low_nibble = Col And &B00001111 'mask out upper nibble
High_nibble = Col 'copy original Value to Highnibble
Shift High_nibble , Right , 4 'Shift upper 4 bits to lower 4 bits
Set High_nibble.4 'Set 5th bit
Call Write_cmd_display(high_nibble) 'SET COLUMN ADDRESS HIGH NIBBLE
Call Write_cmd_display(low_nibble) 'SET COLUMN ADDRESS LOW NIBBLE
End SubAls je in write_data "Set RW" doet ipv "Reset RW" zou het mi moeten werken. Kan op het moment zelf niets testen aangezien ik printjes met de 74HC164 heb waar terug lezen helemaal niet kan en RW hard aan Gnd ligt.
[Bericht gewijzigd door Roland van Leusden op (88%)]
Patrick de Zeester
Golden Member
Zelf heb ik ook een aantal van deze displays van de samenkopen.net actie. Op basis van een ATtiny2313 en dit display wat geëxperimenteerd en een programmaatje gemaakt dat op basis van read-modify-write pixels op het display aan kan zetten.
Mijn observaties:
- Reset gedrag is wat tricky, en niet echt gedocumenteerd. Het display kan wat nukkig reageren als de reset procedure niet helemaal naar zijn zin verloopt. Echter na power-up hoef je geen 3 seconden te wachten. Ik heb zelf een delay van 50 ms na power-up gebruikt voordat ik het reset commando stuur. Het reset commando wordt gevolgd door nogmaals een delay van 50 ms (belangrijk, reset werkt niet betrouwbaar als zonder delay commando's volgen) voordat ik andere commando's stuur. Voor de rest heb ik geen andere delays in de opstartfase nodig gehad. Dit werkt bij mij betrouwbaar, zowel bij koude start (voedingslijn even kort gesloten) als warme start (uC reset) uitgeprobeerd op meerdere displays met meerdere voedingspanningen. Waarschijnlijk kan het nog wel wat sneller, maar omdat de datasheet hier niets over zegt blijft het een gok. Wellicht kan het "read status" commando uitkomst bieden.
- De E lijn reageert op flanken, niet op level. Bij schrijven wordt data op D0-D7 door het display overgenomen als de E van 1 naar 0 gaat. Bij het lezen zal het display data op D0-D7 zetten nadat E van 0 naar 1 is gegaan. Het timing diagram suggereert ook dat E edge triggered is.
- Het timing characteristics stukje van de datasheet lijkt hier en daar wat optimistisch. Met de tijden die daarin gespecificeerd staan zou een ATtiny2313 op 1 MHz nooit te snel moeten zijn voor het display. Echter de ervaring leert dat er toch wel een instructie moet zitten tussen het lezen/schrijven van D0-D7 en het toggelen van de E lijn. Bijvoorbeeld bij lezen van data moet je nadat E van 0 naar 1 is gezet ongeveer 1 µS wachten voordat je D0-D7 uitleest, anders krijg je verminkte data.
- Bij het lezen van display data zal je na het zetten van de page en het column adres eerst een dummy read actie moeten doen. Concreet betekent dit dat je de E lijn 1 keer extra moet toggelen voordat je de data lijnen kan uitlezen. Dit staat niet in de datasheet van de samenkopen actie, maar wel in de SED1530 datasheet.
Op 27 december 2012 15:02:54 schreef Patrick de Zeester:
[*] Bij het lezen van display data zal na het zetten van de page en het column adres eerst een dummy read actie moeten doen. Concreet betekent dit dat je de E lijn 1 keer extra moet toggelen voordat je de data lijnen kan uitlezen. Dit staat niet in de datasheet van de samenkopen actie, maar wel in de SED1530 datasheet.
Net tot dezelfde conclusie gekomen en berichtje getikt op samenkopen
, dus hier te laat.
Een nuttige tip: leg het E signaal met een weerstand van 10k aan massa. Gedurende een reset van de uProc zijn de uitgangen hoogohmig en wordt het E signaal eigenlijk niet aangestuurd. Hierdoor kunnen verkeerde commando's het display ingeklokt worden.
[Bericht gewijzigd door driessens_nl op (16%)]
Patrick de Zeester
Golden Member
Goede tip, ik had al hetzelfde gedaan met de RW lijn, omdat bij mijn opstelling de programmer een aantal lijnen deelt met het display, en het wat vervelend is als het display tijdens het programmeren gaat meebabbelen.
droid
Do Androids Dream of Electric Sheep?
Eindelijk met succes betrouwbaar het statusregister kunnen uitlezen.
Zoals ik verwachtte totaal geen vertragingen nodig op 20Mhz.
Data is stabiel ca 50ns na Enable 'hoog' (volgens datasheet max 70ns) dus in orde.
Moest mijn logic analyzer erbij halen om er achter te komen, dat je niet moet vergeten om de port van een PIC om te schakelen naar ingang om te kunnen lezen 
Vroegah: Toen je nog echte databussen had, die waren bidirectioneel 
rdData:
TRISB = %11111111 ;PortB input
Rw=1 : En=1
dataIn = databus ;lees databus display, Port B
En=0 : Rw=0
TRISB = %00000000 ;PortB terug output
RETURNhadv
Just find out what you like and let it kill you
rdData: TRISB = %11111111 ;PortB input Rw=1 : En=1 dataIn = databus ;lees databus display, Port B En=0 : Rw=0 TRISB = %00000000 ;PortB terug output RETURN
dat omschakelen van de poort duurde bij mij ook even...
@Patrick: dat van die dummy read stond ook in die andere datasheet, maar omdat die onvolledig was werd het niet duidelijk wat dat dan moest inhouden.
Bedankt voor de opmerking over het "flank toggelen" van de Enable, daar zit dus blijkbaar de crux.
wat ik nu heb voor lezen is dit (18F452 op 20 MHz:
ReadP = 0 ; poort
dTris = %11111111 ; bijbehorende Tris
cA0 = 1
cRW = 1
DelayUS 1
; dummy
cEN = 0
DelayUS 2
cEN = 1
DelayUS 2
; actual
cEN = 0
DelayUS 2
cEN = 1
DelayUS 2
aRead = ReadP
DelayUS 2
cEN = 0
dTris = %00000000
Ik ben nog niet helemaal tevreden met het resultaat, maar dat kan aan andere zaken dan dit liggen 
[Bericht gewijzigd door hadv op (58%)]
hadv
Just find out what you like and let it kill you
Dank dank.
Het onderdrukken van de regels tussen 'dummy' en 'actual' maakt bij mij niets uit.
Ik heb nu een routine die pixels aan- en uit kan zetten. Jottem.
hadv
Just find out what you like and let it kill you
Ik heb mijn code op het upload archief geplaatst, hier: http://www.uploadarchief.net/files/download/glcd_sed1531.zip
De zip bevat een uitgebreide datasheet (dank @driessens_nl), 4 .inc bestanden en een .bas bestand die een demo bevat om te laten zien hoe je de .inc bestanden kunt gebruiken.
droid
Do Androids Dream of Electric Sheep?
Heb ook even geupload wat ik tot nu toe gebrouwen heb.
http://www.uploadarchief.net/files/download/glcd_picbasic.bas
Verschillende lees en schrijf routines die goed werken.
Heb een begin gemaakt met grafische lijnen, maar daar gaat nog wel wat meer tijd in zitten.
Patrick de Zeester
Golden Member
Ik ben bezig met C library die functies biedt om teksten, rechthoeken, lijnen en pixels op het schermpje te zetten. Een voorproefje kan je hier vinden: https://www.youtube.com/watch?v=TQqIEX8LDhk
Op dit moment gebruik ik een Atmel ATtiny2313; deze zat toevallig nog in het breadboard, maar 2K flash is wel wat krap voor deze toepassing. Ik verwacht dat deze library relatief eenvoudig om te zetten is naar andere microcontrollers omdat het in C geschreven is en alle microcontroller specifieke zaken in een apart bestand staan.
Nadat ik de code een beetje gefatsoeneerd heb zal deze op sourceforge of een andere code sharing site plaatsen.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
hadv
Just find out what you like and let it kill you
Ik heb een nieuwe versie van mijn code op het archief gezet: http://www.uploadarchief.net/files/download/glcd_sed1531%20v2.zip.
Nieuw in deze versie is het tekenen van lijnen. Het algorithme is een conversie van dat van Bresenham.
Wellicht dat iemand zin heeft om het algorithme wat te versnellen dmv de RMW functionaliteit.