Osługa wyświetlacza 7 segmentowego

Prezentacje projektów
Awatar użytkownika
Michał6201
Posty: 121
Rejestracja: 03 paź 2015, 20:07

Osługa wyświetlacza 7 segmentowego

Post autor: Michał6201 » 11 maja 2020, 20:22

Witam

Do tej pory nie miałem zasilacza regulowanego, z którego mógłbym sobie zasilać układy, którymi się bawię w wolnym czasie.
Jako, że teraz mamy znacznie więcej czasu wolnego, który spędzamy w domu, więc mam wspaniałą okazję poświęcić się zabawie i zrobić sobie coś przydatnego ;) Wybór padł na zasilacz regulowany.

Do wyświetlania napięcia w moim zasilaczu chcę wykorzystać wyświetlacze 7 segmentowe LED ze wspólną anodą.
Wybór padł na wyświetlacze led, ponieważ uznałem, że będzie lepiej wyglądać wartość napięcia wyświetlana na takim wyświetlaczu, niż na zwykłym lcd. A przy okazji nauczę się czegoś nowego.

I tu napotkałem na pierwszy problem, ponieważ obsługę wyświetlaczy lcd mam w miarę opanowaną i nie byłoby problemu z wyświetleniem danych na takim wyświetlaczu. Natomiast nigdy nie miałem do czynienia z obsługą wyświetlaczy 7 segmentowych pod względem programowym.
Przeczytałem oczywiście artykuł Bartka o obsłudze wyświetlaczy 7 segmentowych w Bascomie.

I teraz zastanawiam się jak zrobić to od strony hardware?

- nie mam całego portu wolnego w ATmedze, więc część segmentów byłaby podłączona do jednego portu, a pozostałe segmenty do drugiego portu. To chyba skomplikowałoby kod, prawda?
- Barek wspomniał też na końcu artykułu o użyciu rejestru przesuwnego 74HC595 do obsługi tych wyświetlaczy. Z tego co widziałem tam, to taki scalak znacznie skróciłby kod i przy okazji wyeliminowałbym potrzebę użycia całego portu kontrolera, prawda?

Jak radzicie to zrobić? Jak będzie lepiej i prościej w kodzie?
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Osługa wyświetlacza 7 segmentowego

Post autor: niveasoft » 11 maja 2020, 20:45

Ile wyświetlaczy tam przewidujesz? Multipleksowanie mocno obciąża procesor i jak bym miał wybór to bym złapał gotowy moduł lub budował płytkę z Max7219. Moduły są po 15zł na Alledrogo LINK tylko one są dość niskie (mam taki w domu i byłem zaskoczony jak przybył :D Mogę zrobić fotę z czymś do porównania)
W Max7219 chodzi o to że sam multipleksuje a procesorem wysyłasz mu tylko dane (chyba trzema kablami) co ma wyświetlić - tak jak do LCD. Kod do tego się znajdzie.

Gdybyś potrzebował wyższe wyświetlacze to lepiej kupić gołego Maxa i osobno wyświetlacze no chyba że trafisz wyższy - a może ten mały akurat przypasi :D

Przy multipleksowaniu to obsługę czujników temperatury DS18B20 już trzeba potrafić zrobić....a mogą się przydać.
Awatar użytkownika
Michał6201
Posty: 121
Rejestracja: 03 paź 2015, 20:07

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Michał6201 » 11 maja 2020, 21:03

Wyświetlacze mam smd niskie - OSK3028A-IG koloru zielonego.
Jeden wyświetlacz, to 3 cyfry ze wspólną anodą.
Gotowego modułu nie chce, sam zrobię to na płytce dwustronnej. Więc z montażem MAX7219 nie będzie problemu. Nawet nie wiedziałem, że takie faje scalaki są :)
Ale widzę, że on ma wspólna katodę, więc musiałbym przy okazji kupić takie wyświetlacze ale ze wspólną katodą, prawda?

To robimy obsługę wyświetlaczy na MAX7219 :D I jeszcze jak płytkę uprości :) Same plusy tego rozwiązania, które mi podsunąłeś :)

Widzę, że do sterowania będą potrzebne piny MOSI, SCK i I/0.
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Osługa wyświetlacza 7 segmentowego

Post autor: niveasoft » 11 maja 2020, 21:29

No można go sterować Hardware SPI na dedykowanych pinach, Software SPI na jakichkolwiek albo najprostszym Shiftout też na każdych pinach...no i wspólna katoda.
Awatar użytkownika
Michał6201
Posty: 121
Rejestracja: 03 paź 2015, 20:07

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Michał6201 » 11 maja 2020, 22:04

