Jak w jednym programie mieć pilota, przyciski i enkoder?

Proste przykłady do częstych pytań.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1207
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Jak w jednym programie mieć pilota, przyciski i enkoder?

Post autor: niveasoft » 21 mar 2017, 3:11

To nieskomplikowane. Można nawet dodać sterowanie po BT :D

Potrzebna jest tylko zmiana podejścia do tematu. Taka zmiana myślenia.
Widziałem już kody gdzie by dodać sterowanie pilotem powtarzano kod sterujący poszczególnymi funkcjami.
Jest to niepotrzebne.

Programy obsługi lepiej jest pisać tak by reagowały na wartość jakichś zmiennych, a nie konkretne sprzętowe zdarzenie.

Poniższy program reaguje na zmiany wartości zmiennej Control.
Na samym końcu pętli zmienna ta ma wartość zero. Kiedy pętla zaczyna swój kolejny bieg poszczególne Suby sprawdzają czy ktoś nie wcisnął przycisku, czy ktoś nie pokręcił enkoderem lub ktoś nie wcisnął przycisku pilota.
Jeśli coś takiego ma miejsce to zmiennej Control przypisują odpowiednią wartość.
Dla przykładu naciśnięcie przycisku plus na urządzeniu, naciśnięcie "plus volume" na pilocie lub pokrecenie enkoderem w prawo będzie skutkowało tym samym. W zmiennej Control zapisana zostanie wartość Plus_sig (Plus_signal) wczesniej zdefiniowany jako Alias dla wartosci 3

Stworzenie Aliasów nic nie kosztuje. Jest to tylko dla nas. Kod łatwiej czytać, trudniej o pomyłkę a kompilator patrzy na to jak na "3" :D

Później w programie, by nie rozpatrywać wszystkich przypadków niepotrzebnie, sprawdzamy czy w ogóle cokolwiek wciśnięto. Jeśli tak to reagujemy na konkretną wartość zmiennej

Pisząc tak jakieś Menu łatwo możesz potem je przenieść, lub dodać, na przykład sterowanie poprzez Bluetooth
Wystarczy by Sub obsługujący BT wpisał wartośći do zmiennej Control :D
  1. ' PROGRAM POZWALA NA KONTROLĘ URZĄDZENIA
  2. '  POPRZEZ ENKODER, PRZYCISKI I PILOTA
  3.  
  4. $regfile = "m328pdef.dat"
  5. $crystal = 8000000
  6. $hwstack = 64
  7. $swstack = 16
  8. $framesize = 64
  9.  
  10. Config Submode = New
  11.  
  12. '************ NA POTRZEBY PILOTA RC5 *****************
  13. Config Rc5 = Pind.2
  14.  Config Pind.2 = Input : Set Portd.2
  15.   Config Int0 = Falling : Enable Int0 : On Int0 Remote_int
  16.    Dim Get_remote As Byte , Address As Byte , Command As Byte
  17.  
  18. '************    ZMIENNE ENKODERA    *****************
  19. Dim Turn As Byte
  20.  Links Alias 1 : Rechts Alias 2
  21.  
  22. Enc_sw Alias Pind.3                     'jakiś przycisk enkodera
  23.  
  24.  
  25. '************ PRZYCISKI URZĄDZENIA   *****************
  26.  Dim Przyciski As Byte
  27.    Plus_sw Alias Pind.4
  28.   Minus_sw Alias Pind.5
  29.    Okay_sw Alias Pind.6
  30.  
  31.  
  32. '************  ZMIENNE DO KONTROLI   *****************
  33.  
  34. Dim Control As Byte
  35.  
  36.  Short_push Alias 1
  37.   Long_push Alias 2
  38.    Plus_sig Alias 3
  39.   Minus_sig Alias 4
  40.  
  41. '******************************************************
  42.  
  43. Sub Sprawdz_przyciski()
  44.  
  45.   Select Case Przyciski
  46.    Case 1 : Control = Long_push         'długie naciśnięcie
  47.    Case 2 : Control = Short_push        'krókie naciśnięcie
  48.    Case 3 : Control = Plus_sig          'przycisk zwiększający wartości
  49.    Case 4 : Control = Minus_sig         'przycisk zmniejszający wartości
  50.   End Select
  51.  
  52. End Sub
  53.  
  54. Sub Sprawdz_enkoder()
  55.  
  56.  Select Case Turn
  57.   Case Links : Control = Minus_sig      'pokręcenie w lewo
  58.   Case Rechts : Control = Plus_sig      'pokręcenie w prawo
  59.  End Select
  60.  
  61. End Sub
  62.  
  63. Sub Odbierz_rc5()
  64.  
  65.   Getrc5(address , Command)
  66.    Command = Command And &B01111111
  67.  
  68.     Select Case Command
  69.      Case 12 : Control = Long_push      'przycisk ON/OFF
  70.      Case 16 : Control = Minus_sig      '-Volume
  71.      Case 17 : Control = Plus_sig       '+Volume
  72.      Case 50 : Control = Short_push     'przycisk OK/MENU
  73.     End Select
  74.  
  75.   Get_remote = 0
  76.    Enable Int0
  77.  
  78. End Sub
  79.  
  80.  
  81. '####################################################
  82.  
  83.  Enable Interrupts
  84.  
  85. Do
  86.  'teraz w swoim programie po kolei sprawdzasz
  87.  'czy nie naciśnięto przycisku, pokrecono enkoderem,
  88.  'albo może odebrano coś z pilota ;)
  89.  
  90.   Call Sprawdz_przyciski()
  91.    Call Sprawdz_enkoder()
  92.     If Get_remote = 1 Then Call Odbierz_rc5()
  93.  
  94.  'sprawdzamy czy nadszedł jakiś sygnał
  95.  
  96.   If Control <> 0 Then
  97.  
  98.    'tutaj może reagować na WARTOŚĆ ZMIENNEJ "CONTROL"
  99.  
  100.    '---------------------------------------
  101.      Select Case Control
  102.  
  103.        Case Long_push
  104.         'długie wciśnięcie przycisku enkodera bądź Okay lub przycisk ON/OFF pilota
  105.  
  106.        Case Short_push
  107.         'krótkie wciśnięcie przycisku enkodera bądz Okay lub przycisk OK/MENU pilota
  108.  
  109.        Case Plus_sig
  110.         'przycisk zwiększający wartości, przycisk +Volume pilota lub enkoder w prawo
  111.  
  112.        Case Minus_sig
  113.         'przycisk zmniejszający wartość, przycisk -Volume pilota lub enkder w lewo
  114.  
  115.      End Select
  116.    '---------------------------------------
  117.  
  118.  
  119.   End If
  120.  
  121.  
  122.  Control = 0                            'zerujemy zmienną
  123. Loop
  124.  
  125. Remote_int:
  126.  Disable Int0
  127.   Get_remote = 1
  128. Return
  129.  
Na koniec chciałbym zwrócić uwagę na sposób odbioru kodu RC5.
Pin odbiornika podłączony jest do pinu INT0.
W ten sposób nie sprawdzamy w kółko czy pilot coś nadaje bo to zamula program.
Kiedy pilot coś nada. W przerwaniu ustawiam tylko flagę i wyłączam przerwanie bo pilot będzie kilkakrotnie zmieniał stan pinu.
Kiedy kod zostanie odebrany to obsługa tego przerwania zostanie ponownie włączona.
Procedurę trochę okroiłem, ale nie wszystko na raz ;)
ODPOWIEDZ