ILI9488 mit SPI

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Nachtrag
      Das Ganze liess mir keine Ruhe und so habe ich folgenden (letzten ? ) Versuch gemacht: im Treiber von Hkipnik habe ich einfach bei den SPI-Routinen, die die Farbe übertragen, als 3tes Byte das 2. Byte nochmals wiederholt.
      Und siehe da; alles funktioniert :) (ausser die Farben natürlich :( )
      Auch muss ich meine Aussage von vorhin revidieren; durch das 3te Byte wird das Ganze etwa 10% langsamer da pro Pixel bis zu 11 Byte übertragen werden müssen.
      Also löschen ( absolut schnellste SPI-Einstellungen): <1 sec; zeichnen der verschiedenen Linien: ~5 sec. Alles mit dem oben angegebenen .bas-Programm (im .zip-File)

      Bild 4b.jpg

      Die Frage stellt sich nun wie kann man elegant die Farben in 3 Bytes unterbringen. Mir kommt da nur ein DWord in den Sinn wobei das 4. Byte dann leer ist und nur 3 Bytes übertragen werden.
      Leider bin ich in der Kombination Bascom / Assembler nicht sehr bewandert und weiss nicht wie man ein DWord an den Assembler übergibt. Wenn hier jemand helfen kann so würde ich die Treiberroutine anpassen. Wenn man weiss wie es geht ist es wahrscheinlich eine kleine Sache.

      P.S. leider brauche ich die vielen Beinchen des m1284 für viele andere Sachen.. ^^

      8tung: im Zuge meiner Suche habe ich festgestellt dass es den ILI9486 und den ILI9486L gibt. Gemäss Datenblatt kann der ILI9486L wie der ILI9488 spi nur als RGB 1-1-1 und RGB 6-6-6 (d.h. mit 3 Bytes pro Farbe wie der ILI9488) übertragen. Also Vorsicht!

      The post was edited 2 times, last by jepe ().

    • jepe wrote:

      pro Pixel bis zu 11 Byte übertragen werden müssen
      Ist das wirklich nötig? Dazu vielleicht später. Erstmal 3,Byte. Wäre das eine Lösung?

      Const Dblue = $00112233 '(Nicht wirklich blau)
      Dim Dcol As Dword: Dcol = $00445566

      Source Code

      1. Sub Lcd_set_pixel(byval X As Word , Byval Y As Word , Byval Color As Dword)
      2. Lcd_cs = 0
      3. Lcd_dc = 0
      4. !LDI R23, $2a
      5. !OUT spdr, R23
      6. Spi_10:
      7. !sbis spsr, spif
      8. !rjmp spi_10
      9. Lcd_cs = 1
      10. Lcd_cs = 0
      11. Lcd_dc = 1
      12. !ldd R26, Y+4
      13. !Ldd R27, Y+5
      14. !LD R10, X+
      15. !LD R11, X
      16. !OUT spdr, R11
      17. Spi_read0:
      18. !sbis spsr, spif
      19. !rjmp spi_read0
      20. Lcd_cs = 1
      21. Lcd_cs = 0
      22. !OUT spdr, R10
      23. Spi_read2:
      24. !sbis spsr, spif
      25. !rjmp spi_read2
      26. Lcd_cs = 1
      27. Lcd_cs = 0
      28. !OUT spdr, R11
      29. Spi_read3:
      30. !sbis spsr, spif
      31. !rjmp spi_read3
      32. Lcd_cs = 1
      33. Lcd_cs = 0
      34. !OUT spdr, R10
      35. Spi_read4:
      36. !sbis spsr, spif
      37. !rjmp spi_read4
      38. Lcd_cs = 1
      39. Lcd_cs = 0
      40. Lcd_dc = 0
      41. !LDI R23, $2b
      42. !OUT spdr, R23
      43. Spi_11:
      44. !sbis spsr, spif
      45. !rjmp spi_11
      46. Lcd_cs = 1
      47. Lcd_cs = 0
      48. Lcd_dc = 1
      49. !ldd R26, Y+2
      50. !Ldd R27, Y+3
      51. !LD R10, X+
      52. !LD R11, X
      53. !OUT spdr, R11
      54. Spi_ready7:
      55. !sbis spsr, spif
      56. !rjmp spi_ready7
      57. Lcd_cs = 1
      58. Lcd_cs = 0
      59. !OUT spdr, R10
      60. Spi_ready8:
      61. !sbis spsr, spif
      62. !rjmp spi_ready8
      63. Lcd_cs = 1
      64. Lcd_cs = 0
      65. !OUT spdr, R11
      66. Spi_ready9:
      67. !sbis spsr, spif
      68. !rjmp spi_ready9
      69. Lcd_cs = 1
      70. Lcd_cs = 0
      71. !OUT spdr, R10
      72. Spi_read8:
      73. !sbis spsr, spif
      74. !rjmp spi_read8
      75. Lcd_cs = 1
      76. Lcd_cs = 0
      77. Lcd_dc = 0
      78. !LDI R23, $2c
      79. !OUT spdr, R23
      80. Spi_12:
      81. !sbis spsr, spif
      82. !rjmp spi_12
      83. Lcd_cs = 1
      84. Lcd_cs = 0
      85. Lcd_dc = 1
      86. !ldd R26, Y+0
      87. !Ldd R27, Y+1
      88. !LD R10, X+
      89. !LD R11, X+
      90. !LD R12, X
      91. !OUT spdr, R12
      92. Spi_13:
      93. !sbis spsr, spif
      94. !rjmp spi_13
      95. Lcd_cs = 1
      96. Lcd_cs = 0
      97. !OUT spdr, R11
      98. Spi_14:
      99. !sbis spsr, spif
      100. !rjmp spi_14
      101. Lcd_cs = 1
      102. Lcd_cs = 0
      103. !OUT spdr, R10
      104. Spi_15:
      105. !sbis spsr, spif
      106. !rjmp spi_15
      107. Lcd_cs = 1
      108. End Sub
      Display All
    • jepe wrote:

      zeichnen der verschiedenen Linien: ~5 sec
      Wie wärs mit einer Box? Je nach Anfang und End Position kann das auch eine Linie sein. Allerdings leider nicht Diagonal:

      Source Code

      1. Dim Xw As Word , Yw As Word
      2. Macro Spiok
      3. !sbis spsr, spif
      4. !rjmp -3
      5. End Macro
      6. Sub Lcd_box(byval Xpos As Word , Byval Ypos As Word , Byval Xend As Word , Byval Yend As Word , Byval Color As Word)
      7. !ldd R26, Y+0 ' color adresse
      8. !Ldd R27, Y+1
      9. !LD R12, X+
      10. !LD R11, X+
      11. !LD R10, X
      12. Xw = Xend - Xpos
      13. Yw = Yend - Ypos
      14. Decr Xend
      15. Lcd_set_window Xpos , Ypos , Xend , Yend
      16. Lcd_cs = 0
      17. Lcd_dc = 1
      18. !lds r26,{xw}
      19. !lds r27,{xw}+1
      20. Blop0:
      21. !lds r30,{yw}
      22. !lds r31,{yw}+1
      23. Blop1:
      24. !OUT spdr, R10
      25. Spiok
      26. !OUT spdr, R11
      27. Spiok
      28. !OUT spdr, R12
      29. Spiok
      30. !sbiw r30,1
      31. !brne blop1
      32. !sbiw r26,1
      33. !brne blop0
      34. Lcd_cs = 1
      35. End Sub
      Display All
      Dünne Linien in kaum erfassbarer Zeit. Eine die den ganzen Schirm füllt ca 1Sekunde
    • @Pluto25
      Es werden bis zu 14 Byte für das Setzen eines Pixels benötigt ((1 Byte Befehl, 4 Byte Column Address Set, 1 Byte Befehl, 4 Byte Page Address Set, 1 Byte Befehl, 3 Byte Farbe RGB). Und damit wird 1 Pixel gesetzt :(


      Ich habe dein Beispiel von heute morgen als Vorlage genommen und die Routine sowie die Deklaration für 3-Byte-Farben angepasst. Funktioniert jetzt alles.
      Die Bilderausgabe habe ich aus der Routine entfernt da ich deren Farbinformation nicht kenne und damit nicht auf 3Byte umrechnen kann.
      Beim Ändern der Routine habe ich bemerkt dass bei einer Bildausgabe von 24-Bit-Farbe auf 16-Bit-Farbe umgerechnet wurde. Dies hat bei mir zur Idee geführt dass es auch möglich wäre weiter mit 16-Bit Farben zu operieren. Dazu müsste die Farbinformation von den 16Bit-Farben in 2 Byte auf 18-Bit-Farben in 3 Byte umgerechnet werden. Wäre auch möglich.
      Ich bin momentan zufrieden das alles was ich brauche funktioniert. Ich stelle damit das Resultat ( ILI9488_declarations_spi.inc und ILI9488_routines_spi.inc) zur Verfügung. Als Test für die Routinen steht die ILI_480x320.bas zur Verfügung.


      ILI9488_480x320.zip
      ILI9488_declarations_spi.zip
      ILI9488_routines_spi.zip


      P.S. "Dünne Linien in kaum erfassbarer Zeit. Eine die den ganzen Schirm füllt ca 1Sekunde" dies entspricht dem Löschen des Bildschirms mir z.B. schwarz; ist bei mir gleich "schnell"
    • Guten Abend!

      Die Jungs haben ein neues Display gekauft und den oben geposteten Code verwendet, aber irgendwie werden die Farben nicht richtig angezeigt (es gibt überhaupt kein Rot), andere Bibliotheken für ili9481-86 funktionieren überhaupt nicht, hat jemand versucht zu arbeiten mit diesem Display und damit es funktioniert?

      Danke im Voraus an alle die helfen werden.
      Files
      • DSCN6059.JPG

        (496.93 kB, downloaded 12 times, last: )
      • DSCN6050.JPG

        (645.41 kB, downloaded 9 times, last: )
      • DSCN6060.JPG

        (342.8 kB, downloaded 8 times, last: )
      • DSCN6052.JPG

        (568.7 kB, downloaded 11 times, last: )
    • ändere das mal in der Sub LCD_INIT so ab.

      BASCOM Source Code

      1. #if Lcd_mode = 1
      2. Call Lcd_write_command(&H36)
      3. Call Lcd_write_data(&B0100_0000)
      4. #elseif Lcd_mode = 2
      5. Call Lcd_write_command(&H36)
      6. Call Lcd_write_data(&B1000_0000)
      7. #elseif Lcd_mode = 3
      8. Call Lcd_write_command(&H36)
      9. Call Lcd_write_data(&B1110_0000)
      10. #elseif Lcd_mode = 4
      11. Call Lcd_write_command(&H36)
      12. Call Lcd_write_data(&B0010_0000)
      13. #endif
      Display All