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 | ||
| ||
... > 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: |