PIN-Befehle

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Jedes Control6-Skript muss mit CONTROL_START beginnen und mit CONTROL_END enden. Dazwischen kannst du verschiedene Aktionen definieren, die mit ACTION($action_name) beginnen und mit ACTION_END($action_name) enden, wobei $action_name durch eine eindeutige Bezeichnung der Aktion ersetzt werden muss.

Zwischen den ACTION-Kennzeichnern fügst du den Programmcode für die jeweilige Aktion ein. Außerhalb aller Aktionen schreibst du auf, wie das Control6-Skript auf Ereignisse (Events) reagieren soll. Beispielsweise diesen Programmcode, der außerhalb aller Aktionsblöcke plaziert wird (für das Beispiel musst du "Clock Support" in der Ethersex-Firmware einschalten).

ON CLOCK_MIN == 5 DO THREAD_START(nice_gaudi) END

Hier siehst du, wie ein solcher Event-Handler geschrieben wird. Dieser startet dann, wenn das Minuten-Feld der Zeit genau 5 ist (beispielsweise um 05:05 oder 23:05 Uhr), den Thread "nice_thread". Dabei musst du dir folgender Eigenschaft des THREAD_START-Befehls bewusst sein: Dieser startet den Thread nur dann, wenn er nicht bereits vorher gestartet wurde. Dieser Programmcode startet die Aktion nur beim ersten mal nach Programmstart (falls die Aktion nicht irgendwo mit THREAD_STOP beendet wird). Zusätzlich besteht die Möglichkeit THREAD_RESTART zu verwenden: Bei jedem Aufruf von THREAD_RESTART, wird der Thread neu gestartet.

Ein einfaches Beispiel, das dir einige Eigenschaften von Control6 zeigt:

CONTROL_START
  
  PIN_INPUT(KEY)
  PIN_PULLUP(KEY)
  PIN_OUTPUT(LED)

  THREAD(nice_gaudi)
      TIMER_START(new)
      PIN_SET(LED);
      TIMER_WAIT(new, 20)
      PIN_CLEAR(LED);
  THREAD_END(nice_gaudi)

  ON CLOCK_MIN == 5 DO THREAD_RESTART(nice_gaudi) END
  ON PIN_FALLING(KEY) DO THREAD_RESTART(nice_gaudi) END

CONTROL_END
  • Die typischen Schlüsselwörter CONTROL_START und CONTROL_END umschließen das Control6-Skript.
  • Die PIN-Befehle:
    • Auf welchen Pin sich der Bezeichner PIN_INPUT und die anderen Bezeichner PIN_* beziehen, ist in pinning/*.m4 definiert. Du kannst dort auch deine eigenen Pins hinzufügen.
    • PIN_INPUT definiert den Pin KEY pin als Eingabe-Pin (Input), das Register DDRx wird passend gesetzt.
    • PIN_PULLUP schaltet den internen Pullup-Widerstand des Mikrocontrollers für den Pin KEY ein, indem das Register PORTx entsprechend gesetzt wird.
    • PIN_OUTPUT definiert den Pin LED als Ausgabe-Pin (Output), das Register DDRx wird entsprechend gesetzt.
    • PIN_FALLING(KEY) ist ein Event, der durch jede fallende Flanke des Signals am Pin KEY getriggert wird. Entsprechend zu PIN_FALLING, existiert auch der Event PIN_RISING für steigende Flanken.
  • THREAD und THREAD_END definieren den neuen Thread "nice_gaudi". Innerhalb dieses Threads wird ein Timer gestartet. (Durch den ersten Aufruf von TIMER_START wird gleichzeitig der Timer erzeugt, doch außerdem kann der Timer auch durch TIMER_NEW erzeugt werden). Nachdem der Timer gestartet wird, wird der Pin LED gesetzt.
  • Durch TIMER_WAIT wird gewartet, bis der erzeugte Timer 20 Sekunden erreicht hat. Danach wird der Pin LED gelöscht. Beachte die Semikola ";" am Ende der Zeilen PIN_SET und PIN_CLEAR. Dies wird benötigt, da diese Zeilen nicht mit M4 interpretiert werden sondern als einfacher C-Code (über CPP-Makros).
  • Die beiden ON-Kommandos starten den Thread "nice_gaudi" entweder wenn das Minutenfeld der Uhr "5" beträgt (beachte den RESTART) oder eine fallende Flanke am Pin KEY auftritt.