Sterownik oświetlenia bluetooth

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Sterownik oświetlenia bluetooth

Post autor: Rafał Piwowarczyk » 24 sie 2018, 10:56

Zmontowałem sobie dwukanałowy sterownik oświetlenia bluetooth na mega8, napisałem do niego poniższy kod w Bascom. Wszystko działa jak należy, tylko mam problem z dopisaniem kodu aby sterownik zapamiętywał ostatnie stany wyjść tak aby po wyłączeniu staerownika sterownik wracał do ostatnich stanów wyjść. Jestem początkującym i proszę forumowiczów o pomoc w dokończeniu kodu obsługi eeprom. Serdecznie pozdrawiam i z góry bardzo dziękuję.
  1.  
  2. $regfile = "m8def.dat"
  3. $crystal = 8000000
  4. $baud = 9600
  5. $hwstack = 40
  6. $swstack = 16
  7. $framesize = 32
  8.  
  9. Config Submode = New
  10. Config Debounce = 250
  11. Config Serialin = Buffered , Size = 10
  12.  
  13. Config Timer0 = Timer , Prescale = 256                      'Konfiguracja TIMER0
  14. On Timer0 Przerwanie1_1s
  15.  
  16. Config Timer2 = Timer , Prescale = 256                      'Konfiguracja TIMER2
  17. On Timer2 Przerwanie2_1s
  18.  
  19. '*******************
  20. 'Konfiguracja portów
  21. '*******************
  22.  
  23. Config Portc.0 = Output : Portc.0 = 0                       'Wyjścia stan początkowy niski
  24. Config Portc.1 = Output : Portc.1 = 0
  25. Config Portc.2 = Output : Portc.2 = 0
  26. Config Portd.4 = Output : Portd.4 = 0
  27. Config Pind.2 = Input : Portd.2 = 0
  28. Config Pind.6 = Input : Portd.6 = 1                         'Wejścia podciągnięte do zasilania
  29. Config Pind.7 = Input : Portd.7 = 1
  30. Config Pinb.4 = Input : Portb.4 = 1
  31. Config Pinb.5 = Input : Portb.5 = 1
  32.  
  33. '*******
  34. 'Zmienne
  35. '*******
  36.  
  37. Dim I As Integer
  38. Dim Znak As Byte
  39. Dim Get_w1 As Bit
  40. Dim Get_w2 As Bit
  41. Dim Licznik_1 As Word
  42. Dim Licznik_2 As Word
  43.  
  44. '************
  45. 'Nazwy portow
  46. '************
  47.  
  48. Led_1 Alias Portc.0
  49. Led_2 Alias Portc.1
  50. Lamp_1 Alias Portc.2
  51. Lamp_2 Alias Portd.4
  52. Mode_1 Alias Pind.7
  53. Mode_2 Alias Pind.6
  54. W_1 Alias Pinb.5
  55. W_2 Alias Pinb.4
  56.  
  57. Gosub Test_out
  58. Wait 1
  59.  
  60. '*********************
  61. 'Petla glowna programu
  62. '*********************
  63.  
  64. Enable Interrupts
  65.  
  66. 'Readeeprom Lamp_1 , 11
  67. 'Readeeprom Led_1 , 13
  68. 'Readeeprom Lamp_2 , 15
  69. 'Readeeprom Led_2 , 17
  70.  
  71. Do
  72.  
  73. If Mode_1 = 0 Then
  74. Debounce W_1 , 0 , Triak_1 , Sub
  75. End If
  76.  
  77. If Mode_2 = 0 Then
  78. Debounce W_2 , 0 , Triak_2 , Sub
  79. End If
  80.  
  81. If Lamp_1 = 0 Then
  82. Enable Timer0
  83. Else
  84. Disable Timer0
  85. Set Led_1
  86. End If
  87.  
  88. If Lamp_2 = 0 Then
  89. Enable Timer2
  90. Else
  91. Disable Timer2
  92. Set Led_2
  93. End If
  94.  
  95. If Get_w1 = 1 Then
  96. Get_w1 = 0
  97. Toggle Led_1
  98. End If
  99.  
  100. If Get_w2 = 1 Then
  101. Get_w2 = 0
  102. Toggle Led_2
  103. End If
  104.  
  105. '*****************
  106. 'Obsluga Bluetooth
  107. '*****************
  108.  
  109. If Ischarwaiting() > 0 Then
  110.  
  111. Znak = Inkey()
  112.  
  113. Select Case Znak
  114. Case "1" : If Mode_1 = 0 Then Gosub Triak_1
  115. Znak = 0
  116. Case "2" : If Mode_2 = 0 Then Gosub Triak_2
  117. Znak = 0
  118.  
  119. End Select
  120. End If
  121.  
  122. Loop
  123. End
  124.  
  125. '**********************
  126. 'Podprogram oswietlenie
  127. '**********************
  128.  
  129. Triak_1:
  130.  
  131. Waitms 150
  132. Toggle Lamp_1
  133. Toggle Led_1
  134. 'Writeeeprom Lamp_1 , 11
  135. 'Writeeeprom Led_1 , 13
  136. Return
  137.  
  138. Triak_2:
  139.  
  140. Waitms 150
  141. Toggle Lamp_2
  142. Toggle Led_2
  143. 'Writeeeprom Lamp_2 , 15
  144. 'Writeeeprom Led_2 , 17
  145. Return
  146.  
  147. '**************
  148. 'Test wyjsc OUT
  149. '**************
  150.  
  151. Test_out:
  152. Waitms 500
  153. Led_1 = 1
  154. Lamp_1 = 1
  155. For I = 0 To 1
  156. Portc . I = 1
  157. Waitms 500
  158. Led_2 = 1
  159. Lamp_2 = 1
  160. Portc . I = 0
  161. Next I
  162. Waitms 500
  163. Set Led_1
  164. Set Lamp_1
  165. Set Led_2
  166. Set Lamp_2
  167. Waitms 500
  168. Reset Led_1
  169. Reset Lamp_1
  170. Reset Led_2
  171. Reset Lamp_2
  172. Waitms 500
  173. Set Led_1
  174. Set Lamp_1
  175. Set Led_2
  176. Set Lamp_2
  177. Waitms 500
  178. Reset Led_1
  179. Reset Led_2
  180. Reset Lamp_1
  181. Reset Lamp_2
  182. Waitms 500
  183. Set Led_1
  184. Set Lamp_1
  185. Set Led_2
  186. Set Lamp_2
  187. Waitms 500
  188. Reset Led_1
  189. Reset Led_2
  190. Reset Lamp_1
  191. Reset Lamp_2
  192. Return
  193.  
  194. '********************
  195. 'Przerwanie od timer0
  196. '********************
  197.  
  198. Przerwanie1_1s:
  199.  
  200. Incr Licznik_1
  201. If Licznik_1 > 122 Then
  202. Licznik_1 = 0
  203. Get_w1 = 1
  204. End If
  205. Return
  206.  
  207. '********************
  208. 'Przerwanie od timer2
  209. '********************
  210.  
  211. Przerwanie2_1s:
  212.  
  213. Incr Licznik_2
  214. If Licznik_2 > 122 Then
  215. Licznik_2 = 0
  216. Get_w2 = 1
  217. End If
  218. Return
  219.  
  220.  