Czyli obojętne jakie 3 piny podepnę i będzie ok?
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Jacek » 11 maja 2020, 23:11

Witam - Michał a czy będzie to zasilacz regulowany analogowo czy przewidujesz sterowanie cyfrowe?
pozdrawiam Jacek.
Awatar użytkownika
Michał6201
Posty: 121
Rejestracja: 03 paź 2015, 20:07

Re: Osługa wyświetlacza 7 segmentowego

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

Witaj

Regulację napięcia zrobię analogowo precyzyjnym potencjometrem.

Bartek - zamówiłem MAX7219 :)

A jeszcze mam takie pytanie do Bartka, może orientujesz się -
Jest jeden mikrokontroler ATmega, mamy dwa osobne wyświetlacze - pierwszy wyświetlacz to górny wiersz, a drugi wyświetlacz to dolny wiesz. (coś takiego jak wyświetlacz lcd 2x16)
Każdy z tych wyświetlaczy podłączony jest do osobnego MAX7219. Da się w tym samym czasie wyświetlać z jednego mokrokontrolera np. napięcie na górnym wyświetlaczu, a prąd na dolnym wyświetlaczu w tym samym czasie?

A czy może jednak trzeba dać dwa mikrokonrolery, które będą realizować swoje zadania i każdy z nich będzie miał swoja kostkę MAX7219 i swój wyświetlacz?

Po poszukiwaniach w internecie, widzę że się chyba da tak zrobić. Tylko teraz tak - użyć sprzętowego SPI, a czy programowego? Oczywiście do sterowania na raz dwoma MAX7219 i dwoma wyświetlaczami niezależnie.
Ostatnio zmieniony 12 maja 2020, 18:41 przez Michał6201, łącznie zmieniany 2 razy.
Awatar użytkownika
Jacek
Posty: 384
Rejestracja: 25 kwie 2016, 19:14

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Jacek » 12 maja 2020, 16:45

Ok - dzięki za info.
pozdr. Jacek.
Pikczu
Posty: 388
Rejestracja: 17 sie 2015, 13:46
Lokalizacja: Dublin, Ireland
Kontakt:

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Pikczu » 21 maja 2020, 22:00

Zobacz na to chyba nie ma sensu robić zasilacza
[media]https://www.youtube.com/watch?v=0qjLx_HsKUQ[/media]
Awatar użytkownika
Michał6201
Posty: 121
Rejestracja: 03 paź 2015, 20:07

Re: Osługa wyświetlacza 7 segmentowego

Post autor: Michał6201 » 22 maja 2020, 18:32

Widziałem to.
Tylko że to jest impulsowy zasilacz.
Ja jednak do mojego hobby wolałbym zasilacz na transformatorze.

Poza tym, jaka jest satysfakcja z kupienia gotowca?
Chciałem sobie zrobić sam od podstaw i mieć radochę z tego, ze sam cos zrobiłem i działa. A przy okazji nauczyłem się czegoś nowego.
Ja to robię dla zabawy i przyjemności :)

Mam już moduł wyświetlacza LED na MAX7219.
Obsługę samego MAX7219 wziąłem z elektrody.
Skleciłem taki oto program do pomiaru napięcia i wyświetlenia wartości na wyświetlaczu led. Sam pomiar działa, bo wyświetla wartosć poprawna na wyświetlaczu lcd 2x16.
Natomiast nie potrafię wyświetlić tej wartości na tych wyświetlaczach led.

