Zitat Zitat von Peter(TOO) Beitrag anzeigen
Hallo Patrick,

Etwas Software brauchst du dazu schon.

Du brauchst für jedes Bit einen Timer. Das kannst du mit einem Timer-Interrupt machen, welcher z.B. alle 1ms aufgerufen wird.
Wenn die Timer >0 wird der Wert jedes Mal um 1 verringert.

Wenn du PORTD einliest, wird jedes Mal für eine gelesene 1 der entsprechende Timer mit 200 beschrieben.

Für die Ausgabe musst für jeden Timer welcher >0 eine 1 ins entsprechende Bit setzen.

So in der Art (nicht getestet):
Code:
unsigned char timer[8];

void interrupt(void)
  {
     char i;

     for (i = 0; i < 8; i++)
       {
          if (timer[i]) timer[i]--;
       }
  }

void out(void)
  {
    char i;
    unsigned char x = 0;

     for (i = 0; i < 8; i++)
       {
          if (timer[i]) (x |= (1 << i));
       }
      i2c_write (x); 
  }

unsigned char in(void)
{
    unsigned char x;
    char i;

     x = PORTD;
     for (i = 0; i < 8; i++)
       {
          if (x & (1 << i)) timer[i] = 200;
       }
}
Kann Reste von Tippfehlern enthalten.

MfG Peter(TOO)
Guten Morgen

Vielen Dank. mit dieser Lösung könnte ich etwas anfängen
könntest du mir dazu noch mehr erklären..
zb was hinkommt wo das x ist ??

Danke und Gruss
Patrick

- - - Aktualisiert - - -

Moin

Ich nochmal..manchmal sieht man ja den Wald vor lauter Bäumen nicht.
ich habe eine Lösung gefunden, die zwar nicht so elegant ist wie hier oben beschrieben, aber jetzt auch läuft.

Folgender Weg wurde eingeschlagen.
Der I2C Datenwert besteht ja aus den Werten 0 - 255. Mein Gedanke war wie ich nun jeden einzelnen Pin steuern kann.
Ich habe daher nun die Grundwerte 1, 2,4,8,16,32,64 und 128 auf eine Variable aufgeteilt, die immer nur diese Wertigkeit oder 0 hat.

Ich habe dann diese einzelnen Variablen auf eine Gesamtvariable addiert, und diese dann an den Bus gesendet.
Gleichzeitig werden diese Einzelvariablen immer von je einem PIN des AT-Mega gesteuert. Das erlaubt mir wiederum, jeden Beliebigen Pin zu verwenden und nicht zwingend ein komplettes Byte.
Durch diese Addition wird z.b bei der Variable 1 und 2 eine 3 gesendet, was zwei Ausgänge GPA0 und GPA1 des MCP steuern.
wenn nun die Variable 1 Low wird, und die 2 aber High bleibt, wird die 1 von dem Gesamtwert 3 abgezogen und es wird GPA1 HIGH bleiben und GPA0 wird Low werden.

so kann ich nun jeden einzelnen Pin des MCP gezielt ansprechen.
Wenn ich nun diese Einzelvariable noch im Abfall verzögere (Timer, Zähler) kann ich gezielt eine Abfallzeit für jeden Pin steuern.

Wunderbar.

Gruss
Patte