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

Re: Interruptroutine Kategorie: CC2-Unit & Appl.Board / CC2-Station (von Franz Stefan - 15.05.2009 23:59)
Als Antwort auf Re: Interruptroutine von Elektron - 15.05.2009 21:03
Ich nutze:
C-Control II Unit, C-Control II Station, CC2-Application-Board, OSOPT V3.1
...
> Hallo André!
>
> Vielen Dank für Deine Ausführungen. Du hast es genau erfasst. Ich nutze den I²C-Bus um diverse
> Hausautomatisierung zu steuern. Hierbei sind Taster an einem PCF8574 angeschlossen.
> Logischerweise wird ein Taster nur kurz betätigt (ca. 20-100 ms). Um mit dem Programm nicht ständig
> über den I²C-Bus den PCF8574 pollen zu müssen, würde ich gerne Ereignisgesteuert den PFC auslesen,
> wenn dieser seinen Interruptausgang verändert.
>
> Für Ideen, Tips oder Beispiele wäre ich sehr dankbar.
> Würdest Du den Port der C-Control Station ständig abfragen?
>

Hi,
ich habe mich ein wenig experimentell mit der Sache beschäftigt, da ich diverse
Haussteuerungs Tasks damit erledigen will.

Der Trick besteht darinn, die INT Leitung des 8574 mit einem PullUp (zb. 10k) auf High zu halten,
und diese an einen der 5 interupttauglichen Ports der Station zu führen.

Ich habe dann 2 Threads gebaut:
- einer wartet in einer Loop mittels Wait auf ein Lo an diesem Port und tut nichts weiter als
den 2. Thread mit Resume wieder aufzuwecken
- der zweite läuft ebenfalls in einer Loop, an deren Ende ein Halt steht. Wird er resumed, dann
gehts wieder an den Anfang der Loop, und in einer inneren Loop werden alle bekannten 8574
abgeklappert und ihr Wert mit den gespeicherten letzten verglichen, und gegebenenfalls eben
eine Aktion gesetzt.    

Beispiel Code, auszugsweise:

thread pcfmain
{
  wait (initdone==1);
  run pcfmon;
  loop
   {
     wait !ports.get(15);
     resume pcfmon;
   }
}

thread pcfmon
{
  byte oo, i ;

  loop
  {
  for i = 0 ... 15
  {
    if PCFPresent[i] == 1
    {
      oo = pcf.in(i);
      if oo != PCFLast[i]
        {  
          // hier kommt die Aktion
          // ....
          // und am Ende merken wir uns noch den neuen Wert
          PCFLast[i] = oo;
        }
      }
    }
   halt;
   }
}


Ich schicke gerne das ganze Test-Prog via PM zu, möchte es hier in seinem Teststatus nicht
so public machen. Wahrscheinlich geht es ein wenig schneller, wenn man die 2 Threads in
einem zusammenfaÃ?t, als "alter Procedurealer " splitte ich aber lieber auf.   ;-)  

lg, Franz


    Antwort schreiben


Antworten: