Strona 1 z 1

LCD 20x4 i2c

: 18 sty 2018, 21:29
autor: Jacek
Witam czytających czy ktoś przerabiał temat wyświetlacza 20x4 na i2c - moje próby kończą się fiaskiem - o ile przy korzystaniu z 2 pierwszych linii - program źródłowy zapożyczony ze strony Kolegi Kaktusa http://kaktusa.pl/lcd-cob-kaktusa-zabawy/
  1.  
  2.  
  3. 'I2c LCD on Arduino Nano 16x2 display with backlight
  4.  
  5. $regfile = "M328pdef.dat"                                   ' the used chip
  6. $crystal = 16000000                                         ' frequency used
  7. $baud = 9600                                                ' baud rate
  8.  
  9. $lib "i2c_twi.lib"                                          'hardware i2c/TWI
  10. $lib "bl_Lcd_i2c.lib"                                       ' AN #118 library from Kent
  11. Config Twi = 100000
  12.                                                             ' with this addition
  13.                                                             ' * lds r27,{backlight}
  14.                                                             ' andi _temp2,&hf7
  15.                                                             ' or _temp2,r27
  16.  
  17. 'LCD-display including backlight
  18. '0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
  19. '1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
  20.  
  21. 'G 5 C R R E D D D D D D D D B B
  22. 'N   O S W   0 1 2 3 4 5 6 7 L L
  23. 'D V N                         S
  24.  
  25. 'PCF8574
  26. 'P7 = D7
  27. 'P6 = D6
  28. 'P5 = D5
  29. 'P4 = D4
  30. 'P3 = 1 = backlight on / 0 = backlight off
  31. 'P2 = E
  32. 'P1 = RW
  33. 'P0 = RS
  34. '(
  35. Const Pcf_d4 = 4
  36. Const Pcf_d5 = 5
  37. Const Pcf_d6 = 6
  38. Const Pcf_d7 = 7
  39. Const Pcf_rs = 0
  40. Const Pcf_rw = 1
  41. Const Pcf_e1 = 2
  42. ')
  43. Const Pcf_rs = 0
  44. Const Pcf_rw = 1                                            'not used, set to 0 to ground for write
  45. Const Pcf_e1 = 2
  46. Const Pcf_e2 = 3                                            'podświetlenie   ON/OFF
  47. Const Pcf_d4 = 4
  48. Const Pcf_d5 = 5
  49. Const Pcf_d6 = 6
  50. Const Pcf_d7 = 7
  51.  
  52. Declare Sub I2c_scan
  53.  
  54. Dim B As Byte
  55. Dim A As Byte
  56. Dim _lcd_e As Byte
  57. Dim Backlight As Byte
  58.  
  59. Backlight_on Alias &H08
  60. Backlight_off Alias &H00
  61.  
  62. Backlight = Backlight_on
  63.  
  64. _lcd_e = 128
  65.  
  66. Const Pcf8574_lcd = &H7E                                                        '40                                    'definicja adresu bazowego ekspandera I/O dla naszego LCD
  67.  
  68. Config Scl = Portc.5                                        'konfiguracja magistrali TWI
  69. Config Sda = Portc.4
  70.  
  71. 'I2cinit
  72. 'Call I2c_scan                                              'if you want to check if the PCF8574 is seen activate this
  73.  
  74. Wait 2
  75.  
  76. Do
  77.   Cls
  78.   Home                                                      'kursor w pierwszej pozycji pierwszej linii
  79.   Lcd "i2c-display"                                                             'wyświetlamy tekst
  80.   Wait 1
  81.   Lowerline                                                 'przejście do niższej lini, kursor na pierwszą pozycję
  82.   Wait 1
  83.   Lcd "Shift this."                                         'wyświetlamy tekst
  84.   Wait 1
  85.   For A = 1 To 8                                                                '10
  86.      Shiftlcd Right                                                             'przesuwamy tekst o jedną pozycję w prawo
  87.      Waitms 250                                                                 'krótka przerwa w działaniu
  88.   Next
  89.  
  90.   For A = 1 To 8                                                                '10
  91.      Shiftlcd Left                                                              'przesuwamy tekst o jedną pozycje w lewo
  92.      Waitms 250                                             'krótka przerwa w działaniu
  93.   Next
  94.  
  95.   Locate 2 , 1                                              'ustawiamy kursor w pozycji
  96.   Lcd "*"                                                   'wyświetlamy jeden znak
  97.   Wait 1                                                    'krótka przerwa w działaniu
  98.  
  99.   Shiftcursor Right                                         'przesunięcie kursora
  100.   Lcd "@"                                                   'wyświetlamy jeden znak
  101.   Wait 1                                                    'krótka przerwa w działaniu
  102.  
  103.   Home Upper                                                                    'przejście do linii wyżej, kursor na pierwszą pozycję
  104.   Lcd "Replaced."                                                               'nadpisujemy stary tekst
  105.   Wait 1                                                                        'krótka przerwa w działaniu
  106.   Cursor Off Noblink                                                            'ukrywamy kursor
  107.   Wait 1                                                                        'krótka przerwa w działaniu
  108.   Cursor On Blink                                                               'uaktywniamy kursor
  109.   Wait 1                                                                        'krótka przerwa w działaniu
  110.   Display Off                                                                   'wyświetlacz off
  111.   Wait 1                                                    'krótka przerwa w działaniu
  112.   Display On                                                                    'wyświetlacz on
  113. 'Now lets build a special character
  114. 'the first number is the characternumber (0-7)
  115. 'The other numbers are the rowvalues
  116. 'Use the LCD tool to insert this line
  117. Deflcdchar 2 , 32 , 10 , 32 , 14 , 17 , 17 , 17 , 14        ' replace ? with number (0-7)
  118. Deflcdchar 0 , 32 , 4 , 32 , 14 , 18 , 18 , 18 , 13         ' replace ? with number (0-7)
  119. Deflcdchar 1 , 32 , 10 , 32 , 14 , 18 , 18 , 18 , 13                            ' replace ? with number (0-7)
  120.   _lcd_e = 128
  121.   Cls                                                       'select data RAM
  122. Rem it is important that a CLS is following the deflcdchar statements because it will set the controller back in datamode
  123.   Lcd Chr(0) ; Chr(1)                                       'print the special character
  124.    '  wait 2
  125. '----------------- Now use an internal routine ------------
  126. _temp1 = 2                                                  'value into ACC
  127. !rCall _write_lcd                                           'put it on LCD
  128.  
  129. '**************************************************************************
  130.   Wait 2
  131. Loop
  132.  
  133. End
  134.  
  135. Sub I2c_scan                                                ' check all devices on the I2c-bus
  136.   Print "Scan start"
  137.   For B = 0 To 254 Step 2                                   'for all odd addresses
  138.     I2cstart                                                'send start
  139.     I2cwbyte B                                              'send address
  140.     If Err = 0 Then                                         'we got an ack
  141.        Print "Slave at : " ; B ; " hex : " ; Hex(b) ; " bin : " ; Bin(b)
  142.     End If
  143.     I2cstop                                                 'free bus
  144.   Next
  145.   Print "End Scan"
  146. End Sub
