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.