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 Rainer, > > benutze eine ähnliche Funktion in meiner Rolladensteuerung (8 Rolladen mit 16 Tasten), > hier jedoch mit PCF8574 statt MAX7311. Aber in Prinzip das Gleiche. > Habe den Code etwas ausgedünnt, da bei mir noch Timerroutinen, Zustandsabspeicherung > im EEprom und Logausgaben auf HWCOM drinwaren. > Gff. ist die Klammersetzung nicht mehr ganz o.k. > > Thread zur Tastenabfrage: > -Tastenzustand mit relativ hoher Frequenz lesen (ganzes Byte für 8 Tasten) > - vergleichen ob sich was geändert hat > - wenn ja, dann die einzelnen Tasten ausmaskieren und in dem Variablenarray "tastenzustand[]" > ablegen > > <code> > //----------------------------------------------------------------------------------------- > thread Rolladen // Abfrage der Taster, timerüberwachte Relaissteuerung und SASU Steuerung > //----------------------------------------------------------------------------------------- > > { > int i; //für Schleifen > int y; //auch für Schleifen > byte tastenzustand [15]; // aktuelle Tastenabfrage 1= gedrückt > byte tastenvorzustand [15]; // Zustand der letzten Tastenabfrage 1= gedrückt > byte relaiszustand [15]; // Zustand des Relaisausgangs > run 25; > // erstmal alle Variablen initialisieren > for y = 0...15 > { > tastenzustand[y]= 0; > tastenvorzustand[y]= 0; > relaiszustand[y]=0; > rollladenrelais(y,0);// auch alle Relais ausschalten > } > // ab hier in Schleife > loop > { > // Portzustände für Rollladentasten einlesen > r[0] = pcf.in(0); //PCF8574 Adresse 0 abfragen > r[2] = pcf.in(1); //PCF8574 Adresse 1 abfragen > if (r[0] != r[1]) or (r[2] != r[3]) //hat sich was geändert ? > { > for i = 0...7 // Umsetzung der Bytes in einzelne Tastenzustände > { > y =(i+8); > tastenzustand[i] = (0x01 and (r[0] shr i)); //schieben und ausmaskieren > tastenzustand[i] = (tastenzustand[i] xor 0x01); //invertieren > tastenzustand[y] = (0x01 and (r[2] shr i)); //nochmal für Baustein 2 > tastenzustand[y] = (tastenzustand[y] xor 0x01); > }; > </code> > Das war ja noch einfach, jetzt haben wir ein Array mit 16 Werten zu 16 Tasten die 0 oder 1 sind > > Wie geht es weiter: > Es kommen 2 weitere Arrays dazu: > Tastenvorzustand dient der Entprellung und > Relaiszustand für die Zustandssteuerung > Wurde eine Taste gedrückt wird die Funktion rolladenrelais() aufgerufen und die entsprechene > Relaisnummer und ob ein oder aus geschaltet wird übergeben. > Die Timerroutine sorgt bei mir für die Abschaltung des Relais nach Zeit. > > <code> > for i = 0...15 > { > if (tastenvorzustand[i] == 0) and(tastenzustand[i] == 1) and (relaiszustand[i]== 0) // Taste rauf > { > rollladenrelais(i,1); //rauf ein > relaiszustand[i] =1; > tastenvorzustand[i] = 1; > break; > }; > if (tastenvorzustand[i] == 0) and (tastenzustand[i] == 1) and (relaiszustand[i] !=0) // Mit Taste stoppen > { > rollladenrelais(i,0); //rauf aus > relaiszustand[i] =0; > tastenvorzustand[i] = 1; > break; > }; > // Wenn Taste losgelassen wird auch in den Vorzustand übernehmen > if ((tastenvorzustand[i]==1) and (tastenzustand[i]== 0)) tastenvorzustand[i]=0; > }; > }; > r[1] = r[0]; // aktuelle Portzustände auch in den Vorzustand übernehmen > r[3] = r[2]; > </code> > > Hier noch der kurze Code der Funktion Rollladenrelais: > <code> > //-------------------------------------------------------------------------- > function rollladenrelais(byte addr,byte befehl) //steuert die Rollladenrelais an > //-------------------------------------------------------------------------- > { > if befehl == 1 //An > { > if addr < 8 pcf.on(2,addr); > else pcf.on(3,addr); > } > if befehl == 0 //Aus > { > if addr < 8 pcf.off(2,addr); > else pcf.off(3,addr); > } > } > </code> > > > So das sollte als Anregung ausreichen. > Wenn Fragen sind bin ich ja nicht aus der Welt. > > Viel Erfolg > Jörg > > > > > Hallo, ich habe eine Frage zur Programmierung, > > > > folgende Situation, der Eingang des MAX7311 erhält einen Schalterimpuls und > > soll ein Relais bei jedem drücken des Schalters aus oder einschalten wie bei > > einem Stromstoßschalter z.Bsb.im Treppenhaus.Der MAX7311 läuft über den > > I2C-Bus. Die Schaltausgabe soll relativ zügig sein < 2 s. Der Schaltimpuls > > soll jedesmal nur einmal erfolgen, nur dann wenn der Taster gedrückt wird. > > Auch wenn er länger gedrückt wird ! Bis jetzt schaltet das Relais ein paar > > mal hin und her. > > > > Hat jemand da Erfahrungen. > > > > Vielen Dank für kreative Antworten.