działa prawidłowo, o tyle po dopisaniu czegokolwiek dla 3 i 4 linii kończy się "wysypaniem lcd" czy mogę liczyć na pomoc w rozwiązaniu problemu.
pozdrawiam Jacek

P.S. mój wyświetlacz Lcd ma tylko 1 linie E - wiem że dla lcd z 2 liniami E jest rozwiązanie na stronie MCS https://www.mcselec.com/index.php?opti ... Itemid=57

Re: LCD 20x4 i2c

: 18 sty 2018, 21:36
autor: niveasoft
20x4 występuja chyba w dwóch odsłonach.
Normalnie sterownik HD4 coś tam może obsługiwać 2x40znaków.
Producenci wyświetlaczy 4x20 łamią te 40 znaków i pierwszy znak trzeciej linii to tak naprawdę trzeba zaadresować jako znak 21 linii pierwszej.

Inni znów biorą dwa sterowniki HD4 cośtam i te wyświetlacze maja dwie linie E czyli E1 i E2 znaczy Enable1 Enable2
Driver dla tego jest po czesci nieskomplikowany bo CLS to czyszczenie obydwóch i tak samo inicjalizacja dwóch czipów.
Właczasz obydwa EN1 i EN2 do masy i posyłasz dane :P

Pewnie Cię to w ogóle nie interesuje.
W mojej wypowiedzi sens i pytanie jest takie czy tam nie masz czasem dwóch linii EN albo powinieneś dołaczyć notę wyświetlacza po jego numerze seryjnym.

Re: LCD 20x4 i2c

