xmega32e5 i jakiś wyświetlacz graficzny

Rodzina procesorów bogatszych w wiele nowych rozwiązań i dlatego warto po nie sięgnąć.
ODPOWIEDZ
krolikbest
Posty: 23
Rejestracja: 10 maja 2022, 13:25

xmega32e5 i jakiś wyświetlacz graficzny

Post autor: krolikbest » 30 maja 2022, 11:22

Cześć,
robię sterowanie do monitorowania poziomu cieczy i chciałbym to ładnie zilustrować na oled1.3''. Problem z tym, że nie udało mi sie dostosować znalezionej biblioteki sh1106 do współpracy z xmegą32e5. Biblioteka w załączniku. Kod programu poniżej, w bibliotece trzeba rejestr twie zamienć na twic, ale obawiam się, że to najmniejszy problem z tą biblioteką. W każdym razie wyświetlacz nic nie pokazuje.
  1. $regfile = "xm32e5def.dat"
  2. $crystal = 32000000 '32MHz
  3. $hwstack = 80
  4. $swstack = 60
  5. $framesize = 60
  6.  
  7. Config Osc =enabled , 32mhzosc = Enabled
  8. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  9.  
  10. $lib "glcdSH1106-I2C-TWI.lib"
  11.  
  12. Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"
  13.  
  14. dim _contrast as byte : _contrast=200
  15. dim twi_start as byte
  16.  
  17. Config Twic=400000
  18. Config Scl = Portc.1
  19. Config Sda = Portc.0
  20. Open "twic" For Binary As #2
  21. Config I2cdelay = 10
  22. i2Cinit #2
  23. const TWI_ADR = TWIC_CTRL
  24. const TWI_CH = 1
  25.  
  26. cls
  27. do
  28.    Setfont Font8x8
  29.   Lcdat 10 , 17 , "aaaa " , 1
  30. loop
  31.  
  32. end
  33.  
  34. $include "font8x8.font"
Porównałem bibliotekę ssd1306-twi, sh1106 dla atmeg i tą dołaczoną w poście. Porównanie zrobiłem na zasadzie jaka sekwencja inicjalizacyjna, ile bajtów jest ładowanych/ustawianych podczas wykonania rozkazu np. ldi. Nie znam asemblera na tyle, żeby coś więcej ogarnąć.

Z poważaniem,
Marcin
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
krolikbest
Posty: 23
Rejestracja: 10 maja 2022, 13:25

Re: xmega32e5 i jakiś wyświetlacz graficzny

Post autor: krolikbest » 01 cze 2022, 15:01

