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

Re: max7311 Kategorie: Programmierung (von Jörg Hansen - 12.01.2013 20:50)
Als Antwort auf max7311 von Rainer - 12.01.2013 17:18
Ich nutze:
C-Control II Unit, OSOPT V3.1
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: