Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > > > Hallo Thomas, > > am einfachsten geht das ganze aus meiner Sicht mit einer I²C Relaiserweiterung... > > In meiner Heizungssteuerung verwende ich ein paar PCF8574, und die Ansteuerung über das > > Modul PCF... > > > > > > schnip... > > > > <code> > > thread iic_relais_in > > {byte i; > > int R_in; // Variable für Relais Eingänge > > int last_min; // Variable für Minuten > > last_min = -1; // Init mit -1 > > run 8; // Priorität ändern (Standart 32) > > loop > > {wait ((ports.get(12) == 0) or (system.minute() != last_min));// Interrupt P12 > > sleep 100; // entprellen der Relais > > last_min = system.minute(); // speichern für n+1 > > cap.Capture(global.I2C_Cap); // I²C Bus sperren > > R_in = (pcf.getn(global.Adr_IN_OUT,0) xor 0b1111); // Nibbel invert. einlesen > > cap.Release(global.I2C_Cap); // I²C Bus freigeben > > i= 0b1 and R_in; // Bit für Gaspumpe maskieren > > global.P_Gas_in = i; // Eingang speicherm > > i= (0b1 shl 1) and R_in; // Bit für Gasmischer maskieren > > if i > 0 i = 1; // wenn Bit gesetzt, mit 1 überschreiben > > global.M_Gas_in = i; // Eingang speichern > > i= (0b1 shl 2) and R_in; // Bit für Bewegungsmelder EG maskieren > > if i > 0 i = 1; // wenn Bit gesetzt, mit 1 überschreiben > > global.BM_EG = i; // Eingang speichern > > i= (0b1 shl 3) and R_in; // Bit für Bewegungsmelder DG maskieren > > if i > 0 i = 1; // wenn Bit gesetzt, mit 1 überschreiben > > global.BM_DG = i; // Eingang speichern > > } > > } > > > > thread iic_relais_out > > {int r_out; // Variable für die Relais Ausgänge > > int last_r_out; // Variable für Zwischenspeicherung > > last_r_out = -1; // Init mit -1 > > run 8; // Priorität ändern (Standart 32) > > loop > > {r_out = 0b1 and global.Fuehler_out; > > r_out = r_out shl 1 or global.P_Zirkulation_out; > > r_out = r_out shl 1 or global.Relais_1_out; > > r_out = r_out shl 1 or global.Relais_0_out; > > if r_out != last_r_out // hat sich was geändert?? > > {last_r_out = r_out; // speichern für n+1 > > cap.Capture(global.I2C_Cap); // I²C Bus sperren > > pcf.putn(global.Adr_IN_OUT,1,last_r_out); // Nibbel ausgeben > > cap.Release(global.I2C_Cap); // I²C Bus freigeben > > } > > } > > } > > > > thread iic_ssr_out > > {byte ssr_out; // Hilfsvariable > > byte last_ssr_out; // Hilfsvariable > > last_ssr_out = -1; // Variable initialisieren > > run 8; // Priorität ändern (Standart 32) > > loop > > {ssr_out = 0b1 and global.M2_auf_out; // Bit 7=> Mischer 2 auf > > ssr_out = ssr_out shl 1 or global.M2_zu_out; // Bit 6=> Mischer 2 zu > > ssr_out = ssr_out shl 1 or global.M1_auf_out; // Bit 5=> Mischer 1 auf > > ssr_out = ssr_out shl 1 or global.M1_zu_out; // Bit 4=> Mischer 1 zu > > ssr_out = ssr_out shl 1 or global.P_Kohle_out; // Bit 3=> Pumpe Kohle > > ssr_out = ssr_out shl 1 or global.P_Gas_out; // Bit 2=> Pumpe Gas > > ssr_out = ssr_out shl 1; // Bit 1=> nicht genutzt > > ssr_out = ssr_out shl 1 or global.P_Solar_out; // Bit 0=> Pumpe Solar > > > > if ssr_out != last_ssr_out // hat sich was geändert?? > > {last_ssr_out = ssr_out; // speichern für n+1 > > cap.Capture(global.I2C_Cap); // I²C Bus sperren > > pcf.out(global.Adr_SSR_OUT,last_ssr_out); // Ausgabe PCF8574 > > cap.Release(global.I2C_Cap); // I²C Bus freigeben > > } > > } > > } > > </code> > > ...schnapp > > > > nitraM > > Hallo nitraM, > > zu Deinem Programm habe ich mal eine Frage zum Capture. Es ist ja schon viel darüber geschrieben > und verstanden bzw. nicht verstanden worden. Grundsätzlich ist mir die Funktion mit dem Capture > schon klar. Wieso setzt Du bei den I2C-Befehlen ein Capture und 2. warum cap.Capture ein? > > In meiner Heizungssteuerung hatte ich mal versucht bei Flankenauswertungen Capture zu verwenden > (nur mal grob skizziert): > > function Flanke_Solar > > capture > > Auswertung Altwertspeicher > > Änderung erkannt > > Flanke Zählen > > release > > return > > Ich kam nur auf die Idee, weil ich am Flankenzähler gesehen habe, dass da etwas nicht stimmt. Einige > Flanken wurden nicht erkannt. Ich wollte mit dem Capture eigentlich nur erreichen, dass die paar Zeilen > ohne Unterbrechung abgearbeitet werden. Mit Capture hat das ganze Programm nicht mehr richtig > gearbeitet, ohne fehlten immer wieder Flanken. Im Forum hatte ich schon manchmal gelesen, das mit > OS V2.x irgendwas nicht stimmt. Nach Update auf OS V3.x hatte es aber immer noch nicht hingehauen. > > Ist denn das normale Capture immer noch fehlerhaft? > > Gruß Jörg