Obsługa MAX7219 z wyświetlaczami LED 7SEG

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: Michał6201 » 22 maja 2020, 12:59

Witam

Zamówiłem dwa moduły wyświetlaczy 7seg z układem MA7219, dziś podłączylem do ATmegi 8

Załadowałem kod do procesora z obsługą tego scalaka znaleziony na elektrodzie:
  1.  $regfile = "m8def.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 64
  6.  
  7. Config Submode = New
  8.  
  9.  
  10. 'Wybierz opcje ;)
  11. '0 - Software SPI
  12. '1 - Hardware SPI
  13.  
  14. Const Opcja = 1
  15.  
  16. '**************************************************************************************
  17.  
  18. #if Opcja = 0
  19.  
  20. '************ deklaracje SPI programowego dla MAX7219
  21. Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Clock = Portb.5 , Ss = None
  22.  Spiinit
  23.  
  24. #elseif Opcja = 1
  25.  
  26. '************ deklaracje SPI sprzętowego dla MAX7219
  27. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
  28.  Config Portb.2 = Output : Ss_pin Alias Portb.2 : Set Ss_pin       'żeby SPI nie przeszła w Slave
  29.   Spiinit
  30.  
  31. #endif
  32.  
  33. '**************************************************************************************
  34.  
  35. Config Portb.0 = Output : Load_max Alias Portb.0 : Set Load_max
  36.  
  37.  
  38. Dim Buff(4) As Byte
  39. Dim Displ2 As Word At Buff(1) Overlay
  40. Dim Displ1 As Word At Buff(3) Overlay
  41.  
  42. Dim Test As Byte , N As Byte
  43.  
  44. Const No_op = 0
  45.  
  46. Sub Send_buff
  47.  
  48.   Reset Load_max
  49.  
  50.     Spiout Buff(1) , 4
  51.  
  52.   Set Load_max
  53.  
  54. End Sub
  55.  
  56. Buff(1) = &H0C                                              '&H0C Power mode, 0-OFF,1-ON
  57. Buff(2) = &H00
  58.  Displ1 = Displ2
  59.   Call Send_buff
  60.  
  61. Buff(1) = &H09                                              'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
  62. Buff(2) = &B1111_1111                                       '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
  63.  Displ1 = Displ2
  64.   Call Send_buff
  65.  
  66. Buff(1) = &H06
  67. Buff(2) = &H06                                              'jasnosc 16 krokow, wartosci od &H00 do &H0F
  68.  Displ1 = Displ2
  69.   Call Send_buff
  70.  
  71. Buff(1) = &H0B
  72. Buff(2) = 7                                                 'ile ma obsługiwac cyfr, wartosci od 0 do 7
  73.  Displ1 = Displ2
  74.   Call Send_buff
  75.  
  76.  
  77. Buff(1) = &H0F
  78. Buff(2) = 0                                                 'Test wyswietlacza, 0-OFF, 1-TEST ON
  79.  Displ1 = Displ2
  80.   Call Send_buff
  81.  
  82. Buff(1) = &H0C
  83. Buff(2) = &H01                                              '&H0C Power mode, 0-OFF,1-ON
  84.  Displ1 = Displ2
  85.   Call Send_buff
  86.  
  87.  
  88.   ' Tutaj już powinny być zainicjalizowane oba
  89.  
  90.  
  91.   'Teraz żeby dane przesłac do tylko jednego
  92.   ' wystarczy napisac że drugi No_op i to wyzeruje dwa bajty na raz
  93.  
  94.  
  95.   'Można też odwoływac sie bezpośrednio do bajtów
  96.   ' Buff(1), Buff(2), Buff(3), Buff(4)
  97.  
  98.  
  99. Do
  100.  
  101.    For N = 1 To 8
  102.     Buff(3) = N
  103.      Buff(4) = 9 - N
  104.  
  105.     Buff(1) = N
  106.      Buff(2) = N
  107.  
  108.       Call Send_buff
  109.    Next
  110.  
  111.     Wait 3
  112.  
  113.    For N = 1 To 8
  114.     Buff(1) = N
  115.      Buff(2) = 9 - N
  116.  
  117.     Buff(3) = N
  118.      Buff(4) = N
  119.  
  120.       Call Send_buff
  121.    Next
  122.  
  123.     Wait 3
  124.  
  125. Loop
  126. End
