[BASCOM] Sterowanie MAX7219, HT16K33

Gotowe kody obsługi układów elektronicznych udostępnione przez użytkowników forum.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

[BASCOM] Sterowanie MAX7219, HT16K33

Post autor: niveasoft » 10 lut 2017, 19:38

OSTATNI UPDATE 2017-03-12

Obecnie testuję też wersję "anypin" czyli działa na jakichkolwiek wolnych pinach
Można pisać gdyby ktoś chciał potestować


Od wersji V2 obsługuje panele matryc które połączone w cztery można kupić na portalach aukcyjnych.

Zestaw gotowych funkcji do niezwykle łatwego sterowania poniższymi efektami.
Przykładowy ostatni efekt gdzie napis "BASCOM" wyłania się z pikseli wywołuje się tak:

Kod: Zaznacz cały

Text = "BASCOM"
       Call Make_array(from_fog , Center , Scroll)
Kod wykorzystuje sprzętowe SPI czyli :
  • CS(chip select) łączymy z SS(slave select)
  • DIN(data in) z MOSI(master output, slave input)
  • CLK(clock) z SCK
..albo dowolne piny i instrukcji Shiftout()


Kod: Zaznacz cały

'HELPER       skąd                dokąd           nadpisać czy przewinąć?
'Make_array( Func As Byte ,  Destination As Byte ,  Overwrite As Byte)
' For_fall = 1            napis opadnie z góry
' For_popup = 2           napis wysunie sie z dołu
' From_right = 3          wysunie sie z prawej strony
' Sand = 4                sandglass - klepsydra buduje napis od dołu
' From_left = 5           wysunie sie z lewej strony
' Show_now = 6            napis pokaże się od razu
' Blank = 7              metoda dla Clear_disp() napis zniknie od razu
' For_join = 8            napis wysunie sie z obydwu stron i połączy
' For_stick = 9           napis wysunie sie z obydwu stron ale tylko tyle ile ma liter
' For_split = 10         metoda dla Clear_disp() napis się rozsunie
' From_fog = 11           napis wyloni sie z pikseli
' Center Alias 0          na końcu wycentruj napis
' To_left Alias 1         przewijaj aż do lewego brzegu
' To_right Alias 2        przewijaj aż do prawego brzegu
' Whole_txt Alias 3       przewiń cały napis

' Overwr Alias 1          pozostaw stary napis i go nadpisuj
' Scroll Alias 0          przesuwaj stary napis poza krawędź
Dodatkowo powstał film, ale zastanowię się czy umieścić go na YT. Na razie link do fimu na GoogleDrive jest TUTAJ
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Re: Sterowanie MAX7219

Post autor: marekszy » 10 lut 2017, 22:05

Witam ,przymierzam się do tych scalaczków i mam problem:
przy kompilacji programem BASCOM 2.0.7.8 wyrzuca błędy biblioteki matrix_driver_new.inc

Error : 7 Line : 598 IF THEN expected , in File : matrix_driver_new.inc
Error : 93 Line : 611 Variable not dimensioned [COMPARE(TAB(1) , WORKSPACE(1) , MAXIM_DISPLAY), WORKSPACE(1) , MAXIM_DISPLAY)] , in File : matrix_driver_new.inc
  1.  If Tab(posx) <> Workspace(posx)then Exit Do

  1. Fog = Compare(tab(1) , Workspace(1) , Maxim_display)
Czy to kwestia wersji programu ?
Rezonator kwarcowy musi być 11059200 MHz ,czy też pójdzie z innym ,będę potrzebował przerwania do obsługi DS1307 i termometrów DS18B20.
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterowanie MAX7219

Post autor: niveasoft » 10 lut 2017, 22:54

W najnowszej wersji Bascom dodano funkcję porównywania dwóch tablic. Nazywa się własnie Compare
Przypomniałem sobie o tym i jej użyłem, ale w kodzie jest chyba stary sposób na to.
Funkcja nazywa się Buff_same() (czy bufory są takie same)
Ta funkcja sprawdza czy odpowiednie piksele na wyświetlaczu są takie same jak ma wyświetlić.
Animacja wykonuje się do momentu aż to co na wyświetlaczu jest takie same jak w pamięci.

Spróbuj na początek napisać

Kod: Zaznacz cały

Fog = Buff_same()
Jak znajdę chwile to wrzucę sobie ten kod na 2078 i sprawdzę co tam poprawić :D

