Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

wait in Funktionen Kategorie: Programmierung (von wema - 18.05.2006 12:58)
Ich nutze:
C164CI-ControllerBoard, CC2-ReglerBoard, OSOPT V3.0
Hallo,

ich bin zur Zeit dabei, meine seit 1,5 Jahren selbstentwickelte Haussteuerung (Heizung, Kaminkessel,
Solaranlage sowie Rollläden) zu optimieren. Dabei bin ich auf einen Thread gestoÃ?en, welchen ich
zu Beginn meiner Programmierarbeiten zur Tastenabfrage eingesetzt habe. Hier der Code:

{
  int tasterAllLast1,tasterAllLast2;
  int tasterModul1,tasterModul2;
  int tasterAllChange1,tasterAllChange2, tasterAll1,tasterAll2;
  int x;
  byte port;
  long tasteDauer[31];

  //Initialisieren
  tasterAllLast1=0;
  tasterAllLast2=0;
  loop
  {
    wait not ports.get(11); //warten auf einen Interrupt
    tasterAllLast1=tasterAll1;
    tasterAllLast2=tasterAll2;
    tasterAll1=max7311.getw(1);//Das Wort wird gelesen aus Modul 1 -Spitzboden...
    tasterAll2=max7311.getw(2);//... und Modul 2 - Keller
    tasterAllChange1 = tasterAllLast1 xor tasterAll1;
    tasterAllChange2 = tasterAllLast2 xor tasterAll2;
    for port= 0 ... 15 // Spitzboden
    {
      x=1 shl port;
      if tasterAllChange1 and x
      // Wird beim Drücken und Loslassen ausgeführt !
      {
        if tasterAll1 and x //  Taste gedrückt
        {
          tasteDauer[port]=system.timer();//Timer wird gestartet
        }
        else  //  Taste losgelassen
        { //Timer wird gestoppt.
          tasteDauer[port]=system.timer()-tasteDauer[port];
          //Jetzt wird eine entspr. Reaktion ausführt
          if      port==10   rollladenDG(tasteDauer[port]);
          else if port==11   luefter();
          else tastenreaktion(port,tasteDauer[port]);
        }
      }
    }
    for port= 16 ... 31 // Keller
    {
      x=1 shl port-16;
      if tasterAllChange2 and x
      // Wird beim Drücken und Loslassen ausgeführt !
      {
        if tasterAll2 and x //  Taste gedrückt
        {
          tasteDauer[port]=system.timer();//Timer wird gestartet
        }
        else  //  Taste losgelassen
        { //Timer wird gestoppt.
          tasteDauer[port]=system.timer()-tasteDauer[port];
          //Jetzt wird eine entspr. Reaktion ausführt
          if port==29   rollladenEG(tasteDauer[port]);
          else tastenreaktion(port,tasteDauer[port]);
        }
      }
    }
  }
}

Wie gesagt, der Thread wurde gleich zu Beginn gestartet. Früher hatte ich jedoch noch keine Abfrage
des Interrups, so dass ich die Eingänge ständig abfragen muÃ?te. Mitlerweile habe ich jedoch die
Eingänge so angeschlossen, dass ich erst auf einen Interrupt warte und dann reagiere. Das macht
die WAIT-Anweisung.
Heute habe ich mir jedoch überlegt, um die CControl II etwas zu entlasten, den Thread in eine Funktion
umzuwandeln, dann würden die ausbremsenden Thread-Verwaltungen reduziert.
Leider steht im Handbuch, das der WAIT-Befehl scheinbar nur für Threads gilt. Meine Frage daher:
Kann ich den WAIT-Befehl mit dem gleichen Effekt auch in einer Funktion einsetzen oder gibt es
hier eine andere Alternative?? In der LOOP-Schleife soll schlieÃ?lich immer nur gewartet werden, ob ein
Interrupt bei den Eingängen auftritt.
Danke,
GruÃ?, wema


    Antwort schreiben


Antworten:

Re: wait in Funktionen (von krassos - 18.05.2006 15:29)
    Re: wait in Funktionen (von wema - 18.05.2006 15:50)
        Re: wait in Funktionen (von André H. - 6.06.2006 9:02)