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

Re: CC2 I/O Erweiterungen, generelle Fragen Kategorie: I²C-Bus (von Jörg - 5.01.2008 21:45)
Als Antwort auf Re: CC2 I/O Erweiterungen, generelle Fragen von nitraM - 5.01.2008 11:22
Ich nutze:
C-Control II Unit, CC2-ReglerBoard, OSOPT_V2, OSOPT V3.0

> 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...
>
>
> 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
>    }
>  }
> }
>

> ...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


    Antwort schreiben


Antworten:

Re: CC2 I/O Erweiterungen, generelle Fragen (von nitraM - 6.01.2008 14:28)
    Re: CC2 I/O Erweiterungen, generelle Fragen (von Jörg - 7.01.2008 21:03)
Re: CC2 I/O Erweiterungen, generelle Fragen (von JoergC. - 5.01.2008 23:07)