Jak w ogóle można na tym wyświetlić jakieś dane?
Jakoś trzeba konwertować jakieś zmienne?
Załóżmy że chcę wyświetlić temperaturę mierzoną DS18B20. Malo tego że nie da się żadnej innej wartości wyświetlić, to jak zmienię liczbę wyświetlaczy na 4, bo tyle mi potrzeba cyfr, a nie 8, to od końca wyświetla się 4 cyfry.

Nie chcę gotowca, tylko podpowiedź jak to robić.
Bardzo proszę Was o pomoc
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: niveasoft » 23 maja 2020, 10:13

Na jeden wyświetlacz wysyła się zawsze dwa bajty. W pierwszym jest adres pod którym chcesz umieścić dane z drugiega bajtu. Wyświetlacze maja adresy on 1 do 8 i dlatego od adresu &H9 zaczynają się rejestry konfigurujace. Na dodatek w tych modułach wyswietlacz całkiem z lewej to ma adres 8. Dlatego żeby wyświetlić "12345678" to trzeba to zrobić taką odwrotnoscią "Adres=9-N"
  1. Sub Test_displ
  2.  
  3.    'wyswietl 12345678
  4.    '--------------------
  5.    For N = 1 To 8
  6.     Disp_num = 9 - N
  7.      Disp_data = N
  8.       Call Disp_write
  9.    Next
  10.  
  11. End Sub
Ten kod który znalazłeś to chyba jakiś mój bardzo stary. Poznaję po emotikonach w opisie i polskich znakach :D

Dla porównania niżej masz taki mój precyzyjny stoper który napisałem lata temu więc teraz może bym tu i coś poprawił, ale opis jak to działa jest na samym dole ;)