Awatar użytkownika
kulamario
Posty: 207
Rejestracja: 17 sie 2015, 20:05
Lokalizacja: Greystones
Kontakt:

Re: Sterownik oświetlenia bluetooth

Post autor: kulamario » 25 sie 2018, 0:47

Witam
Używasz wewnętrznej pamięci, więc pamiętaj o żywotności cyklów zapisu/odczytu.
Pewnie mozna to rozwiazac inaczej
Skoro to jest sterownik lamp to czemu atmega traci zasilanie?
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterownik oświetlenia bluetooth

Post autor: niveasoft » 25 sie 2018, 2:24

Łap. Powinno działać.
Z tą pamięcią to tak tragicznie nie jest. Jeśli rok ma 365 dni a pamięć ma gwarantowaną zapisywalność 100 tyś to jeśli stan zapamiętasz raz na dzień to Atmega wystarczy na 273 lata :D Idąc dalej to jak będziesz zapamiętywał dziesięć razy na dzień to starczy na 27 lat... Żeby skrócić ten czas do trzech lat musiałbyś codziennie klikać sto razy :D
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3. $baud = 9600
  4. $hwstack = 40
  5. $swstack = 16
  6. $framesize = 32
  7.  
  8. Config Submode = New
  9. Config Debounce = 250
  10. Config Serialin = Buffered , Size = 10
  11.  
  12. Config Timer0 = Timer , Prescale = 256                      'Konfiguracja TIMER0
  13. On Timer0 Przerwanie1_1s
  14.  
  15. Config Timer2 = Timer , Prescale = 256                      'Konfiguracja TIMER2
  16. On Timer2 Przerwanie2_1s
  17.  
  18. '*******************
  19. 'Konfiguracja portów
  20. '*******************
  21.  
  22. Config Portc.0 = Output : Portc.0 = 0                       'Wyjścia stan początkowy niski
  23. Config Portc.1 = Output : Portc.1 = 0
  24. Config Portc.2 = Output : Portc.2 = 0
  25. Config Portd.4 = Output : Portd.4 = 0
  26. Config Pind.2 = Input : Portd.2 = 0
  27. Config Pind.6 = Input : Portd.6 = 1                         'Wejścia podciągnięte do zasilania
  28. Config Pind.7 = Input : Portd.7 = 1
  29. Config Pinb.4 = Input : Portb.4 = 1
  30. Config Pinb.5 = Input : Portb.5 = 1
  31.  
  32. '*******
  33. 'Zmienne
  34. '*******
  35.  
  36. Dim I As Integer
  37. Dim Znak As Byte
  38. Dim Get_w1 As Bit
  39. Dim Get_w2 As Bit
  40. Dim Licznik_1 As Word
  41. Dim Licznik_2 As Word
  42.  
  43. '************
  44. 'Nazwy portow
  45. '************
  46.  
  47. Led_1 Alias Portc.0
  48. Led_2 Alias Portc.1
  49. Lamp_1 Alias Portc.2
  50. Lamp_2 Alias Portd.4
  51. Mode_1 Alias Pind.7
  52. Mode_2 Alias Pind.6
  53. W_1 Alias Pinb.5
  54. W_2 Alias Pinb.4
  55.  
  56. Gosub Test_out
  57. Wait 1
  58.  
  59. '*********************
  60. 'Petla glowna programu
  61. '*********************
  62. Dim T1 As Eram Byte
  63. Dim T2 As Eram Byte
  64. Dim Helpb As Byte
  65.  
  66. 'odczytywanie stanów przy starcie
  67. Helpb = T1
  68. If Helpb > 1 Then Helpb = 0
  69. Lamp_1 = Helpb
  70. Led_1 = Helpb
  71.  
  72. Helpb = T2
  73. If Helpb > 1 Then Helpb = 0
  74. Lamp_2 = Helpb
  75. Led_2 = Helpb
  76.  
  77.  
  78.  
  79. Enable Interrupts
  80.  
  81. Do
  82.  
  83.    If Mode_1 = 0 Then
  84.       Debounce W_1 , 0 , Triak_1 , Sub
  85.    End If
  86.  
  87.    If Mode_2 = 0 Then
  88.       Debounce W_2 , 0 , Triak_2 , Sub
  89.    End If
  90.  
  91.    If Lamp_1 = 0 Then
  92.       Enable Timer0
  93.    Else
  94.       Disable Timer0
  95.       Set Led_1
  96.    End If
  97.  
  98.    If Lamp_2 = 0 Then
  99.       Enable Timer2
  100.    Else
  101.       Disable Timer2
  102.       Set Led_2
  103.    End If
  104.  
  105.    If Get_w1 = 1 Then
  106.       Get_w1 = 0
  107.       Toggle Led_1
  108.    End If
  109.  
  110.    If Get_w2 = 1 Then
  111.       Get_w2 = 0
  112.       Toggle Led_2
  113.    End If
  114.  
  115. '*****************
  116. 'Obsluga Bluetooth
  117. '*****************
  118.  
  119.    If Ischarwaiting() > 0 Then
  120.  
  121.       Znak = Inkey()
  122.  
  123.       Select Case Znak
  124.          Case "1" : If Mode_1 = 0 Then Gosub Triak_1
  125.             Znak = 0
  126.          Case "2" : If Mode_2 = 0 Then Gosub Triak_2
  127.             Znak = 0
  128.  
  129.       End Select
  130.    End If
  131.  
  132. Loop
  133. End
  134.  
  135. '**********************
  136. 'Podprogram oswietlenie
  137. '**********************
  138.  
  139. Triak_1:
  140.  
  141.    Waitms 150
  142.    Toggle Lamp_1
  143.    Toggle Led_1
  144.     T1 = Lamp_1                                             'zapamiętywanie stanu
  145. Return
  146.  
  147. Triak_2:
  148.  
  149.    Waitms 150
  150.    Toggle Lamp_2
  151.    Toggle Led_2
  152.     T2 = Lamp_2                                             'zapamiętywanie stanu
  153. Return
  154.  
  155. '**************
  156. 'Test wyjsc OUT
  157. '**************
  158.  
  159. Test_out:
  160.    Waitms 500
  161.    Led_1 = 1
  162.    Lamp_1 = 1
  163.    For I = 0 To 1
  164.       Portc . I = 1
  165.       Waitms 500
  166.       Led_2 = 1
  167.       Lamp_2 = 1
  168.       Portc . I = 0
  169.    Next I
  170.    Waitms 500
  171.    Set Led_1
  172.    Set Lamp_1
  173.    Set Led_2
  174.    Set Lamp_2
  175.    Waitms 500
  176.    Reset Led_1
  177.    Reset Lamp_1
  178.    Reset Led_2
  179.    Reset Lamp_2
  180.    Waitms 500
  181.    Set Led_1
  182.    Set Lamp_1
  183.    Set Led_2
  184.    Set Lamp_2
  185.    Waitms 500
  186.    Reset Led_1
  187.    Reset Led_2
  188.    Reset Lamp_1
  189.    Reset Lamp_2
  190.    Waitms 500
  191.    Set Led_1
  192.    Set Lamp_1
  193.    Set Led_2
  194.    Set Lamp_2
  195.    Waitms 500
  196.    Reset Led_1
  197.    Reset Led_2
  198.    Reset Lamp_1
  199.    Reset Lamp_2
  200. Return
  201.  
  202. '********************
  203. 'Przerwanie od timer0
  204. '********************
  205.  
  206. Przerwanie1_1s:
  207.  
  208.    Incr Licznik_1
  209.    If Licznik_1 > 122 Then
  210.       Licznik_1 = 0
  211.       Get_w1 = 1
  212.    End If
  213. Return
  214.  
  215. '********************
  216. 'Przerwanie od timer2
  217. '********************
  218.  
  219. Przerwanie2_1s:
  220.  
  221.    Incr Licznik_2
  222.    If Licznik_2 > 122 Then
  223.       Licznik_2 = 0
  224.       Get_w2 = 1
  225.    End If
  226. Return
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Re: Sterownik oświetlenia bluetooth

