Aansturen GLCD met SED1531

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.

Just find out what you like and let it kill you

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:

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

http://www.uploadarchief.net/files/download/resized/glcd_adapter_result.jpg

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.

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?

Just find out what you like and let it kill you

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.

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.

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.

Just find out what you like and let it kill you

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.

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".

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.

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.

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 maandag 24 december 2012 02:21:51 (25%)

Just find out what you like and let it kill you

SPAM

[Bericht gewijzigd door Hugo Welther op maandag 24 december 2012 08:11:29 (100%)

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 maandag 24 december 2012 11:46:07 (14%)

@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.

Just find out what you like and let it kill you

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 dinsdag 25 december 2012 16:01:34 (21%)

Do Androids Dream of Electric Sheep?

@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:

bascom code:

'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 Sub

Als 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 dinsdag 25 december 2012 22:34:41 (88%)

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.
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:

  1. 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.
  2. 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.
  3. 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.
  4. 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 donderdag 27 december 2012 15:19:55 (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.

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 ;-)

code:

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
Do Androids Dream of Electric Sheep?

code:

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:

pic basic code:


    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 donderdag 27 december 2012 22:53:54 (58%)

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.

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.

Just find out what you like and let it kill you

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.

Do Androids Dream of Electric Sheep?
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.

Patrick, goed bezig ! Leuk om te lezen dat er nog meer mensen met dit display bezig zijn.

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 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.

Just find out what you like and let it kill you