Żeby coś wyswietlić w danym miejscu to wpisujesz adres do Disp_num a dane do Disp_data - proste
  1. $regfile = "m8def.dat"
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 64
  6.  
  7.  
  8.  Config Submode = New
  9.  
  10. ' Kompilator automatycznie obliczy wszystko na podstawie podanego taktownia
  11.  
  12.  Const Na_jedna_sekunde = _xtal / 1024                      '15625 @16MHz /2=7812,5
  13.  
  14. ' Przykład : Taktowanie 16000000 czyli 16MHz oznacza że robi tyle ticków na 1s
  15. ' Kiedy podzielimy taktowanie prescalerem 1024 to na sekundę zrobi tylko 15625 ticków (dla Timera)
  16. ' Przypuśćmy że odmierzyliśmy 500ms, w Timer1 będzie wartość połowy z 15625 czyli ~7812
  17. ' Obliczenia (7812*1000)/15625=500 czyli wynik prawidłowy 500ms
  18. '
  19. ' Prescaler 1024 sprawia że wynik i tak jest dokładniejszy o jeden rząd wielkości
  20. ' Sekunda ma 1000ms a Timer jest taktowany 15tyś/sec
  21.  
  22.  
  23.  
  24.  '********************************************
  25.  '*   STOP BUTTON    PIN ICP PORTB.0         *
  26.  '********************************************
  27.  
  28.    Portb.0 = 1                                              'ENABLE PULLUPS
  29.  
  30.  '********************************************
  31.  '*       START BUTTON INT0                  *
  32.  '********************************************
  33.  
  34.    Portd.2 = 1                                              'ENABLE PULLUPS
  35.  
  36.  '********************************************
  37.  '*       RESTART BUTTON                     *
  38.  '********************************************
  39.  
  40.    Config Portd.4 = Input : Restart_sw Alias Pind.4 : Set Portd.4
  41.  
  42.  '********************************************
  43.  '*       INDICATING LED                     *
  44.  '********************************************
  45.  
  46.   Config Portd.5 = Output : Led Alias Portd.5               '
  47.  
  48.  '********************************************
  49.  '*       CALIBRATION PIN                    *
  50.  '********************************************
  51.  
  52.   Config Portd.0 = Input : Calib_pin Alias Pind.0 : Set Portd.0
  53.  
  54.  
  55.  Dim Helpd As Dword , Helpd2 As Dword , Help_w As Word , Overflows As Word
  56.  Dim Min_ As Byte , Sec_ As Byte , Miliseconds As Word , Old_flag As Byte
  57.  Dim Reszta As Word , Flaga_pomiar As Byte , Ms As Byte , Restart As Byte
  58.  Dim Pos As Byte , Helpw1 As Word , Helpw2 As Word
  59.  
  60. '*********************************************
  61. '*       MAX 7219 CONTROLS                   *
  62. '*********************************************
  63.  
  64. Config Portc.2 = Output : Cs_enable Alias Portc.2 : Set Cs_enable
  65. Config Portc.1 = Output : Ser_clk Alias Portc.1
  66. Config Portc.0 = Output : Ser_data Alias Portc.0
  67.  
  68. Dim Disp_buff As Word
  69. Dim Disp_num As Byte At Disp_buff + 1 Overlay
  70. Dim Disp_data As Byte At Disp_buff Overlay
  71.  
  72. Dim Disp(8) As Byte
  73. Dim Hours As Byte At Disp(1) Overlay
  74. Dim Md As Byte At Disp(2) Overlay
  75. Dim Mj As Byte At Disp(3) Overlay
  76. Dim Sd As Byte At Disp(4) Overlay
  77. Dim Sj As Byte At Disp(5) Overlay
  78. Dim Mss As Byte At Disp(6) Overlay
  79. Dim Msd As Byte At Disp(7) Overlay
  80. Dim Msj As Byte At Disp(8) Overlay
  81.  
  82. Dim N As Byte
  83.  
  84.  
  85. Sub Disp_write
  86.  
  87.   'Reset Ser_data
  88.   'Reset Ser_clk
  89.    Reset Cs_enable
  90.  
  91.     Shiftout Ser_data , Ser_clk , Disp_buff , 1
  92.  
  93.    Set Cs_enable
  94.  
  95. End Sub
  96.  
  97.  'Max7219_setup:
  98.  
  99.    Disp_num = &H0C : Disp_data = 0                          '&H0C Power mode, 0-OFF,1-ON
  100.     Call Disp_write
  101.  
  102.    Disp_num = &H9 : Disp_data = &B1111_1111                 'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
  103.                                                             '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
  104.  
  105.     Call Disp_write
  106.    Disp_num = &H0A : Disp_data = &H0F                       'jasnosc 16 krokow, wartosci od &H00 do &H0F
  107.     Call Disp_write
  108.    Disp_num = &H0B : Disp_data = 7                          'ile ma obsługiwac cyfr, wartosci od 0 do 7
  109.     Call Disp_write
  110.    Disp_num = &H0F : Disp_data = 0                          'Test wyswietlacza, 0-OFF, 1-TEST ON
  111.     Call Disp_write
  112.    Disp_num = &H0C : Disp_data = 1                          '&H0C Power mode, 0-OFF,1-ON
  113.     Call Disp_write
  114.  
  115.  '------------------------------------------
  116.  '             -START-                     -
  117.  '------------------------------------------
  118.  
  119.  Decimal_point Alias 7                                      'włacza kropeczkę, przecinek (ustawia 7 bit)
  120.  
  121. Dim Calosc As Dword
  122. Dim Mod_sec As Dword
  123. Dim Above_sec As Dword
  124.  
  125.  
  126. Sub Show_result
  127.  
  128.   For N = 1 To 8
  129.  
  130.      Disp_num = 9 - N
  131.       Disp_data = Disp(n)
  132.  
  133.      Select Case N
  134.       Case 1 : Disp_data.decimal_point = 1
  135.       Case 3 : Disp_data.decimal_point = 1
  136.       Case 5 : Disp_data.decimal_point = 1
  137.      End Select
  138.  
  139.         Call Disp_write
  140.  
  141.   Next
  142.  
  143. End Sub
  144.  
  145. Sub Calculate
  146.  
  147.       Calosc = Overflows                                    'ilośc przepełnień
  148.        Shift Calosc , Left , 16                             'pomnóż x 65536 (16 bitów)
  149.         Calosc = Calosc + Reszta                            'dodaj wartość reszty z Timera
  150.          'w zmiennej Calosc ilosc taktow na sekunde
  151.  
  152.       'Układ generuje tyle ticków na sekunde ile ma zmienna "Na_jedna_sekunde"
  153.       'Teoretycznie wiec podzielenie przez te liczbe daje absolutna wartosc sekund
  154.       'a reszta to ilośc milisekund
  155.       'Milisekund w sekundzie jest tysiąc więc mnożenie x1000 i dzielenie przez 1s (Na_jedna_sekunde)
  156.  
  157.  
  158.       Mod_sec = Calosc Mod Na_jedna_sekunde
  159.        'w zmiennej Mod_sec reszta z dzielenia przez sekundy
  160.       Above_sec = Calosc / Na_jedna_sekunde
  161.        'w zmiennej Above_sec liczba sekund
  162.  
  163.  
  164.      'obliczenia milisekund
  165.      '--------------------------------------------------------------------
  166.       Helpd = Mod_sec * 1000
  167.       Helpd2 = Helpd / Na_jedna_sekunde
  168.  
  169.          Miliseconds = Helpd2                               'rzutowanie Dword na Word
  170.  
  171.           Helpw1 = Miliseconds / 100
  172.            Mss = Helpw1                                     'setne milisekund
  173.             Helpw2 = Miliseconds Mod 100
  174.              Helpw1 = Helpw2 / 10
  175.               Msd = Helpw1                                  'dziesietne milisekund
  176.               Helpw1 = Helpw2 Mod 10
  177.                Msj = Helpw1                                 'jednosci milisekund
  178.      '--------------------------------------------------------------------
  179.  
  180.  
  181.         Helpd = Above_sec Mod 60                            'sekundy to reszta z dzielenia przez 60
  182.          Sec_ = Helpd                                       'rzutowanie z Dword na Byte
  183.  
  184.            Sd = Sec_ / 10
  185.             Sj = Sec_ Mod 10
  186.  
  187.         'pozbywany sie sekund
  188.         Helpd2 = Above_sec / 60
  189.          Helpd = Helpd2 Mod 60                              'obliczanie ilosci minut
  190.  
  191.  
  192.          Min_ = Helpd                                       'rzutowanie z Dword na Word
  193.           Md = Min_ / 10
  194.            Mj = Min_ Mod 10
  195.  
  196.         Helpd = Helpd2 / 60                                 'obliczanie godzin
  197.          Hours = Helpd
  198.  
  199.  
  200.  
  201.  
  202.  End Sub
  203.  
  204. Sub Test_displ
  205.  
  206.    'wyswietl 12345678
  207.    '--------------------
  208.    For N = 1 To 8
  209.     Disp_num = 9 - N
  210.      Disp_data = N
  211.       Call Disp_write
  212.    Next
  213.  
  214. End Sub
  215.  
  216. Sub Cls_displ
  217.  
  218.    For N = 1 To 8
  219.     Disp_num = N
  220.      Disp_data = 15                                         '&HF czysci
  221.       Call Disp_write
  222.    Next
  223.  
  224. End Sub
  225.  
  226.  
  227.  '************************************************************************
  228.  '**                         PROGRAM START                              **
  229.  '************************************************************************
  230.  
  231.  
  232.  Call Test_displ
  233.   Wait 2
  234.    Call Cls_displ
  235.  
  236.  'wait for thermostat
  237.  
  238.  Do
  239.  
  240.   Incr Pos
  241.  
  242.    If Pos = 9 Then
  243.     Pos = 0
  244.     Call Cls_displ
  245.    Else
  246.  
  247.     Disp_num = 9 - Pos
  248.      Disp_data = 10                                         '10 daje kreseczke
  249.       Call Disp_write
  250.    End If
  251.  
  252.      Waitms 200
  253.  
  254.  Loop Until Calib_pin = 1
  255.  
  256.  
  257.  'cls niepotrzebne bo zmienne puste i pokaże zera
  258.  
  259.   Call Show_result                                          'pokaz juz z kropkami(przecinkami)
  260.  
  261.  
  262.  '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  263. ' DOPIERO TERAZ ODBLOKOWANIE PRZERWAŃ
  264.  '------------------------------------------
  265.  
  266.  
  267.   Config Int0 = Falling : On Int0 Int0_isr Nosave : Enable Int0
  268.  
  269. '*********************************************
  270. '*  TIMER CONFIG OVERFLOWS AND CAPTURE       *
  271. '*********************************************
  272.                                                                   'NOISE CANCEL MOŻNA WŁACZYĆ ALE ZABIERA 4 TAKTY
  273.  
  274.  Config Timer1 = Timer , Prescale = 1024 , Capture_edge = Falling       ', Noise_cancel = 1
  275.   Stop Timer1
  276.  
  277.  Enable Timer1 : On Timer1 Timer1_isr Nosave
  278.  
  279.  On Capture1 Capture1_isr Nosave
  280.  
  281. '*********************************************
  282. '*********************************************
  283.  
  284. 'Sfior.psr10 = 1
  285.  
  286.  
  287.  Enable Interrupts
  288.  
  289.  
  290. Do
  291.  
  292.   If Flaga_pomiar = 1 Then
  293.  
  294.     Reszta = Timer1
  295.      Call Calculate
  296.       Call Show_result
  297.  
  298.       Old_flag = 1                                          'ustaw flage że mierzyliśmy
  299.        Set Led
  300.  
  301.         Waitms 100
  302.  
  303.   Else
  304.  
  305.      If Old_flag = 1 Then
  306.          Old_flag = 0
  307.  
  308.           Call Calculate
  309.            Call Show_result
  310.             Restart = 1
  311.  
  312.      End If
  313.  
  314.      If Restart_sw = 0 Then
  315.  
  316.       If Restart = 1 Then
  317.           Restart = 0
  318.            Min_ = 0 : Sec_ = 0 : Miliseconds = 0 : Overflows = 0
  319.            N = Memcopy(sec_ , Disp(1) , 8 , 2)
  320.             Call Show_result
  321.              Gifr.intf0 = 1
  322.              Tifr.icf1 = 1
  323.               Enable Int0
  324.               Timer1 = 0
  325.                Reset Led
  326.       End If
  327.  
  328.      End If
  329.  
  330.   End If
  331.  
  332. Loop
  333. End
  334.  
  335. Timer1_isr:
  336.  
  337.   $asm
  338.   PUSH R26
  339.   PUSH R27
  340.   PUSH R30
  341.   PUSH R31
  342.   PUSH R24
  343.   !in R24, sreg
  344.   PUSH  R24
  345.   $end Asm
  346.  
  347.   Incr Overflows
  348.   '          Tuned with NoSave Tool
  349.  
  350.   $asm
  351.   POP  R24
  352.   !out sreg, r24
  353.   POP  R24
  354.   POP R31
  355.   POP R30
  356.   POP R27
  357.   POP R26
  358.   $end Asm
  359.  
  360. Return
  361.  
  362. Int0_isr:
  363.  
  364.   $asm
  365.   PUSH R23
  366.   PUSH R24
  367.   !in R24, sreg
  368.   PUSH  R24
  369.   $end Asm
  370.  
  371.   Start Timer1
  372.   Sfior.psr10 = 1                                           '<<<<<< DODANE
  373.    Disable Int0
  374.     Enable Capture1
  375.      Flaga_pomiar = 1
  376.  
  377.   '          Tuned with NoSave Tool
  378.  
  379.   $asm
  380.   POP  R24
  381.   !out sreg, r24
  382.   POP R24
  383.   POP R23
  384.   $end Asm
  385.  
  386. Return
  387.  
  388. Capture1_isr:
  389.  
  390.   $asm
  391.   PUSH R23
  392.   PUSH R24
  393.   PUSH R25
  394.   PUSH R26
  395.   PUSH R27
  396.   !in R24, sreg
  397.   PUSH  R24
  398.   $end Asm
  399.  
  400.  
  401.   Stop Timer1
  402.    Disable Capture1
  403.     Reszta = Capture1
  404.      Flaga_pomiar = 0
  405.   '          Tuned with NoSave Tool
  406.  
  407.   $asm
  408.   POP  R24
  409.   !out sreg, r24
  410.   POP R27
  411.   POP R26
  412.   POP R25
  413.   POP R24
  414.   POP R23
  415.   $end Asm
  416.  
  417. Return
  418.  
  419.  
  420. 'Po Włączeniu:
  421. '1.
  422. '2.
  423. '3. Program W Pętli Czeka Na Aż Pojawi Sie Poziom 1 Na Pd0 Ok 2min Z Termostatu
  424. '   W Tym Czasie Wyswietlają Się Kreseczki Od Lewej Do Prawej Co 200ms
  425. '4. Napis "KALIBRACJA OK" Wait2
  426. '5. Napis "0.00.00.000  (minuty,sekundy i reszta)"
  427. '6. Czekamy Na Impuls 0 Na Pd2 Do Startu , Zbocze Opadające(impuls Będzie Od 0.1ms Do 100ms)
  428. '7. Pomiary I Obliczenia , Jak Się Da Co 100ms Wynik Na Lcd , Zapala Się Led Na Pd5
  429. '8. Czekamy Na Impuls 0 Na Pd3 Stop Zbocze Opadające(impuls Od 0.1ms Do 100ms)
  430. '9. Wyswietla Się Się Cały Wynik , Led Świeci Nadal
  431. '10. Po Podaniu 0 Na Pd4 Reset , Led Gasnie I Wracamy Do Punktu 5
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: Michał6201 » 23 maja 2020, 11:01

