Multiplexowanie LED

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Multiplexowanie LED

Post autor: marekszy » 18 lis 2023, 11:17

Witam
Może ktoś mi pomoże
Mam problem z wyświetleniem wyniku (np.temperatury itd.) na trzech wyświetlaczach LED, problem jest w tym ,że segmenty idą z różnych portów i to już nie wygląda tak prosto.
  1. '*******TRAWIARKA V_1**********
  2.  
  3. 'PB.7 - PK_grzanie    -otwarcie-1
  4. 'PB.1 - Motor (PWM)   -otwarcie-1
  5.  
  6. 'PRZYCISKI Pd.4 - DOWN / Pd.3 - UP /Pd.2 - ZEGAR / Pd.1 - TEMP. / Pd.0 - MOTOR
  7.  
  8. 'LED-y Pb.4 - zegar / Pb.3 - temp. / Pb.2 - motor  (wyzwalane -1)
  9.  
  10. 'WYSWIETLACZ LED wsp.anoda:
  11. 'Pd.7 - A1 / Pd.6 - A2 / Pd.5 - A3
  12. 'Pb.0 - a / Pc.5 - b / Pc.0 - c / Pc.2 - d / Pc.3 - e / Pc.4 - f /Pb.5 - g / Pc.1 dp
  13.  
  14.  
  15. $regfile = "m8def.dat"
  16. $crystal = 8000000
  17.  
  18. Config Portb = &B11111111 : Portb = &B00100001
  19. Config Portc = &B11111111 : Portc = &B01111111
  20. Config Portd = &B11100000 : Portd = &B11111111
  21.  
  22.  
  23. Config Timer0 = Timer , Prescale = 256
  24. Enable Timer0 : On Timer0 Prztimer0
  25.  
  26. Enable Interrupts
  27. '******************  ANIMACJA STARTOWA *******************
  28.  
  29. Declare Sub Loading                                         'animacja ladowana do LED w trakcie startu
  30. Loading
  31.  
  32. '********************ZMIENNE******************************
  33. dim Flaga_4ms as bit,Flaga_100ms as bit,Flaga_1s as bit
  34. dim Dzielnik As Byte , Dzielnik2 As Byte
  35. dim Mux as Byte
  36. Dim M As Byte , S As Byte , H as byte , W as Byte
  37. Dim wysw as byte , wysw1 as Byte , wysw10 as Byte , wysw100 as Byte
  38.  
  39. wysw = 234
  40. '*****************************petla glowna************************************
  41. Do
  42.   If Flaga_4ms = 1 Then                                     'co 4ms
  43.      Flaga_4ms = 0
  44.      gosub wyswietlanie
  45.   end If
  46.  
  47.   If Flaga_100ms = 1 Then
  48.      Flaga_100ms = 0
  49.      'gosub wyswietlanie
  50.   end If
  51.  
  52.   If Flaga_1s = 1 Then
  53.      Flaga_1s = 0
  54.   end If
  55.  
  56.  Loop
  57. End
  58. '***************petla glowna koniec*****************
  59.  
  60. '*******przerwanie timer0*****************
  61. Prztimer0:
  62.  Timer0 = 131    'dla 8MHz
  63.  Flaga_4ms = 1
  64.  Incr Dzielnik
  65.  If Dzielnik = 25 Then                                      '25*4ms = 100ms
  66.    Dzielnik = 0
  67.    Flaga_100ms = 1
  68.    Incr Dzielnik2
  69.    If Dzielnik2 = 10 Then                                   '10*100ms=1s'
  70.     Dzielnik2 = 0
  71.     Flaga_1s = 1
  72.    End If
  73.  End If
  74. Return
  75.  
  76.  
  77.  
  78.  
  79. '**********************************wyswietlanie*********************************
  80. Wyswietlanie:
  81.  
  82. 'A1-PORTD.7 / A2-PORTD.6 / A3-PORTD.5
  83. 'Pb.0 - a / Pc.5 - b / Pc.0 - c / Pc.2 - d / Pc.3 - e / Pc.4 - f /Pb.5 - g / Pc.1 dp
  84.  
  85.  
  86.  Incr Mux
  87.  If Mux = 3 Then Mux = 0
  88.  
  89.  Select Case Mux
  90.  
  91.   Case 0:             'minuty
  92.     set portd.5        'A3
  93.     set portc.1        'dp
  94.     ' W = H mod 10
  95.     Wysw = wysw100
  96.     set portc.1     'dp
  97.      reset portd.7     'A1
  98.  
  99.   Case 1:              'dziesiątki sekund
  100.     set portd.7        'A1
  101.     reset portc.1        'dp
  102.     Wysw = wysw10
  103.     reset portd.6      'A2
  104.  
  105.   Case 2:              'sekundy
  106.     set portd.6        'A2
  107.     set portc.1        'dp
  108.     Wysw = wysw1
  109.     reset portd.5      'A3
  110.  
  111.  End Select
  112.  
  113.  Wysw1 = Wysw mod 10
  114.  Wysw = Wysw / 10
  115.  Wysw10 = Wysw mod 10
  116.  Wysw = Wysw / 10
  117.  Wysw100 = Wysw mod 10
  118.  
  119.  Wysw1 = lookup (wysw1 , Tabela)
  120.  Wysw10 = lookup (wysw10 , Tabela)
  121.  Wysw100 = lookup (wysw100 , Tabela)
  122.  
  123.  
  124. portb.0 = Wysw.0 'a
  125. portc.5 = Wysw.1 'b
  126. portc.0 = Wysw.2 'c
  127. portc.2 = Wysw.3 'd
  128. portc.3 = Wysw.4 'e
  129. portc.4 = Wysw.5 'f
  130. portb.5 = Wysw.6 'g
  131. 'portc.1 dp
  132. Return
  133.  
  134. '****************************wyswietlanie koniec********************************
  135.  
  136. '*************************** tabela *******************************
  137.  
  138. Tabela:
  139.  
  140.       Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 , 191
  141. 'znak:      0     1     2     3     4     5     6     7     8     9   pusty   -
  142.  
  143. '***************animacje dla LED **********************************
  144. Sub Loading :                                               'program animacji startowej
  145. reset portd.5
  146. reset portd.6
  147. reset portd.7
  148. reset portb.0
  149. waitms 250
  150.  
  151. set portb.0
  152. reset portc.5
  153. waitms 250
  154.  
  155. set portc.5
  156. reset portc.0
  157. waitms 250
  158.  
  159. set portc.0
  160. reset portc.2
  161. waitms 250
  162.  
  163. set portc.2
  164. reset portc.3
  165. waitms 250
  166.  
  167. set portc.3
  168. reset portc.4
  169. waitms 250
  170.  
  171. set portc.4
  172. reset portb.5
  173. waitms 250
  174.  
  175. set portb.5
  176. reset portc.1
  177. waitms 250
  178.  
  179. Return
  180. End Sub