Zrezygnowałem z biblioteki. Ze strony bascomforum.de "zapożyczyłem" program do obsługo ssd1306/sh1106 dla normalych atmeg. Nieco przyciąłem-brak line,box,circle. Zostawiłem tekst i grafikę, wyszedł mi taki potworek:)
  1. $regfile = "xm32e5def.dat"
  2. $crystal = 32000000 '32MHz
  3. $hwstack = 180
  4. $swstack = 190
  5. $framesize = 190
  6.  
  7.  
  8. Config Osc =enabled , 32mhzosc = Enabled
  9. Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
  10.  
  11. dim twi_start as byte
  12.  
  13. Config Twic=400000
  14. Config Scl = Portc.1
  15. Config Sda = Portc.0
  16. Open "twic" For Binary As #2
  17. Config I2cdelay = 10
  18.  
  19. config TCC4=NORMAL,PRESCALE=1024
  20. Tcc4_per=31250
  21.  
  22.  
  23. const TWI_ADR = TWIC_CTRL
  24. const TWI_CH = 1
  25.  
  26. i2Cinit #2
  27.  
  28. Declare Sub Lcd_init()
  29. Declare Sub Lcd_comm_out(byval Comm As Byte)
  30. Declare Sub Lcd_clear(byval Colo As Byte)
  31. Declare Sub Lcd_show()
  32. Declare Sub Lcd_show_bgf(byval Xs As Byte , Byval Ys As Byte)
  33.  
  34. Declare Sub Lcd_text(byval S As String , Byval Xoffset As Byte , Byval Yoffset As Byte , Byval Fontset As Byte)
  35. Declare Sub Lcd_set_pixel(byval Xp As Byte , Byval Yp As Byte , Byval Colo As Byte)
  36.  
  37.  
  38. Const White = &HFF
  39. Const Black = &H00
  40.  
  41. Dim Ddata(1024) As Byte                                     'Display Data Buffer
  42. dim i as integer: i=0
  43. dim j as integer: j=0
  44.  
  45. '*******************************************************************************
  46. 'Init Display -- SSD1306 oder Treiber IC SH1106 wird häufig als Ersatz geliefert.
  47. Const Driver_typ = 0                                        'SSD1306 =1   SH1106 =0
  48. Call Lcd_init()                                             'Init Display
  49. '*******************************************************************************
  50.  
  51. Call Lcd_text( "B2222" , 32 , 9 , 2)                        'Draw Text to Buffer
  52. Call Lcd_text( "B2222" , 32 , 29 , 1)
  53.  
  54. do
  55.  
  56.   incr i
  57.   if i=100 then
  58.    Call Lcd_clear(black)
  59.    Call Lcd_text( "-0000-" , 32 , 29 , 1)
  60.   end if
  61.  
  62.   If Tcc4_intflags.0 = 1 Then
  63.    incr j
  64.    Tcc4_intflags.0 = 1
  65.  
  66.    if j=5 then
  67.     Call Lcd_clear(black)
  68.     Call Lcd_text( "-0110-" , 32 , 29 , 1)
  69.    end if
  70.  
  71.    if j=10 then
  72.     Call Lcd_clear(black)
  73.     waitms 5
  74.     Restore Pic                                              'first restore Pic
  75.     Call Lcd_show_bgf(8 , 20)                                'write BGF to Buffer
  76.    endif
  77.  
  78.   End If
  79.  
  80.   Call Lcd_show()
  81. Loop
  82.  
  83. End
  84.  
  85. Tc4a_isr:
  86. Return
  87.  
  88.  
  89. '*******************************************************************************
  90. 'include used fonts
  91. $include "My6_8.font"
  92. $include "My12_16.font"
  93. $include "Digital20x32.font"                                'Font nur Zahlen Punkt und Komma
  94. 'include used BGF
  95. $inc Pic , Nosize , "BGF\abc.bgf"                           '32x32 pixel
  96. $inc Pic1 , Nosize , "BGF\time.bgf"                         '32x32 Pixel
  97. $inc Pic2 , Nosize , "BGF\music.bgf"                        '32x32 Pixel
  98.  
  99. 'Routines
  100. '*******************************************************************************
  101. ' Show BASCOM Graphic Files (BGF)
  102. ' use the Graphic converter in Uncompressed Mode
  103. ' The Sub do not support RLE compression
  104. ' Set Xs=Start Xpoint  Ys=Start Ypoint
  105. '*******************************************************************************
  106. Sub Lcd_show_bgf(byval Xs As Byte , Byval Ys As Byte)
  107.    Local Xz As Byte , Yz As Byte , Col As Byte
  108.    Local Bnr As Byte , Xdum As Byte , Xend As Byte , Yend As Byte
  109.    Read Yend                                                'Read Height
  110.    Read Xend                                                'Read Width
  111.  
  112.    Yend = Yend + Ys                                         'Set end point
  113.    Xend = Xend + Xs                                         'Set end point
  114.  
  115.    Decr Xend
  116.    Decr Yend
  117.  
  118.    For Yz = Ys To Yend                                      'Ystart to Yend
  119.      For Xz = Xs To Xend Step 8                             'Step 8 Pixel for one Byte
  120.        Read Col                                             'Read BGF file 1Byte = 8 Pixel
  121.        Xdum = Xz                                            'X Start Point
  122.       For Bnr = 7 To 0 Step -1                              'MSB first Set 8Bit
  123.        If Col.bnr = 1 Then                                  'Read pixel
  124.         Call Lcd_set_pixel(xdum , Yz , White)               'Set Pixel
  125.        Else
  126.         Call Lcd_set_pixel(xdum , Yz , Black)               'Clear Pixel
  127.        End If
  128.        Incr Xdum                                            'Incr X pointer
  129.       Next
  130.      Next
  131.    Next
  132. End Sub
  133. '*******************************************************************************
  134. '*******************************************************************************
  135. ' Draw Box Xs-Ys to Xe-Ye fill=1 Fill -- Fill=0 no fill
  136. ' Color=1 Set Pixel  Color=0 clear Pixel
  137.  
  138. '*******************************************************************************
  139. ' Set or Clear a Pixel to X-Y Position  White= Set Pixel  Black= Clear Pixel
  140. ' and write Data to Display-Array
  141. '*******************************************************************************
  142. Sub Lcd_set_pixel(byval Xp As Byte , Byval Yp As Byte , Byval Colo As Byte)
  143.    Local B1 As Byte , Zeiger As Word , Bitnr As Byte
  144.    Decr Yp
  145.    B1 = Yp / 8
  146.    Zeiger = B1 * 128
  147.    Zeiger = Zeiger + Xp
  148.  
  149.    Bitnr = Yp Mod 8
  150.    If Colo = Black Then
  151.       Ddata(zeiger).bitnr = 0
  152.    Else
  153.       Ddata(zeiger).bitnr = 1
  154.    End If
  155. End Sub
  156. '*******************************************************************************
  157. ' Updated the Display whith Display-Array
  158. '*******************************************************************************
  159. Sub Lcd_show()
  160.    Local Page As Byte , Zab1 As Byte , Zab2 As Byte
  161.    Local Point As Word
  162.    Point = 1
  163.    Page = &HB0                                              'Page Address + 0xB0
  164.    Call Lcd_comm_out(&H40)                                  'Display start address + 0x40
  165.  
  166.    For Zab1 = 0 To 7
  167.       Call Lcd_comm_out(page)                               'send page address
  168.       Call Lcd_comm_out(&H10)                               'column address upper 4 bits + 0x10
  169.    #if Driver_typ = 1
  170.       Call Lcd_comm_out(&H00)                               'column address lower 4 bits + 0x00    H02 for SH1106
  171.    #else
  172.      Call Lcd_comm_out(&H02)
  173.    #endif
  174.        I2cstart #2                                             'start condition
  175.        I2cwbyte &H78,#2                                        'slave address
  176.        I2cwbyte &H40,#2
  177.       For Zab2 = 1 To 128                                   '128 columns wide
  178.          I2cwbyte Ddata(point),#2
  179.          Incr Point
  180.       Next
  181.        I2cstop #2
  182.       Incr Page                                             'after 128 columns, go to next page
  183.    Next
  184.  
  185. End Sub
  186. '*******************************************************************************
  187. ' Clear Display and Display-Array
  188. '*******************************************************************************
  189. Sub Lcd_clear(byval Colo As Byte)
  190.    Local Page As Byte , Zab1 As Byte , Zab2 As Word
  191.  
  192.    Page = &HB0                                              'Page Address + 0xB0
  193.    Call Lcd_comm_out(&H40)                                  'Display start address + 0x40
  194.  
  195.    For Zab1 = 0 To 7
  196.       Call Lcd_comm_out(page)                               'send page address
  197.       Call Lcd_comm_out(&H10)                               'column address upper 4 bits + 0x10
  198.    #if Driver_typ = 1
  199.       Call Lcd_comm_out(&H00)                               'column address lower 4 bits + 0x00 H02 for SH1106
  200.    #else
  201.       call Lcd_comm_out(&H02)
  202.    #endif
  203.        I2cstart #2                                            'start condition
  204.        I2cwbyte &H78,#2                                        'slave address
  205.        I2cwbyte &H40,#2
  206.       For Zab2 = 1 To 128                                   '128 columns wide
  207.         I2cwbyte Colo,#2
  208.       Next
  209.        I2cstop #2
  210.       Incr Page                                             'after 128 columns, go to next page
  211.    Next
  212.  
  213.    For Zab2 = 1 To 1024
  214.       Ddata(zab2) = 0                                       'Clear Display Data Buffer
  215.    Next
  216.  
  217. End Sub
  218.  
  219. '*******************************************************************************
  220. ' Send Command to SSD1306
  221. '*******************************************************************************
  222. Sub Lcd_comm_out(byval Comm As Byte)
  223.     I2cstart #2                                                'start condition
  224.     I2cwbyte &H78,#2                                           'slave address
  225.     I2cwbyte &H00,#2
  226.     I2cwbyte Comm,#2
  227.     I2cstop #2
  228. End Sub
  229. '*******************************************************************************
  230. ' Init the Driver SSD1306
  231. '*******************************************************************************
  232. Sub Lcd_init()
  233.  
  234.    Call Lcd_comm_out(&Hae)                                  'DISPLAYOFF
  235.    Call Lcd_comm_out(&Hd5)                                  'SETDISPLAYCLOCKDIV
  236.    Call Lcd_comm_out(&H80)                                            'ratio 0x80
  237.    Call Lcd_comm_out(&Ha8)                                  'SETMULTIPLEX
  238.    Call Lcd_comm_out(&H3f)                                  '  1f 128x32
  239.    Call Lcd_comm_out(&Hd3)                                  'SETDISPLAYOFFSET
  240.    Call Lcd_comm_out(&H00)
  241.  
  242.    Call Lcd_comm_out(&H40)                                  'SETSTARTLINE
  243.  
  244.    Call Lcd_comm_out(&Had)                                  'CHARGEPUMP
  245.    Call Lcd_comm_out(&H8b)                                  'vccstate 14
  246.    'Call Lcd_comm_out(&H20)                                  'MEMORYMODE
  247.    'Call Lcd_comm_out(&H00)                                  '
  248.    Call Lcd_comm_out(&Ha1)                                            'SEGREMAP  a0
  249.    Call Lcd_comm_out(&Hc8)                                  'COMSCANDEC
  250.  
  251.    Call Lcd_comm_out(&Hda)                                  'SETCOMPINS
  252.    Call Lcd_comm_out(&H12)                                  ' 02 128x32  12
  253.    Call Lcd_comm_out(&H81)                                  'SETCONTRAST
  254.    Call Lcd_comm_out(200)                                    'value 1-->256
  255.    Call Lcd_comm_out(&Hd9)                                  'SETPRECHARGE
  256.    Call Lcd_comm_out(&H22)                                  'vccstate  f1, 22
  257.    Call Lcd_comm_out(&Hdb)                                  'SETVCOMDETECT
  258.  
  259.    Call Lcd_comm_out(&H40)                                  '
  260.  
  261.    Call Lcd_comm_out(&Ha4)                                  'DISPLAYALLON_RESUME
  262.    Call Lcd_comm_out(&Ha6)                                  'NORMALDISPLAY
  263.  
  264.    Call Lcd_comm_out(&Haf)
  265.   waitms 10
  266.  
  267. End Sub
  268. '*******************************************************************************
  269. 'LCD_Text  String -- X -- Y Start -- Font
  270. '*******************************************************************************
  271. Sub Lcd_text(byval S As String , Xoffset As Byte , Yoffset As Byte , Fontset As Byte)
  272.    Local Tempstring As String * 1 , Temp As Word
  273.    Local Pixels As Byte , Count As Byte , Carcount As Byte
  274.    Local Row As Byte , Block As Byte , Byteseach As Byte , Blocksize As Byte
  275.    Local Colums As Byte , Columcount As Byte , Rowcount As Byte , Stringsize As Byte
  276.    Local Xpos As Byte , Ypos As Byte , Pixel As Byte , Pixelcount As Byte
  277.    Local Offset As Word
  278.  
  279.    Stringsize = Len(s) - 1                                  'Size of the text string -1 because we must start with 0
  280.    Select Case Fontset
  281.       Case 1 :
  282.          Block = Lookup(0 , My6_8)                          'Add or remove here fontset's that you need or not,
  283.          Byteseach = Lookup(1 , My6_8)
  284.          Blocksize = Lookup(2 , My6_8)
  285.          Pixel = Lookup(3 , My6_8)
  286.       Case 2 :
  287.          Block = Lookup(0 , My12_16)
  288.          Byteseach = Lookup(1 , My12_16)
  289.          Blocksize = Lookup(2 , My12_16)
  290.          Pixel = Lookup(3 , My12_16)
  291.       Case 3 :
  292.          Block = Lookup(0 , Digital20x32)
  293.          Byteseach = Lookup(1 , Digital20x32)
  294.          Blocksize = Lookup(2 , Digital20x32)
  295.          Pixel = Lookup(3 , Digital20x32)
  296.    End Select
  297.    Colums = Blocksize / Block                               'Calculate the numbers of colums
  298.    Row = Block * 8                                          'Row is always 8 pixels high = 1 byte, so working with row in steps of 8.
  299.    Row = Row - 1                                            'Want to start with row=0 instead of 1
  300.    Colums = Colums - 1                                      'Same for the colums
  301.    For Carcount = 0 To Stringsize                           'Loop for the numbers of caracters that must be displayed
  302.       Temp = Carcount + 1                                   'Cut the text string in seperate caracters
  303.       Tempstring = Mid(s , Temp , 1)
  304.       Offset = Asc(tempstring) - 32                         'Font files start with caracter 32
  305.       Offset = Offset * Blocksize
  306.       Offset = Offset + 4
  307.       Temp = Carcount * Byteseach
  308.       Temp = Temp + Xoffset
  309.       For Rowcount = 0 To Row Step 8                                  'Loop for numbers of rows
  310.          Xpos = Temp
  311.          For Columcount = 0 To Colums                       'Loop for numbers of Colums
  312.             Select Case Fontset
  313.                Case 1 : Pixels = Lookup(offset , My6_8)
  314.                Case 2 : Pixels = Lookup(offset , My12_16)
  315.                Case 3 : Pixels = Lookup(offset , Digital20x32)
  316.             End Select
  317.             Ypos = Rowcount + Yoffset
  318.             For Pixelcount = 0 To 7                         'Loop for 8 pixels to be set or not
  319.                Pixel = Pixels.0                             'Set the pixel (or not)
  320.                If Pixel = 1 Then
  321.                   Call Lcd_set_pixel(xpos , Ypos , White)
  322.                Else
  323.                   Call Lcd_set_pixel(xpos , Ypos , Black)
  324.                End If
  325.                Shift Pixels , Right                         'Shift the byte 1 bit to the right so the next pixel comes availible
  326.                Incr Ypos                                    'Each pixel on his own spot
  327.             Next Pixelcount
  328.  
  329.             Incr Offset
  330.             Incr Xpos                                       'Do some calculation to get the caracter on the correct Xposition
  331.          Next Columcount
  332.       Next Rowcount
  333.    Next Carcount
  334. End Sub
Niestety nie zawsze program wystartuje(9 na 10 prób jest pozytywnych). Może winny kod inicjalizacyjny? Może ktoś z forumowiczów przetestuje.. Sprzetowo linie sda/scl bez podciągania, bezpośrednio ekran-płytka. Ekran zasilany z 3.3v z płytki eXploreE5.
----------
W zasadzie wyświetlacz startuje co drugi reset modułu eXploreE5, jakby coś się wieszało w sterowniku sh1106 albo jakieś moje niedoróby...
krolikbest
Posty: 23
Rejestracja: 10 maja 2022, 13:25

Re: xmega32e5 i jakiś wyświetlacz graficzny

Post autor: krolikbest » 02 cze 2022, 10:41

Zamieniłem wyświetlacz na inny i program działa normalnie..
ODPOWIEDZ