Dziękuję Ci bardzo. Zaraz przetestuję :)
A ten kod z elektrody, to faktycznie Twój :)

Niestety nie wyświetla się napięcie na led.
Sam odczyt napięcia jest na pewno poprawny, ponieważ wyświetla się poprawny wynik na wyświetlaczu LCD 2x16

Tutaj kod:
  1. ' WOLTOMIERZ z LED MAX7219
  2.  
  3.  
  4. $regfile = "m8adef.dat"
  5. $crystal = 8000000
  6. $hwstack = 64
  7. $swstack = 64
  8. $framesize = 64
  9.  
  10. Config Submode = New
  11.  
  12.  
  13. '*********************************************
  14.     '*       MAX 7219 CONTROLS                   *
  15.     '*********************************************
  16.  
  17.     Config Portc.2 = Output : Cs_enable Alias Portc.2 : Set Cs_enable
  18.     Config Portc.1 = Output : Ser_clk Alias Portc.1
  19.     Config Portc.0 = Output : Ser_data Alias Portc.0
  20.  
  21.     Dim Disp_buff As Word
  22.     Dim Disp_num As Byte At Disp_buff + 1 Overlay
  23.     Dim Disp_data As Byte At Disp_buff Overlay
  24.  
  25.     Dim Disp(8) As Byte
  26.     Dim N As Byte
  27.  
  28.  
  29.     Sub Disp_write
  30.  
  31.       'Reset Ser_data
  32.       'Reset Ser_clk
  33.        Reset Cs_enable
  34.  
  35.         Shiftout Ser_data , Ser_clk , Disp_buff , 1
  36.  
  37.        Set Cs_enable
  38.  
  39.     End Sub
  40.  
  41.      'Max7219_setup:
  42.  
  43.        Disp_num = &H0C : Disp_data = 0                          '&H0C Power mode, 0-OFF,1-ON
  44.         Call Disp_write
  45.  
  46.        Disp_num = &H9 : Disp_data = &B1111_1111                 'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
  47.                                                                 '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
  48.  
  49.         Call Disp_write
  50.        Disp_num = &H0A : Disp_data = &H00                       'jasnosc 16 krokow, wartosci od &H00 do &H0F
  51.         Call Disp_write
  52.        Disp_num = &H0B : Disp_data = 7                          'ile ma obsługiwac cyfr, wartosci od 0 do 7
  53.         Call Disp_write
  54.        Disp_num = &H0F : Disp_data = 0                          'Test wyswietlacza, 0-OFF, 1-TEST ON
  55.         Call Disp_write
  56.        Disp_num = &H0C : Disp_data = 1                          '&H0C Power mode, 0-OFF,1-ON
  57.         Call Disp_write
  58.  
  59.  '------------------------------------------
  60.      '             -START-                     -
  61.      '------------------------------------------
  62.     '    Decimal_point Alias 7                                      'włacza kropeczkę, przecinek (ustawia 7 bit)
  63.  
  64.   ' Dim Calosc As Dword
  65.     'Dim Mod_sec As Dword
  66.    ' Dim Above_sec As Dword
  67.  
  68. Sub Show_result
  69.  
  70.       For N = 1 To 8
  71.  
  72.          Disp_num = 9 - N
  73.           Voltages = Fusing(napiecie , "00.&&&&")
  74.          N = Napiecie
  75.          Disp_data = Disp(n)
  76.  
  77.         ' Select Case N
  78.         '  Case 1 : Disp_data.decimal_point = 1
  79.         '  Case 3 : Disp_data.decimal_point = 1
  80.         '  Case 5 : Disp_data.decimal_point = 1
  81.          'End Select
  82.  
  83.             Call Disp_write
  84.  
  85.       Next
  86.  
  87.     End Sub
  88.  
  89.   Sub Test_displ
  90.  
  91.        'wyswietl 12345678
  92.        '--------------------
  93.        For N = 1 To 8
  94.         Disp_num = 9 - N
  95.          Disp_data = N
  96.           Call Disp_write
  97.        Next
  98.  
  99.     End Sub
  100.  
  101.     Sub Cls_displ
  102.  
  103.        For N = 1 To 8
  104.         Disp_num = N
  105.          Disp_data = 15                                         '&HF czysci
  106.           Call Disp_write
  107.        Next
  108.  
  109.     End Sub
  110.  
  111.         '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  112. Sub Odczyt
  113. I2cstart
  114. I2cwbyte Addressr                                           'Adres Do Odczytu
  115. I2crbyte Pomiarh , Ack                                      'Odczyt Pomiaru
  116. I2crbyte Pomiarl , Nack
  117. I2cstop                                                     'Bit Stopu
  118. Napiecie = Pomiarh * 256                                    'Przekształcenie
  119. Napiecie = Napiecie + Pomiarl
  120.                                   'Dla ADS1100 wpisujemy napięcie referencyjne = 2.048V
  121. Napiecie = Napiecie * 2.048
  122. Napiecie = Napiecie / 32768
  123. Napiecie = Napiecie / Pga
  124. Napiecie = Napiecie * 10.6        'Współczynnik K podziału (dzielnik rezystorowy)
  125. End Sub
  126.  
  127.  
  128. ' Konfiguracja I2C
  129. $lib "i2c_twi.lbx"
  130. Config Scl = Portc.5
  131. Config Sda = Portc.4
  132. I2cinit
  133. Config Twi = 100000
  134.  
  135. ' Konfiguracj zmiennych pomiaru napięcia
  136. Dim Default As Byte
  137. Dim Napiecie As Single At Disp(1) Overlay
  138. Dim Pga As Integer
  139. Dim Addressw As Byte
  140. Dim Addressr As Byte
  141. Dim Pomiarh As Byte
  142. Dim Pomiarl As Byte
  143. Dim Voltages As String * 10
  144. Pga = 1     'stopien wzmocnienia
  145.  
  146. ' Default = &B10001100  ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  147. Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  148. Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  149.  
  150.  
  151.  Call Test_displ
  152.       Wait 2
  153.        Call Cls_displ
  154.  
  155.  
  156. '=====GŁÓWNA PĘTLA=====
  157.  
  158. Do
  159.  
  160. Call Odczyt
  161. Call Show_result
  162.  
  163.  
  164.  Loop
  165. End
  166. '=====KONIEC GŁÓWNEJ PĘTLI=====
  167.  
  168.  
  169.  
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: niveasoft » 23 maja 2020, 15:15