Rezonator wpisałem taki jaki akurat miałem wpięty w płytę. Możesz zmienić.
maryushr
Posty: 11
Rejestracja: 11 lut 2017, 15:16

Re: Sterowanie MAX7219

Post autor: maryushr » 11 lut 2017, 15:41

Kod nie kompiluje się na Bascomie w wersji 2.0.7.8, zwraca takie same błędy, jak podano dwa posty wyżej.
Użycie poniższej funkcji też nie przynosi rezultatu.

Kod: Zaznacz cały

Fog = Buff_same()
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterowanie MAX7219

Post autor: niveasoft » 11 lut 2017, 16:34

Mam mnóstwo roboty, ale tak na szybko wrzuciłem to na 2079.
Trzeba zmienić ten zapis z jednej linii na trzy linie
  1. If Tab(posx) <> Workspace(posx) Then
  2.   Exit Do
  3. End If
Jakby dalej coś to pisać :D
Mi się nawet wydaje, ze tam wystarczy wstawić spację po nawiasie.
To chyba nowy kompilator tego nie zauważył i nie rozsunał słów
Pisze Workspace(posx)then Exit Do a powinno być Workspace(posx) Then Exit Do
maryushr
Posty: 11
Rejestracja: 11 lut 2017, 15:16

Re: Sterowanie MAX7219

Post autor: maryushr » 11 lut 2017, 17:11

Błędy są z funkcjami logicznymi end..if, a dokładniej te funkcje nie są zamykane, w kilku miejscach w kodzie biblioteki brakuje "end if". Ale gdzie? :roll:

Pierwsza większa procedura, w której brakuje połowy "end if":
  1. Sub Make_array(byval Func As Byte , Byval Destination As Byte , Byval Overwrite As Byte)
  2.   Preserve = Overwrite : Center_flg = Destination : Show = Func
  3.  
  4.  If Func > For_popup Then
  5.  Call Clear_workspace()
  6.  
  7.    Text_length = Len(text)                                  'number of chars
  8.      G = 1                                                  'pointer in workspace
  9.      J = 1                                                  'pointer to where next character starts
  10.    For Character_key = 1 To Text_length
  11.      Character_get = Mid(text , Character_key , 1)
  12.       Character = Asc(character_get)                        ' ascii code eg.65 for "A"
  13.                                                             ' every new character starts here
  14.  
  15.        If G > 0 Then                                        'new but not first char
  16.          If Func <= For_popup Then
  17.          Incr G
  18.           Incr G : Incr J : Workspace(g) = 0                'add one dot space between characters
  19.        End If
  20.  
  21.       E = Character                                         ' E is a Word pointer in ASCII font data
  22.          Shift E , Left , 3                                 ' shift Left 3 means multiply by 8
  23.        Pos(character_key) = J                               'remember char start position to scroll only one
  24.  
  25.        If Character = 31 Then                               'place for character is 5xDots lenght
  26.  
  27.          For N = 1 To Character_dots                        'even it`s blank, adjust place for incomming chars 1,2,3 etc.
  28.            If Func = For_fall Then
  29.            Incr G
  30.             Incr G : Incr J : Workspace(g) = 0              'add blank dots rows
  31.          Next
  32.  
  33.        Else
  34.        If Character = 32 Then                               'space is 2xDots lenght
  35.  
  36.          For N = 1 To Space_character_dots
  37.            If Func <= For_popup Then
  38.            Incr G
  39.             Incr G : Incr J : Workspace(g) = 0              'add blank dots rows
  40.          Next
  41.  
  42.        Else
  43.  
  44.        If Character > 32 Then
  45.  
  46.          For N = 1 To Character_dots
  47.             I = Lookup(e , Ascii_table)
  48.             If Func <= For_popup Then
  49.              Select Case Character
  50.               Case 48 To 57                                 'if this is a digit
  51.                Incr G : Incr G : Incr J : Workspace(g) = I  'add all 5 rows even they are zeros
  52.               Case Else
  53.                If I > 0 Then                                ' add it only if it`s not a zero
  54.                 Incr G : Incr G : Incr J : Workspace(g) = I
  55.                End If
  56.              End Select
  57.             Else
  58.              If I > 0 Then
  59.                Incr G : Incr J : Workspace(g) = I           'skip zeros
  60.              End If
  61.             End If
  62.             Incr E                                          'move forward in font table
  63.          Next
  64.  
  65.        Else
  66.          For N = 1 To Special_character_dots
  67.            I = Lookup(e , Ascii_table)
  68.           If Func <= For_popup Then Incr G
  69.            Incr G : Incr J : Workspace(g) = I
  70.             Incr E                                          'move forward in font table
  71.          Next
  72.        End If
  73.  
  74.      New_char(character_key) = Character                    'this for later checking if char is changed
  75.  
  76.    Next Character_key
  77.    Pos(character_key) = J                                   'remember position of last row for vert.scrolling
  78.                                                             ' this for calculating last char length
  79.  
  80.    Select Case Func
  81.  
  82.     Case For_fall To For_popup
  83.  
  84.      Todo = 8
  85.  
  86.     Case From_right
  87.  
  88.       Select Case Destination
  89.        Case Center : Scroll_left = Calc_center()
  90.        Case To_left : Scroll_left = Maxim_display
  91.        Case To_right : Scroll_left = J
  92.        Case Whole_txt : Scroll_left = J + Maxim_display
  93.       End Select
  94.  
  95.     Case Sand
  96.  
  97.      Sand_cnt = 8
  98.       If Center_flg = 0 Then
  99.       Call Center_workspace()
  100.  
  101.     Case From_left:
  102.  
  103.       Select Case Destination
  104.        Case Center : Scroll_right = Calc_center()
  105.        Case To_left : Scroll_right = J
  106.        Case To_right : Scroll_right = Maxim_display
  107.        Case Whole_txt : Scroll_right = J + Maxim_display
  108.       End Select
  109.  
  110.  
  111.      Case For_join To For_stick
  112.  
  113.       Just_started = 1
  114.        Hold = 1
  115.        Join_len = J / 2
  116.        If Func = For_join Then
  117.         Mem_columns = Half
  118.        Else                                                 'for stick only
  119.         Mem_columns = Join_len
  120.        End If
  121.         Join_cnt = Half                                     'musi przejechać pół wyśw z każdej strony
  122.         Call Center_workspace()
  123.  
  124.      Case From_fog
  125.  
  126.       If Center_flg = 0 Then
  127.       Call Center_workspace()
  128.        Fog = 1 : Fog_flg = 1
  129.                                  
  130.    End Select
  131.  
  132.  
  133.    Scrl_cnt = 0
  134.  
  135. End Sub
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterowanie MAX7219