Oto ten kod:
  1. ' WOLTOMIERZ 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. Const Opcja = 1
  13. '**************************************************************************************
  14.  
  15. #if Opcja = 0
  16.  
  17. '************ deklaracje SPI programowego dla MAX7219
  18. Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Clock = Portb.5 , Ss = None
  19.  Spiinit
  20.  
  21. #elseif Opcja = 1
  22.  
  23. '************ deklaracje SPI sprzętowego dla MAX7219
  24. Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
  25.  Config Portb.2 = Output : Ss_pin Alias Portb.2 : Set Ss_pin       'żeby SPI nie przeszła w Slave
  26.   Spiinit
  27.  
  28. #endif
  29.  
  30. '********************************** KONFIGURACJAA MAX7219****************************************************
  31.  
  32. Config Portb.0 = Output : Load_max Alias Portb.0 : Set Load_max
  33.  
  34.  
  35. Dim Buff(4) As Byte
  36. Dim Displ2 As Word At Buff(1) Overlay
  37. Dim Displ1 As Word At Buff(3) Overlay
  38.  
  39. Dim Test As Byte , N As Byte
  40.  
  41. Const No_op = 0
  42.  
  43. Sub Send_buff
  44.  
  45.   Reset Load_max
  46.  
  47.     Spiout Buff(1) , 4
  48.  
  49.   Set Load_max
  50.  
  51. End Sub
  52.  
  53. Buff(1) = &H0C                                              '&H0C Power mode, 0-OFF,1-ON
  54. Buff(2) = &H00
  55.  Displ1 = Displ2
  56.   Call Send_buff
  57.  
  58. Buff(1) = &H09                                              'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
  59. Buff(2) = &B1111_1111                                       '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
  60.  Displ1 = Displ2
  61.   Call Send_buff
  62.  
  63. Buff(1) = &H02
  64. Buff(2) = &H02                                              'jasnosc 16 krokow, wartosci od &H00 do &H0F
  65.  Displ1 = Displ2
  66.   Call Send_buff
  67.  
  68. Buff(1) = &H0B
  69. Buff(2) = 7                                                 'ile ma obsługiwac cyfr, wartosci od 0 do 7
  70.  Displ1 = Displ2
  71.   Call Send_buff
  72.  
  73.  
  74. Buff(1) = &H0F
  75. Buff(2) = 0                                                 'Test wyswietlacza, 0-OFF, 1-TEST ON
  76.  Displ1 = Displ2
  77.   Call Send_buff
  78.  
  79. Buff(1) = &H0C
  80. Buff(2) = &H01                                              '&H0C Power mode, 0-OFF,1-ON
  81.  Displ1 = Displ2
  82.   Call Send_buff
  83.  
  84.  
  85.  
  86. ' Konfiguracja I2C
  87. $lib "i2c_twi.lbx"
  88. Config Scl = Portc.5
  89. Config Sda = Portc.4
  90. I2cinit
  91. Config Twi = 100000
  92.  
  93. ' Konfiguracj zmiennych pomiaru napięcia
  94. Dim Default As Byte
  95. Dim Napiecie As Single
  96. Dim Pga As Integer
  97. Dim Addressw As Byte
  98. Dim Addressr As Byte
  99. Dim Pomiarh As Byte
  100. Dim Pomiarl As Byte
  101. Dim Voltages As String * 10
  102. Pga = 1     'stopien wzmocnienia
  103.  
  104. ' Default = &B10001100  ' ustawienie parametrów pracy, Bez tego rejestru układ ma fabryczne ustawienia
  105. Addressw = &B10011110 '158; adres zapizu danych dla [ED7]
  106. Addressr = &B10011111 '159; adres odczytu danych dla [ED7]
  107.  
  108. '=====GŁÓWNA PĘTLA=====
  109.  
  110. Do
  111. Gosub Odczyt                                                'Skoko do procedury odczytu danych
  112. Cursor Off
  113. Gosub Wyswietl                                              'Skok do proceduty wyświetlenia wyniku na LED
  114. Waitms 250
  115. Waitms 250
  116. Loop
  117. End
  118. '=====KONIEC GŁÓWNEJ PĘTLI=====
  119.  
  120.  
  121. '-------PROCEDURA ODCZYTU DANYCH Z ADS1110-----
  122. Odczyt:
  123. I2cstart
  124. I2cwbyte Addressr                                           'Adres Do Odczytu
  125. I2crbyte Pomiarh , Ack                                      'Odczyt Pomiaru
  126. I2crbyte Pomiarl , Nack
  127. I2cstop                                                     'Bit Stopu
  128. Napiecie = Pomiarh * 256                                    'Przekształcenie
  129. Napiecie = Napiecie + Pomiarl
  130.                                   'Dla ADS1100 wpisujemy napięcie referencyjne = 2.048V
  131. Napiecie = Napiecie * 2.048
  132. Napiecie = Napiecie / 32768
  133. Napiecie = Napiecie / Pga
  134. Napiecie = Napiecie * 10.6        'Współczynnik K podziału (dzielnik rezystorowy)
  135. Return
  136.  
  137.  
  138.  
  139.  
  140.  
  141. '-----PROCEDURA WYŚWIETLENIA WARTOŚCI MIERZONEGO NAPIĘCIA NA LED-----
  142. Wyswietl:
  143.  
  144.  Voltages = Fusing(napiecie , "00.&&&&")
  145.  Displ1 = napiecie
  146.  
  147. Return
Myślę, że problem leży w samym sposobie wyświetlenia tej wartości mierzonej. Niestety nie wiem jak to napisać. Myślałem, że to będzie równie proste i przejrzyste jak w przypadku LCD, ale się myliłem.
ODPOWIEDZ