Jakie pomysły ? Proszę o pomoc lub podpowiedzi
pozdrawiam
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Re: Multiplexowanie LED

Post autor: marekszy » 19 lis 2023, 13:34

OK, w teorii wszystko działa ,pokazuje do 999, dołożę termometr i zobaczymy czy zadziała
  1. '*******TRAWIARKA V_1**********
  2.  
  3. 'PB.7 - PK_grzanie    -otwarcie-1
  4. 'PB.1 - Motor (PWM)   -otwarcie-1
  5.  
  6. 'PRZYCISKI Pd.4 - DOWN / Pd.3 - UP /Pd.2 - ZEGAR / Pd.1 - TEMP. / Pd.0 - MOTOR
  7.  
  8. 'LED-y Pb.4 - zegar / Pb.3 - temp. / Pb.2 - motor  (wyzwalane -1)
  9.  
  10. 'WYSWIETLACZ LED wsp.anoda:
  11. 'Pd.7 - A1 / Pd.6 - A2 / Pd.5 - A3
  12. 'Pb.0 - a / Pc.5 - b / Pc.0 - c / Pc.2 - d / Pc.3 - e / Pc.4 - f /Pb.5 - g / Pc.1 dp
  13.  
  14.  
  15. 'liczy do 999
  16.  
  17. $regfile = "m8def.dat"
  18. $crystal = 8000000
  19.  
  20. Config Portb = &B11111111 : Portb = &B00100001
  21. Config Portc = &B11111111 : Portc = &B01111111
  22. Config Portd = &B11100000 : Portd = &B11111111
  23.  
  24.  
  25. Config Timer0 = Timer , Prescale = 256
  26. Enable Timer0 : On Timer0 Prztimer0
  27.  
  28. Enable Interrupts
  29. '******************  ANIMACJA STARTOWA *******************
  30.  
  31. Declare Sub Loading                                         'animacja ladowana do LED w trakcie startu
  32. Loading
  33.  
  34. '********************ZMIENNE******************************
  35. dim Flaga_4ms as bit,Flaga_100ms as bit,Flaga_1s as bit
  36. dim Dzielnik As Byte , Dzielnik2 As Byte
  37. dim Mux as Byte
  38. Dim H as word , W as byte
  39. Dim wysw as byte , wysw1 as word , wysw10 as word , wysw100 as word
  40. H = 987
  41.  
  42. '*****************************petla glowna************************************
  43. Do
  44.   If Flaga_4ms = 1 Then                                     'co 4ms
  45.      Flaga_4ms = 0
  46.      gosub wyswietlanie
  47.   end If
  48.  
  49.   If Flaga_100ms = 1 Then
  50.      Flaga_100ms = 0
  51.      'gosub wyswietlanie
  52.   end If
  53.  
  54.   If Flaga_1s = 1 Then
  55.      Flaga_1s = 0
  56.   end If
  57.  
  58.  Loop
  59. End
  60. '***************petla glowna koniec*****************
  61.  
  62. '*******przerwanie timer0*****************
  63. Prztimer0:
  64.  Timer0 = 131    'dla 8MHz
  65.  Flaga_4ms = 1
  66.  Incr Dzielnik
  67.  If Dzielnik = 25 Then                                      '25*4ms = 100ms
  68.    Dzielnik = 0
  69.    Flaga_100ms = 1
  70.    Incr Dzielnik2
  71.    If Dzielnik2 = 10 Then                                   '10*100ms=1s'
  72.     Dzielnik2 = 0
  73.     Flaga_1s = 1
  74.    End If
  75.  End If
  76. Return
  77.  
  78.  
  79.  
  80.  
  81. '**********************************wyswietlanie*********************************
  82. Wyswietlanie:
  83.  
  84. 'A1-PORTD.7 / A2-PORTD.6 / A3-PORTD.5
  85. 'Pb.0 - a / Pc.5 - b / Pc.0 - c / Pc.2 - d / Pc.3 - e / Pc.4 - f /Pb.5 - g / Pc.1 dp
  86.  
  87.  
  88.  Incr Mux
  89.  If Mux = 3 Then Mux = 0
  90.  
  91.  Select Case Mux
  92.   Case 0:                     'Wyswietlacz A1 - setki
  93.     set portd.5               'A3
  94.     set portc.1               'dp
  95.     wysw1 = H / 100
  96.     wysw1 = wysw1 mod 10
  97.      W = wysw1
  98.      W = lookup (w , tabela)
  99.     set portc.1
  100.     reset portd.7             'A1
  101.  
  102.  
  103.   Case 1:                     'Wyswietlacz A2 - dziesiatki
  104.     set portd.7               'A1
  105.     reset portc.1
  106.     wysw100 = H / 10
  107.     wysw100 = wysw100 mod 10
  108.     W = wysw100
  109.     W = lookup (w , tabela)
  110.     reset portd.6              'A2
  111.  
  112.   Case 2:                      'Wyswietlacz A3 - jednosci
  113.     set portd.6                'A2
  114.     set portc.1                'dp
  115.     Wysw10 = H mod 10
  116.     W = wysw10
  117.     W = lookup (w , tabela)
  118.     reset portd.5              'A3
  119.  
  120.  
  121.  End Select
  122.  
  123.  
  124. portb.0 = W.0 'a
  125. portc.5 = W.1 'b
  126. portc.0 = W.2 'c
  127. portc.2 = W.3 'd
  128. portc.3 = W.4 'e
  129. portc.4 = W.5 'f
  130. portb.5 = W.6 'g
  131. 'portc.1 dp
  132. Return
  133.  
  134.  
  135. '****************************wyswietlanie koniec********************************
  136.  
  137. '*************************** tabela *******************************
  138.  
  139. Tabela:
  140.  
  141.       Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255 , 191
  142. 'znak:      0     1     2     3     4     5     6     7     8     9   pusty   -
  143.  
  144. '***************animacje dla LED **********************************
  145. Sub Loading :                                               'program animacji startowej
  146. reset portd.5
  147. reset portd.6
  148. reset portd.7
  149. reset portb.0
  150. waitms 250
  151.  
  152. set portb.0
  153. reset portc.5
  154. waitms 250
  155.  
  156. set portc.5
  157. reset portc.0
  158. waitms 250
  159.  
  160. set portc.0
  161. reset portc.2
  162. waitms 250
  163.  
  164. set portc.2
  165. reset portc.3
  166. waitms 250
  167.  
  168. set portc.3
  169. reset portc.4
  170. waitms 250
  171.  
  172. set portc.4
  173. reset portb.5
  174. waitms 250
  175.  
  176. set portb.5
  177. reset portc.1
  178. waitms 250
  179.  
  180. Return
  181. End Sub
