Hallo allerseits,
wenn ich versuche, bei einem xMega das I2CPort und die SerPortXy auf demselben I/O-Port (aber natürlich nicht auf denselben Pins) zu nutzen, dann stört das I2CPort die Pins der SerPortXy.
Program I2CTest;
Device = XMega256A3U, VCC=3.3;
Define_Fuses
NoteBook = B;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [];
FuseBits2 = [];
Import SysTick, FlashWrite, WatchDog, Heap, XMegaSupport, I2CPort,
SerPortE0, SerPortF0, SerPortC0, SerPortC1, SerPortD0, ADC_A;
From System Import Float, Processes, Tasks, Pipes, PIDs;
From SysTick Import SystemTime16;
Define
OSCtype = extXTAL=16000000, PLLmul=8, prescA=1, prescB=2, prescC=1;
StackSize = $0800, iData;
FrameSize = $0800, iData;
SysTick = 10; {msec}
I2CPort = PortC;
I2Cdat = 0;
I2Cclk = 1;
SerPortC0 = 57600, Stop1, timeout;
RxBufferC0 = 250, iData;
TxBufferC0 = 250, iData;
Implementation
{$IDATA}
Const
I2CAddrIOExp: byte = $27;
Var
I2CVal: Byte;
Begin
// IO-Expander Prog
I2COut(I2CAddrIOExp,$00,$F7);
Loop
If I2Cstat(I2CAddrIOExp) Then
I2COut(I2CAddrIOExp,$00);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C Dir: '+ByteToHex(I2CVal));
I2COut(I2CAddrIOExp,$06);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C Pullups: '+ByteToHex(I2CVal));
I2COut(I2CAddrIOExp,$09);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C In: '+ByteToHex(I2CVal));
Else
WriteLn(SerOutC0,'I2C Not OK');
EndIf;
Sleep(Self, 50);
Endloop;
End I2CTest;
Das Program sendet bei den I2Cxxx-Befehlen Müll auf die seriellen Leitungen.
Hardwaremässig sieht es fast so aus, wie wenn eine Lötbrucke zwischen dem I2C und SerPort Pin besteht. Aber das ist klar nicht der Fall. Es muss softwareseitig bei der Port-Ansteuerung in den I2C-Prozeduren ein Fehler sein.
...oder ich versuche etwas, das ohnehin nicht zulässig ist?
Hat jemand Erfahung mit der Nutzung von I2C und SerPort auf demselben I/O-Port eines xMegas?
Danke und Gruss,
Mike
wenn ich versuche, bei einem xMega das I2CPort und die SerPortXy auf demselben I/O-Port (aber natürlich nicht auf denselben Pins) zu nutzen, dann stört das I2CPort die Pins der SerPortXy.
Code
Program I2CTest;
Device = XMega256A3U, VCC=3.3;
Define_Fuses
NoteBook = B;
COMport = USB;
LockBits0 = [];
FuseBits0 = [];
FuseBits1 = [];
FuseBits2 = [];
Import SysTick, FlashWrite, WatchDog, Heap, XMegaSupport, I2CPort,
SerPortE0, SerPortF0, SerPortC0, SerPortC1, SerPortD0, ADC_A;
From System Import Float, Processes, Tasks, Pipes, PIDs;
From SysTick Import SystemTime16;
Define
OSCtype = extXTAL=16000000, PLLmul=8, prescA=1, prescB=2, prescC=1;
StackSize = $0800, iData;
FrameSize = $0800, iData;
SysTick = 10; {msec}
I2CPort = PortC;
I2Cdat = 0;
I2Cclk = 1;
SerPortC0 = 57600, Stop1, timeout;
RxBufferC0 = 250, iData;
TxBufferC0 = 250, iData;
Implementation
{$IDATA}
Const
I2CAddrIOExp: byte = $27;
Var
I2CVal: Byte;
Begin
// IO-Expander Prog
I2COut(I2CAddrIOExp,$00,$F7);
Loop
If I2Cstat(I2CAddrIOExp) Then
I2COut(I2CAddrIOExp,$00);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C Dir: '+ByteToHex(I2CVal));
I2COut(I2CAddrIOExp,$06);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C Pullups: '+ByteToHex(I2CVal));
I2COut(I2CAddrIOExp,$09);
I2CInp(I2CAddrIOExp,I2CVal);
WriteLn(SerOutC0, 'I2C In: '+ByteToHex(I2CVal));
Else
WriteLn(SerOutC0,'I2C Not OK');
EndIf;
Sleep(Self, 50);
Endloop;
End I2CTest;
Das Program sendet bei den I2Cxxx-Befehlen Müll auf die seriellen Leitungen.
Hardwaremässig sieht es fast so aus, wie wenn eine Lötbrucke zwischen dem I2C und SerPort Pin besteht. Aber das ist klar nicht der Fall. Es muss softwareseitig bei der Port-Ansteuerung in den I2C-Prozeduren ein Fehler sein.
...oder ich versuche etwas, das ohnehin nicht zulässig ist?
Hat jemand Erfahung mit der Nutzung von I2C und SerPort auf demselben I/O-Port eines xMegas?
Danke und Gruss,
Mike