: 18 sty 2018, 21:50
autor: Jacek
Witam - Bartek szybciej odpisałeś niż ja poprawiłem swojego posta ;)
tak już dołączam datasheet tego wyświetlacza - nie mogę wstawić pliku pdf - ale jest link https://www.beta-estore.com/download/rk ... 90_410.pdf
pozdrawiam Jacek.

Re: LCD 20x4 i2c

: 18 sty 2018, 21:55
autor: niveasoft
Przykro mi to pisać, ale możesz być dupą :P ahahaha Proszę nie miej mi za złe. Po prostu mam takie poczucie humoru a uważam, że teraz akurat to adekwatnie go używam.

Napisz gdzieś u góry "Config LCD = 20x4" albo "Config LCD = 20 * 4"
To jest wymagane zawsze..dlaczego tego nie określiłeś? :>

Chodzi o to by zadeklarować jakim wyświetlaczem Bascom ma sterować...
Sprawdź i daj znać czy pomogło.

W połaczeniu z poprzednio przekazaną wiedzą powinno Ci dać do myślenia dlaczego to ważne by napisać jaki to LCD

Mój post na ten temat na Forum MCS https://www.mcselec.com/index2.php?opti ... 2587#72587
Tam pisze w komentarzu że konieczne jest określenie typu wyświetlacza by odpowiednio go adresować ;)

Re: LCD 20x4 i2c

: 18 sty 2018, 22:23
autor: Jacek
O.K - dupa jestem :) - zmylił mnie program ze strony Kolegi Kaktusa - no ale to moja wina - lcd działa tak jak trzeba - dzięki Bartek za pomoc.
pozdrawiam Jacek

Re: LCD 20x4 i2c

: 18 sty 2018, 23:20
autor: niveasoft
Cieszę się że pomogłem bo sam się dupą zrobiłem bo się nie wyrobiłem by napisać soft dla @kulamario :D

Re: LCD 20x4 i2c

: 18 sty 2018, 23:23
autor: Jacek
Witam - ano szkoda że przeszkadzałem - jest mały upss... ale to jak prześle filmik na youtuba - jak wyłączam podświetlenie to się robią krzaczki na lcd - ale to jutro napisze z linkiem na youtuba.
Bartek jeszcze raz dzięki.
pozdrawiam Jacek.

Re: LCD 20x4 i2c