Post autor: Rafał Piwowarczyk » 26 sie 2018, 14:41

Niestety Pana kod nie działa. Problem z kompilacją kodu. Jest jakiś błąd przy zapisie zmiennej T1 do eeprom. W podprogramie triak1: linia kodu T1 = Lamp_1. Kompilator wyrzuca błąd 253 i 105 (105- nie potrafię zapisać wartości bitowej, 253-ta zmienna nie może być w pamięci eram). Próbowałem zastąpić zmienną T1 zmienną helpb ale to nic nie dało. Sterownik nadal nie zapamiętuje stanu wyjść. Przepraszam za kłopot i proszę o pomoc. Pozdrawiam serdecznie
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Sterownik oświetlenia bluetooth

Post autor: niveasoft » 26 sie 2018, 14:52

Powinno pomóc coś takiego i oczywiście analogicznie w tym drugim Sub podobnie.
Poprzednio odpisywałem chyba w nocy i już o tym zapomniałem :D
  1. Triak_1:
  2.  
  3.    Waitms 150
  4.    Toggle Lamp_1
  5.    Toggle Led_1
  6.     Helpb = Lamp_1   'odczyt do zmiennej pomocniczej                                        
  7.     T1 = Helpb           'zapamiętywanie stanu
  8. Return
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Re: Sterownik oświetlenia bluetooth

