Re: max7311 Kategorie: Programmierung (von Jörg Hansen - 12.01.2013 20:50) | ||
Als Antwort auf max7311 von Rainer - 12.01.2013 17:18 | ||
| ||
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 //----------------------------------------------------------------------------------------- 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); }; 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. 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]; Hier noch der kurze Code der Funktion Rollladenrelais: //-------------------------------------------------------------------------- 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); } } 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. | ||
Antwort schreiben Antworten: |