Może ktoś zerknąć czy ma to jakiś sens ?
Awatar użytkownika
niveasoft
Posty: 1239
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Multiplexowanie LED

Post autor: niveasoft » 19 lis 2023, 14:07

Dopiero teraz zajarzyłem o co chodzi bo chyba oszczędnie opisałeś sprawę :D
Chyba będzie działać tylko jak odczyt temperatury zajmie dużo czasu to to może migać. Być może trzeba wyświetlanie przenieść do przerwania.
W mux0 dwa razy ustawiasz tę kropkę.
Slaw0
Posty: 3
Rejestracja: 19 wrz 2020, 20:21

Re: Multiplexowanie LED

Post autor: Slaw0 » 20 lis 2023, 8:18

Witam. Ja bym także zrobił wyświetlanie w przerwaniu, ale samo wyświetlanie. Natomiast obliczenia dla poszczególnych cyfr w pętli głównej. Coś w stylu...
Disp = twoja_wartosc_do_wyswietlenia
For a = 3 to 1 step -1
Word_help = disp mod 10
Dig(a) = word_help
Disp = disp / 10
Next a
marekszy
Posty: 112
Rejestracja: 20 lis 2016, 20:21

Re: Multiplexowanie LED

Post autor: marekszy » 20 lis 2023, 12:15

Ok, dzięki , ale mój już działa prawidłowo , co prawda lekko mruga i faktycznie trzeba będzie to przenieść ale to później , teraz walczę z dalsza częścią kodu (i tu tez pewnie będą problemy)🤔
Slaw0
Posty: 3
Rejestracja: 19 wrz 2020, 20:21

Re: Multiplexowanie LED

Post autor: Slaw0 » 20 lis 2023, 14:56

Czasem robię tak że w przerwaniu ustawiam jakiś bit na 0 nazwijmy go flaga, a w pętli głównej przed komunikacja 1wire daję
Set flaga
Bitwait flaga, reset
I tu polecenie 1wire
Nic wtedy nie mruga.
ODPOWIEDZ