Moinsen!
Ich hab hier ein Verhalten der I2C-Schnittstelle, welches ich mir nicht erklären kann:
Hier das Programm, das als I2C-Slave arbeitet. Ist derzeit eine absolut abgespeckte Testversion (ich hab mich gestern dumm und dusselig gesucht... :angry7: ), die Daten laufen nachher auch nicht als Text sondern binär...
begin
InitPorts;
EnableInts;
ShowProg;
mdelay(2000);
loop
IsI2CDbg := not Bit(PinD.2);
ADCRes := GetADC;
OutStr := IntToStr(ADCRes);
DsplWriteLine(0,outStr);
mDelay(50);
PrgStrToArray(@OutStr,@TWITXBUFFER[8]);
DsplWriteLine(1,ByteToHex(TwiTxBuffer[8]) + ' ' + ByteToHex(TwiTxBuffer[9]));
// TWITXBUFFER[11] := LO(ADCRes);
// TWITXBUFFER[10] := HI(ADCRes);
// TWITXBUFFER[0]:= 123;
// Test := 1;
// Repeat
// TWITXBUFFER[Test]:=NOT TWITXBUFFER[Test-1];
// TWITXBUFFER[Test]:=Test;
// Until not IncToLim(Test,63);
// PrgReadADC;
// TWITXBUFFER[8] := 123;//LO(ADCRes);
// TWITXBUFFER[9] := 124; // HI(ADCRes);
// IncToLimWrap(TwiTxBuffer[10],250,0);
// mDelay(1);
// portD.7 := not PortD.7;
endloop;
end SerPedCtrl.
Hier jetzt der Programmteil des Masters, der den Slave ausliest:
Eigentlich würde man ja erwarten, daß im Master im Datenfeld die Daten an den Indizes 8 und fortlaufend stehen.
Irritierender Weise finden sich die daten aber unter dem Index 0 und folgende. Wenn ich Daten im Slave auf die Felder 0 ... 7 im Ausgangs-Datenfeld schreibe, werden diese Daten nicht vom Master gelesen obwohl als Startlese-index 0 gesendet wird.
Hätte da jemand vlt. eine Erklärung?
Bei der Gelegenheit noch zwei weitere Fehlerchen, die mir aufgefallen sind:
1) Die String-Konvertierungsfunktionen (ByteToStr etc.) arbeiten nicht bzw. nicht richtig mit lokalen Prozedurvariablen.
2) Beim Einlesen von Daten via SPIinpWord erhalte ich sowohl im Lowbyte als auch im Highbyte des Word die gleichen Daten. Lese ich aber mit SPIInpByte zweimal ein, erhalte ich die richtigen Daten. SPI-CS ist dabei in beiden Fällen programmgesteuert
Achso, und wo ich grad dabei bin: In der IDE verschluckt sich die Auflistung der Projekt-Funktionen/Variablen gerne mal beim Umschalten zwischen einzelnen geöffneten Projekten und unter Windows 7 wird mir inder IDE gerne auch mal eine Uhrzeit in der Art "63:20" angezeigt ... :angel7:
Viele Grüße
Gerrit
Ich hab hier ein Verhalten der I2C-Schnittstelle, welches ich mir nicht erklären kann:
Hier das Programm, das als I2C-Slave arbeitet. Ist derzeit eine absolut abgespeckte Testversion (ich hab mich gestern dumm und dusselig gesucht... :angry7: ), die Daten laufen nachher auch nicht als Text sondern binär...
Code
begin
InitPorts;
EnableInts;
ShowProg;
mdelay(2000);
loop
IsI2CDbg := not Bit(PinD.2);
ADCRes := GetADC;
OutStr := IntToStr(ADCRes);
DsplWriteLine(0,outStr);
mDelay(50);
PrgStrToArray(@OutStr,@TWITXBUFFER[8]);
DsplWriteLine(1,ByteToHex(TwiTxBuffer[8]) + ' ' + ByteToHex(TwiTxBuffer[9]));
// TWITXBUFFER[11] := LO(ADCRes);
// TWITXBUFFER[10] := HI(ADCRes);
// TWITXBUFFER[0]:= 123;
// Test := 1;
// Repeat
// TWITXBUFFER[Test]:=NOT TWITXBUFFER[Test-1];
// TWITXBUFFER[Test]:=Test;
// Until not IncToLim(Test,63);
// PrgReadADC;
// TWITXBUFFER[8] := 123;//LO(ADCRes);
// TWITXBUFFER[9] := 124; // HI(ADCRes);
// IncToLimWrap(TwiTxBuffer[10],250,0);
// mDelay(1);
// portD.7 := not PortD.7;
endloop;
end SerPedCtrl.
Hier jetzt der Programmteil des Masters, der den Slave ausliest:
Code
Procedure HndlDbgUT1;
Var
TmpVol : Word;
TmpTst : Byte;
TmpCnt : Byte;
TmpStr : String[16];
Begin
LCDxy(0,0);
Write(LCDout,'+');
DsplWriteLine(1,'Wait...');
TmpVol: = 0;
TmpCnt := 0;
repeat
If TwiStat(2) Then
If TwiOut(2,0) Then
IF TwiInp(2,TestARR) Then
// TwiInp(2,TestXXX);
TmpTst:= 0;
TestStr :='';
Repeat
TestStr := TestStr + ByteToHex(TestARR[TmpTst]);
until not IncToLim(tmpTst,7);
// DsplWriteLine(1,ByteToHex(TestARR[8]) + ' ' + ByteToHex(TestARR[9]));
DsplWriteLine(0,TestStr);
TmpTst:= 8;
TestStr :='';
Repeat
TestStr := TestStr + ByteToHex(TestARR[TmpTst]);
until not IncToLim(tmpTst,15);
// DsplWriteLine(1,ByteToHex(TestARR[8]) + ' ' + ByteToHex(TestARR[9]));
TestStr := '';
PrgArrayToStr(@TestStr,@TestArr[0]);
DsplWriteLine(1,TestStr);
Else
DsplWriteLine(1,'RD-ERR');
EndIf;
Else
DsplWriteLine(1,'WT-ERR');
EndIf;
Else
DsplWriteLine(1,'No device');
EndIf;
repeat
SwtReslt := SwtPressedSwt;
mDelay(1);
Until (Not IncToLim(TmpCnt,50)) OR (SwtReslt = cSwtOKay);
TmpCnt := 0;
Until SwtReslt = cSwtOKay;
LCDxy(0,0);
Write(LCDout,' ');
LCDclrLine(1);
SwtReslt := cSwtWork;
End HndlDbgUT1;
Var
TmpVol : Word;
TmpTst : Byte;
TmpCnt : Byte;
TmpStr : String[16];
Begin
LCDxy(0,0);
Write(LCDout,'+');
DsplWriteLine(1,'Wait...');
TmpVol: = 0;
TmpCnt := 0;
repeat
If TwiStat(2) Then
If TwiOut(2,0) Then
IF TwiInp(2,TestARR) Then
// TwiInp(2,TestXXX);
TmpTst:= 0;
TestStr :='';
Repeat
TestStr := TestStr + ByteToHex(TestARR[TmpTst]);
until not IncToLim(tmpTst,7);
// DsplWriteLine(1,ByteToHex(TestARR[8]) + ' ' + ByteToHex(TestARR[9]));
DsplWriteLine(0,TestStr);
TmpTst:= 8;
TestStr :='';
Repeat
TestStr := TestStr + ByteToHex(TestARR[TmpTst]);
until not IncToLim(tmpTst,15);
// DsplWriteLine(1,ByteToHex(TestARR[8]) + ' ' + ByteToHex(TestARR[9]));
TestStr := '';
PrgArrayToStr(@TestStr,@TestArr[0]);
DsplWriteLine(1,TestStr);
Else
DsplWriteLine(1,'RD-ERR');
EndIf;
Else
DsplWriteLine(1,'WT-ERR');
EndIf;
Else
DsplWriteLine(1,'No device');
EndIf;
repeat
SwtReslt := SwtPressedSwt;
mDelay(1);
Until (Not IncToLim(TmpCnt,50)) OR (SwtReslt = cSwtOKay);
TmpCnt := 0;
Until SwtReslt = cSwtOKay;
LCDxy(0,0);
Write(LCDout,' ');
LCDclrLine(1);
SwtReslt := cSwtWork;
End HndlDbgUT1;
Eigentlich würde man ja erwarten, daß im Master im Datenfeld die Daten an den Indizes 8 und fortlaufend stehen.
Irritierender Weise finden sich die daten aber unter dem Index 0 und folgende. Wenn ich Daten im Slave auf die Felder 0 ... 7 im Ausgangs-Datenfeld schreibe, werden diese Daten nicht vom Master gelesen obwohl als Startlese-index 0 gesendet wird.
Hätte da jemand vlt. eine Erklärung?
Bei der Gelegenheit noch zwei weitere Fehlerchen, die mir aufgefallen sind:
1) Die String-Konvertierungsfunktionen (ByteToStr etc.) arbeiten nicht bzw. nicht richtig mit lokalen Prozedurvariablen.
2) Beim Einlesen von Daten via SPIinpWord erhalte ich sowohl im Lowbyte als auch im Highbyte des Word die gleichen Daten. Lese ich aber mit SPIInpByte zweimal ein, erhalte ich die richtigen Daten. SPI-CS ist dabei in beiden Fällen programmgesteuert
Achso, und wo ich grad dabei bin: In der IDE verschluckt sich die Auflistung der Projekt-Funktionen/Variablen gerne mal beim Umschalten zwischen einzelnen geöffneten Projekten und unter Windows 7 wird mir inder IDE gerne auch mal eine Uhrzeit in der Art "63:20" angezeigt ... :angel7:
Viele Grüße
Gerrit