Post autor: niveasoft » 11 lut 2017, 19:28

Kolego usiądź kiedyś nad tym na spokojnie.
Zanim następnym razem będziesz podejrzewał kogoś o dywersję.
Włącz sobie pokazywanie "Indention lines" - to są linie które pokazują co się do czego odnosi.
Od razu widać każdy Elseif i End If jeśli jest potrzebny.

Musisz tez chyba dzisiaj dopiero dowiedzieć, że jeśli do wykonania jest tylko jedna instrukcja to można to zapisać w jednej linii bez End If
Poniższy zapis jes jak najbardziej prawidłowy
  1. If Func > For_popup Then Call Clear_workspace()
Obrazek
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Re: Sterowanie MAX7219

Post autor: marekszy » 11 lut 2017, 20:11

pierwszy błąd faktycznie załatwiło dodanie spacji ,a co z drugim?
Error : 93 Line : 611 Variable not dimensioned [COMPARE(TAB(1) , WORKSPACE(1) , MAXIM_DISPLAY), WORKSPACE(1) , MAXIM_DISPLAY)] , in File : matrix_driver_new.inc

Kod: Zaznacz cały

Fog = Compare(tab(1) , Workspace(1) , Maxim_display) 


Jaką rolę odgrywa tam HT16K33 i jak to jest spięte razem, czy na tym programie pójdą same matryce z MAX7219 ?
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterowanie MAX7219

Post autor: niveasoft » 11 lut 2017, 20:23

Klikasz żeby Cię przeniosło do linii gdzie jest błąd i ją komentujesz. Zamiast tej linii piszesz Fog = Buff_same()

Kod: Zaznacz cały

   'Fog = Compare(tab(1) , Workspace(1) , Maxim_display)   'zakomentowana nowa instrukcja Bascoma
   Fog = Buff_same()  'dodajesz to
   Hold = Fog
Kod był napisany dla kolegi który ma matryce z HT16K33 - one są na I2C
Mam taki bliźniaczy kod tylko zamiast SPI jest I2C.
Różni się tylko procedura Send_to_matrix()
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Re: Sterowanie MAX7219

Post autor: marekszy » 11 lut 2017, 20:39

Teraz jest ok ,kompiluje się bez błędów ,czkam na dostawę MAX-ów i wtedy zacznę zabawę.
Dzięki
ODPOWIEDZ