Post autor: Rafał Piwowarczyk » 26 sie 2018, 16:05

Dziękuję serdecznie. Sterownik działa jak należy. Wkrótce umieszczę jego projekt na elektrodzie. Pozdrawiam serdecznie
Awatar użytkownika
pimowo
Posty: 392
Rejestracja: 28 maja 2016, 10:07

Re: Sterownik oświetlenia bluetooth

Post autor: pimowo » 26 sie 2018, 21:17

Rafał Piwowarczyk pisze:
26 sie 2018, 16:05
Wkrótce umieszczę jego projekt na elektrodzie.
A dlaczego nie tutaj? ;)
marekszy
Posty: 99
Rejestracja: 20 lis 2016, 20:21

Re: Sterownik oświetlenia bluetooth

Post autor: marekszy » 26 sie 2018, 21:24

Tak właściwie to czemu chcesz zapamiętać te ustawienia, nie lepiej zrobić aby wszystkie wyjścia po załączeniu sterownika były wyłączone. Co zrobisz jak zaniknie zasilanie przy włączonym świetle a ty będziesz musiał wyjść, jak wróci to wszystko będzie świecić.
Rafał Piwowarczyk
Posty: 8
Rejestracja: 18 gru 2016, 17:36

Re: Sterownik oświetlenia bluetooth

Post autor: Rafał Piwowarczyk » 27 sie 2018, 10:15

Widzisz tego nie wziąłem pod uwagę. Jest w tym jakaś logika. Brałem tylko pod uwagę to iż jak braknie zasilania żeby z wrotem nie podchodzić do wyłącznika żeby zaświecić światło gdyż sterownik będzie montowany w puszce podtynkowej pod wyłącznikiem. Dziękuję za uwagę
ODPOWIEDZ