ich weiß der PCF8574AN ist mir einer der einfachsten I2C-ICs, den man programmieren kann, aber iwie stehe ich gerade total auf dem Schlauch, komme jedoch auch an keine alten Bespiele meines Gnublin-Boards an, wo ich lauffähige Programme hatte.
Laut diversen Foren und und Datenblättern soll man bei dem IC nach der Initialisierung dem Port die Funktion (Input/Output) zuweisen.
Soweit kann ich den Unterlagen auch folgen.
Dementsprechend habe ich auch gem. Datasheet meine "read-Sektion" aufgebaut.
Code: Alles auswählen
 program SerCom;
uses uart{, IO_Exp}, twi, test, uConst_v07_25122020;
{#TODO -uart (Erweitern auf µC mit 2 und mehr UARTS}
{#todo -IO_Exp aufbauen wenn alle TWI-Funkionen des PCF ohne Fehler laufen}
{#todo -Test = Sammelspielwiese für Allgemeine AVR funktionen (Pause, Portdefine, usw. Später Vernünftig aufbauen}
{#done -uConst; Globale Sammlung von Constanten (Plattformübergreifend}
{#todo - b := TWIReadACK * $100 + TWIReadNACK; anfassen da Bytes nicht direkt geschrieben können.}
 const
  WakeUp                          = #36; // '$'
  Trans_Start                     = #60; // '<'
  Trans_Sektor                    = #35; // '#'
  Trans_End                       = #62; // '>'
 
 var
   RXD                             : ShortString;
   a                               : byte;
   b                               : UInt16;
begin
  asm cli end;
  UARTInit;
  TWIInit;
  asm sei end;
  repeat
    a               := 0;
    if UARTReadChar = WakeUp then begin
      repeat
        RXD[a]      := UARTReadChar;
        inc(a);
      until RXD[a-1] = Trans_End;
      if ((RXD[0] = '0') and (RXD[1] = '>')) then begin
 
        UARTSendString('TWI in den Lesemodus setzen!'#13#10);
        TWIStart((PCF shl 1) or TWI_Write);       // <--- PCF = $38 + Write
        TWIWrite(1);                              // <--- ACK
        TWIWrite(%1111111);                       // <--- Alle Ports als Input
        TWIWrite(1);                              // <--- ACK
        TWIStop;
        TWIStart((PCF shl 1) or TWI_Read);        // <--- PCF + Read
        TWIWrite(1);                              // <--- ACK
        UARTSendString(#13#10'Warte auf Eingabe vom IO-Expander'#13#10);
        repeat
          b := TWIReadACK * $100 + TWIReadNACK;   // Erwarteter Wert (IntToStr wird aber nicht genommen)
          UARTSendChar(char(b));
          UARTSendChar('|');
          UARTSendChar(char(TWIReadACK+48));
          UARTSendString('-'#13#10);
          Delay(100000);
          until (UARTReadChar = #32);
        TWIStop;
        UARTSendString(#13#10'TWI wurde angehalten!'#13#10);
        end;
      end;
    until ((UARTReadChar = 'E') or (UARTReadChar = 'e'));
    UARTSendString('Und ich bin nun das Programmende!!!');
end.Betrieben wird mein ATmega16 mit 8MHz.
der PCF8574 ist auf 100KHz eingestellt.
Die Write Routine 0-255 habe ich raus genommen, da diese ohne Ärger läuft.


 Vielleicht werde ich mir bei AVR-Programmen angewöhnen diese Parts eher Binär zu schreiben.
 Vielleicht werde ich mir bei AVR-Programmen angewöhnen diese Parts eher Binär zu schreiben. 
  - für meine Heizung und auf diversen ATmega328 für I2C-Sensoren (BME280, HTU21...). Die sollten auf so ziemlich jeden ATmega oder ATtiny laufen.
 - für meine Heizung und auf diversen ATmega328 für I2C-Sensoren (BME280, HTU21...). Die sollten auf so ziemlich jeden ATmega oder ATtiny laufen. Verein
Verein 
 Links
Links Suche
Suche