: 19 sty 2018, 22:00
autor: Jacek
Witam - tak ja wczoraj pisałem wstawiam link do youtube z filmikiem jak zachowuje się lcd 20x4 i2c przy programowym załączaniu i wyłączaniu "toggle backlight" https://www.youtube.com/watch?v=PBYY05YQFcc program wygląda tak
  1. $regfile = "m328pdef.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 128
  6.  
  7. '$prog &HFF , &HFF , &HDE , &HFD                                                 ' generated. Take care that the chip supports all fuse bytes.
  8. $lib "i2c_twi.lib"
  9. $lib "bl_Lcd_i2c.lib"                                                           ' AN #118 library from Kent
  10. Config Lcd = 20x4
  11. Const Pcf_d4 = 4
  12. Const Pcf_d5 = 5
  13. Const Pcf_d6 = 6
  14. Const Pcf_d7 = 7
  15. Const Pcf_rs = 0
  16. Const Pcf_rw = 1
  17. Const Pcf_e1 = 2
  18.  
  19.  
  20. 'Const Pcf8574_lcd = &H7E                                                        'Defines the address of the I/O expander for LCD
  21.  
  22. 'Config Scl = Portc.5                                                            'we need to provide the SCL pin name
  23. 'Config Sda = Portc.4
  24. 'I2cinit
  25.  
  26. 'Config Twi = 100000                                                             ' wanted clock frequency
  27.  
  28. '--------------------------------------------------------------------
  29. 'Konfiguracja Timer                                                              'ÓW
  30. Config Timer1 = Timer , Prescale = 8
  31. Enable Timer1 : On Timer1 Przertimer1
  32. Enable Interrupts
  33. '--------------------------------------------------------------------
  34. 'ALIASY PORTÓW
  35. Switch Alias Pinc.0                                                             'przycisk enkodera
  36. Led_live Alias Portk.0                                                          'LED pokazująca że układ żyje
  37. Arduino_led Alias Portb.5                                                       'LED na płytce Arduino
  38. Backlight_on Alias &H08
  39. Backlight_off Alias &H00
  40. '--------------------------------------------------------------------
  41. 'ZMIENNE LCD
  42. Dim B As Byte
  43. Dim A As Byte
  44. Dim _lcd_e As Byte
  45. Dim Backlight As Byte
  46.  '--------------------------------------------------------------------
  47. 'ZMIENNE   CZASU
  48. Dim Dziel(6) As Byte
  49. Dim Flaga10ms As Bit
  50. Dim Flaga100ms As Bit
  51. Dim Flaga500ms As Bit
  52. Dim Flaga1s As Bit
  53. Dim Flaga2s As Bit
  54. Dim Flaga10s As Bit
  55.  
  56. '--------------------------------------------------------------------
  57. 'DEKLARACJE PODPROGRAMÓW
  58. Declare Sub Sw
  59. Declare Sub Wyswietl
  60. Declare Sub Mruganie
  61. '--------------------------------------------------------------------
  62. 'KONFIGURACJA PORTÓW
  63. Config Portb = &B1111110 : Portb = &B1011111
  64. 'Config Portc = &B1001000 : Portc = &B1111111
  65. Config Portc.0 = Input : Portc.0 = 1
  66. Config Portc.1 = Input : Portc.1 = 1
  67. Config Portc.2 = Input : Portc.2 = 1
  68. Const Pcf8574_lcd = &H7E                                                        'Defines the address of the I/O expander for LCD
  69.  'Config Scl = Portc.0                                                           'we need to provide the SCL pin name
  70. 'Config Sda = Portc.1
  71. Config Scl = Portc.5                                                            'we need to provide the SCL pin name
  72. Config Sda = Portc.4
  73. I2cinit
  74.  
  75. Config Twi = 100000                                                             ' wanted clock frequency
  76. '--------------------------------------------------------------------
  77. Backlight = Backlight_on
  78.  
  79. '_lcd_e = 128
  80.  
  81.  
  82.  
  83.  
  84. Cursor Off Noblink
  85. Wait 1
  86. Cls
  87. ' Wait 1
  88. Call Wyswietl
  89.  
  90. Do
  91.  
  92.   If Flaga10ms = 1 Then                                                         'co 10 ms
  93.       Flaga10ms = 0                                                             'wyzeruj Flaga10ms
  94.    End If
  95.  
  96.    If Flaga100ms = 1 Then                                                       'co 100ms
  97.       Flaga100ms = 0                                                            'wyzeruj Flaga100ms
  98.       Call Sw
  99.       'Call Wyswietl
  100.    End If
  101.  
  102.    If Flaga500ms = 1 Then                                                       'co 50ms
  103.       Flaga500ms = 0                                                            'wyzeruj Flaga500ms
  104.    End If
  105.  
  106.    If Flaga1s = 1 Then                                                          'co1s
  107.       Flaga1s = 0                                                               'wyzeruj Flaga1s                                                              '
  108.       Call Mruganie
  109.       Call Wyswietl
  110.    End If
  111.  
  112.    If Flaga2s = 1 Then                                                          'co2s
  113.       Flaga2s = 0
  114.       'Display On                                                                'wyzeruj Flaga2s
  115.    End If
  116.  
  117.    If Flaga10s = 1 Then                                                         'co10s
  118.       Flaga10s = 0
  119.      Toggle Backlight                                                           'wyzeruj Flaga10s
  120.     'Display Off
  121.    End If
  122.  
  123. Loop
  124. End
  125.  
  126. '--------------------------------------------------------------------
  127. Sub Sw
  128.  
  129.   ' If Switch = 0 Then
  130.    '   Toggle Backlight
  131.    'End If
  132.  
  133. End Sub
  134. '--------------------------------------------------------------------
  135. 'Wyświetlanie
  136. Sub Wyswietl
  137.    Locate 1 , 1 : Lcd "1234567890"
  138.    Locate 2 , 1 : Lcd "AAAAAA"
  139.    Locate 3 , 1 : Lcd "aaaaaaaaaaaaaaaa"
  140.    Locate 4 , 1 : Lcd "aaaaaaaddddd"
  141. End Sub
  142.  
  143. '--------------------------------------------------------------------
  144. 'MRUGANIE DIODĄ LED CO 1 SEKUNDĘ
  145. ' CO BY BYŁO WIDAĆ ŻE UKŁAD ŻYJE
  146. Sub Mruganie
  147.    Toggle Arduino_led
  148. End Sub
  149. '--------------------------------------------------------------------
  150. '_lcd_e = 128                                                                    '128
  151. '_temp1 = 2
  152. '
  153.  
  154.  
  155. '--------------------------------------------------------------------
  156. '            podprogram przerwań Timer1
  157. Przertimer1:
  158.    Timer1 = 45536                                                               'wstawienie do Timer1 wartości 45536
  159.    Incr Dziel(1)                                                                'zwiększaj dzielnik 1
  160.    If Dziel(1) = 1 Then                                                         'jeśli dzielnik 1 zwiększy się 1 razy
  161.       Dziel(1) = 0                                                              'wyzeruj dzielnik 1
  162.       Set Flaga10ms                                                             'ustaw Flaga10ms
  163.       Incr Dziel(2)                                                             'zwiększaj dzielnik 2
  164.       If Dziel(2) = 10 Then                                                     'jeśli dzielnik 2 zwiększy się 10 razy
  165.          Dziel(2) = 0                                                           'wyzeruj dzielnik 2
  166.          Set Flaga100ms                                                         'ustaw Flaga100ms
  167.          Incr Dziel(3)                                                          'zwiększaj dzielnik 3
  168.          If Dziel(3) = 5 Then                                                   'jeśli dzielnik 3 zwiększy się 5 razy
  169.             Dziel(3) = 0                                                        'wyzeruj dzielnik 3
  170.             Set Flaga500ms                                                      'ustaw Flaga500ms
  171.             Incr Dziel(4)                                                       'zwiększaj dzielnik 4
  172.             If Dziel(4) = 2 Then                                                'jeśli dzielnik 4 zwiększy się 2 razy
  173.                Dziel(4) = 0                                                     'wyzeruj dzielnik 4
  174.                Set Flaga1s                                                      'ustaw Flaga1s
  175.                Incr Dziel(5)                                                    'zwiększaj dzielnik 5
  176.                If Dziel(5) = 2 Then                                             'jeśli dzielnik 5 zwiększy się 2 razy
  177.                   Dziel(5) = 0                                                  'wyzeruj dzielnik 5
  178.                   Set Flaga2s                                                   'ustaw Flaga2s
  179.                   Incr Dziel(6)                                                 'zwiększaj dzielnik 6
  180.                   If Dziel(6) = 5 Then                                          'jeśli dzielnik 6 zwiększy się 5 razy
  181.                      Dziel(6) = 0                                               'wyzeruj dzielnik 6
  182.                      Set Flaga10s                                               ' Ustaw Flaga10s
  183.                   End If                                                        'koniec warunku
  184.                End If                                                           'koniec warunku
  185.             End If                                                              'koniec warunku
  186.          End If                                                                 'koniec warunku
  187.       End If                                                                    'koniec warunku
  188.    End If                                                                       'koniec warunku
  189. Return                                                                          'powrót
  190. '  - - - - - - - - - - -