Podmień tylko ten Sub. Może nie jest eleganckie, ale tak na szybko powinno ruszyć.
  1. Sub Show_result
  2.  
  3.       Dim Helpb As Byte
  4.       Const Decimal_point = 7                               'włacza kropeczkę, przecinek (ustawia 7 bit)
  5.  
  6.          Voltages = Fusing(napiecie , "00.&&&&")            'zawsze 7 literek tak?
  7.  
  8.          For N = 1 To 7
  9.  
  10.             Disp_num = 9 - N                                'to ustawia adres
  11.  
  12.             Select Case N
  13.              Case 3 : Disp_data.decimal_point = 1           'wstaw kropke
  14.              Case Else
  15.               Disp_data = Asc(voltages , N)                 'weź jedną literke
  16.             End Select
  17.  
  18.             Call Disp_write
  19.  
  20.          Next
  21.  
  22.     End Sub
Być może w tej jednej linii trzeba by napisać tak : Disp_data = Asc(voltages , N) - 48 , ale tego nie sprawdzałem.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: Michał6201 » 23 maja 2020, 16:44

Dziekęję Ci bardzo za pomoc. Bez Twojej pomocy nie ogarnąłbym tego w życiu.

Ten zapis: Disp_data = Asc(voltages , N) - 48 wstawia dwie kropki.

