/******************************************************************** dimmer.c2 C2 programming language Erstellt am : 14.11.2006 Aenderung am : Version 1.0 : Autor : © Michael Gierschner Beschreibung : Funktionen zur Dimmeransteuerung fuer Hutschienendimmer Die Entwicklung des I2C-Dimmers im Hutschienengehaeuse (Hardware und Software) basiert im Wesentlichen auf der Arbeit von H. Scherzer. Da dem urspruenglichen Geraet ein anderes Konzept zugrunde liegt, ergaben sich daraus wenige schaltungstechnische Aenderungen. Adressbereich des Dimmers : 0 ... 128 ********************************************************************/ //------------------------------------------------------------------------------ // Dimmer-Kommandos : //------------------------------------------------------------------------------ // ----- Modul-Kommandos ----- const C_GET_MOD_TYP = 1; // Modultyp abfragen const C_SETADDR = 2; // neue Adresse an Dimmer senden ,,,<>,<> const C_CONFIG = 3; // Konfiguriert den Dimmer als const M_PHASE_AB = 1; // Phasen-Abschnitt const M_PHASE_AN = 2; // Phasen-Anschnitt const M_SWITCH = 4; // Schalter const C_RESET = 9; // Dimmer-Reset nach Konfig-Aenderung (z.B. zur Adressuebernahme) // ----- Dimmer-Kommandos ----- // ,,,<>,<> const C_DIM_CONTROL = 10; // Ausgabewert zum Geraet senden. // The data field contains a value between 0..255 where the // 0 means 'off' and 255 = 'on', hence all values represent // a percentage to set in the case of a dimmer or a jalousie position. // ,,,<>,<> const C_DIM_TOGGLE = 11; // Befehl Zustand umschalten (AUS-EIN-AUS...) // do not change - PIC command const C_DIM_STOP = 12; // stoppt Dimmvorgang const C_DIM_Read_LIGHT = 13; // lesen des aktuellen Lichtwertes // Dimmerkonfiguration setzten: //-------------------------------- const C_SetDimTrepCfg = 17; // Betriebsart der Dimmerstufe: Dx_Mode (Treppenhaus, Nachtriggerbar) const D_TREPPENHAUS = 0; // Bitposition in DATA_A const D_NACHTRIGGER = 1; // Bitposition in DATA_A const C_SetDimCfgWert = 18; // Dimmerkonfiguration setzen: (Licht_hell, Licht_abgesenkt, Zeit_bis_absenken) // DataA : Licht_hell (=0: bei EIN über Taster wird letzter Lichtwert gesetzt) // DataB : Licht_abgesenkt (bei Treppenhausfunktion) // DataC : Zeit_bis_absenken (bei Treppenhausfunktion) const C_READ_RAM = 20; // 1 Byte aus RAM lesen ,,<>,,<> const C_WRITE_RAM = 21; // 1 Byte in RAM schreiben ,,,, const C_READ_EEPROM = 22; // 1 Byte aus EEProm lesen ,,<>,,<> const C_WRITE_EEPROM = 23; // 1 Byte in EEProm schreiben ,,,,<> //const C_Diagnose = 254; //------------------------------------------------------------------------------ // RAM-Adressen Dimmer //------------------------------------------------------------------------------ const BANK_0 = 0; const BANK_1 = 1; const BANK_2 = 2; const BANK_3 = 3; //------------------------------------------------------------------------------ // switch constants for dimmer to determine device //------------------------------------------------------------------------------ const OFF = 0; const ON = 255; byte I2C_Daten[10]; // Datenpuffer fuer Dimmersteuerung ueber I2C-Bus //------------------------------------------------------------------------------ function DimmerCmd (byte i2cAdr, byte cmd, byte ausgPort, byte dataA, byte dataB, byte dataC) returns byte // // Dimmbetrieb: adresse, kommando, ausgangskanal, helligkeit, RampeAuf, RampeAb // // i2cAdr : I2C-Adresse des Dimmermoduls // cmd : Kommando an Dimmer // ausgPort: adressierter Ausgangsport (Dimmernummer 0..2) // dataA : Uebertragene Daten A, Helligkeit bei Dimmerbetrieb // dataB : Uebertragene Daten B, Zeit/s beim Hochdimmen bei Dimmerbetrieb // dataC : Uebertragene Daten B, Zeit/s beim Runterdimmen bei Dimmerbetrieb // //------------------------------------------------------------------------------ { I2C_Daten[0]= cmd; I2C_Daten[1]= ausgPort; I2C_Daten[2]= dataA; I2C_Daten[3]= dataB; I2C_Daten[4]= dataC; I2C_Daten[5]= cmd ^ ausgPort ^ dataA ^ dataB ^ dataC; // Checksumme mit Exklusiv-Oder i2c.send(i2cAdr, I2C_Daten, 6); if ((cmd == C_READ_RAM) or (cmd == C_READ_EEPROM) or (cmd == C_DIM_Read_LIGHT)) { mylib.DebugInt = i2c.receive(i2cAdr or 1, I2C_Daten, 1); // 1 Byte lesen return 1; // 1 Byte Daten gelesen } if (cmd == C_GET_MOD_TYP) { mylib.DebugInt = i2c.receive(i2cAdr or 1, I2C_Daten, 3); // 3 Byte lesen return 2; // Modultyp gelesen } return 255; // keine Daten aus Dimmermodul gelesen } function SetI2cAddr(byte aktuelleAdr, byte neueAdr) { byte b[10]; //--- Kontrollcode mit neuer Adresse senden b[0]= C_SETADDR; b[1]= neueAdr; b[2]= 0; b[3]= 0; b[4]= C_SETADDR ^ neueAdr; // Checksumme mit Exklusiv-Oder i2c.send(aktuelleAdr, b, 6); //--- Kontrollcode zum Zuruecksetzten des Gerätes senden b[0]= C_RESET; b[1]= 0; b[4]= C_RESET; // Checksumme mit Exklusiv-Oder i2c.send(aktuelleAdr, b, 6); sleep(1000); }