po załadowaniu tego programu nie mogę dojść do ładu z lcd wyświetla białe kwadraty w 1 i 3 linii.
pozdrawiam Jacek.

Re: LCD 20x4 i2c

: 20 sty 2018, 16:47
autor: niveasoft
Kiedyś widziałem podobny problem przy 16MHz.
LCD po I2C chciałem użyć do debugowania bo to niczego w projekcie nie wymagało dodatkowo.
Proszę, jeśli możesz, sprawdź dwie rzeczy. Czy działa normalnie na wewnętrznym 8MHz(względnie inna/niższa niż 16MHz prędkość taktowania), albo zakomentuj użycie biblioteki sprzętowego TWI czyli zakomentuj $lib "i2c_twi.lib" i wtedy Bascom użyje programowego I2C.
Jak to pomoże to się z tym ostatecznie rozprawimy.

Re: LCD 20x4 i2c

: 20 sty 2018, 18:46
autor: Jacek
Witam - więc tak - na wewnętrznym oscylatorze 8MHz wyświetlacz zachowuje się jak na razie ok.
Natomiast jeżeli tylko od komentuje funkcję "toggle backlight" lcd się wysypuje.
Po za komentowaniu "$lib "i2c_twi.lib" na zewnętrznym oscylatorze 16MHz - lcd wysypuje się również - jeszcze małe pytanie odnośnie odliczania 10ms na wewnętrznym oscylatorze - wiem że trzeba wstawić inną wartość do timer1 - ale czy tak samo działa samo odliczanie - bo patrząc na lcd coś wolniej przybiera licznik sw_cnt.
pozdrawiam Jacek.