Pokazuje teraz wartość mierzonego napięcia, ale wynik dla 5V wygląda tak: 5PP.4820
Zawsze to PP wyświetla się. Jeśli mierzę 12V, to wynik wygląda tak: 122.2040

Jak zmniejszyłem liczbę wyświetlanych cyfr do 5, to ucina wartość po przecinku, a to PP pokazuje się cały czas.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: niveasoft » 23 maja 2020, 17:23

Ten działa na sto procent. Z tymi Maxami to mam takiego pecha że co bym nie napisał, udostepnił i opisał to i tak na końcu zawsze muszę to u siebie połączyć i za kogoś testować ;) Tak samo z tymi modułami jak i biblioteka do LedMatrix ...
  1. Sub Show_result
  2.  
  3.       Dim Disp_idx As Byte
  4.       Const Decimal_point = 7                               'włacza kropeczkę, przecinek (ustawia 7 bit)
  5.  
  6.          Voltages = Fusing(napiecie , "00.&&&&")            'zawsze 7 titerek tak?
  7.  
  8.       Disp_idx = 0
  9.  
  10.          'Voltages = "45.6789"              'test - >zakomentować
  11.  
  12.          For N = 1 To 7
  13.  
  14.             Select Case N
  15.              Case 3 : Disp_data.decimal_point = 1           'wstaw kropke
  16.              Case Else
  17.               Incr Disp_idx
  18.               Disp_num = 9 - Disp_idx                       'to ustawia adres
  19.               Disp_data = Asc(voltages , N) - 48            'weź jedną literke
  20.             End Select
  21.              Call Disp_write
  22.          Next
  23.  
  24.     End Sub
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: Michał6201 » 23 maja 2020, 18:53

Identyczne moduły mamy :)
W moim module na scalaku nie ma logo producenta MAXIM. Może mam jaką podróbkę tego scalaka?
Napięcie powyżej 10V dobrze wyświetla tak jak u Ciebie, natomiast poniżej 10V, wyświetla z jedną literka P. Co to za krzak ta literka P?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: niveasoft » 23 maja 2020, 20:23

W kodzie masz napisane "'10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)"

Coś tam ewidentnie masz ukryte a do takich spraw bierze się przejsciówkę USB<>RS232 i debuguje bo w terminalu jest więcej miejsca niż na LCD.

W Subie "Disp_write" dopisałbym sobie "Print Hex(Disp_buff)" i patrzył co tam się wysyła. Ciekawe skąd druga kropka...
Ten test działa dobrze? Znaczy się pokazuje na 2sec "12345678"?
Awatar użytkownika
Michał6201
Posty: 127
Rejestracja: 03 paź 2015, 20:07

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: Michał6201 » 23 maja 2020, 22:30

Tak, pokazuje prawidłowo przy starcie programu 12345678.
A dlaczego nie ma tego P na wyświetlaczu lcd?
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Obsługa MAX7219 z wyświetlaczami LED 7SEG

Post autor: niveasoft » 24 maja 2020, 9:33

Czy Ty próbowałes czytać notę tego układu?
Przecież tam napisane i ja napisałem jak się wyswietla P lub E.
Prosiłem byś sobie wyświetlił na terminalu dane np. w postaci Word.
Pierwszy człon to adres a drugi dane. Jesli w danych będą wartości od 0 do 9 to wyswietla dokładnie cyfry. Jesli w danych będą liczby większe, np.14 to wyświetli jakaś literę.
To nie jest az tak skomplikowane.

Żeby wyświetlić "12345678" trzeba wysłać 0x0801,0x0702,0x0603,0x0504,0x0405,0x0306,0x0207 i 0x0108

Teraz najlepiej zobaczyć co tak naprawde masz w zmiennej Voltages. Dla napiecia poniżej 5V powinno być np. "04.3210"
Sprawdź czy zmienna ma 7 znaków np Print "Len="; Len(voltages)

Bez Debugu po terminalu albo LCD to tylko zabawa w ciuciubabkę i strata czasu.
ODPOWIEDZ