Ich habe mich mal gestern/heute mit dem I2C PC Version befasst. Ich habe mein AM2320 Sensor sofort zum laufen bekommen und auch mein LCD.
Problem war nur: Beim jeden "Update" vom LCD gab es ein kurzes "Flackern" und ich weiß nun auch warum:
in der I2C_Class wurde in der Methode "SetDevice" nur das Device mit fpIOCtl geöffnet... Das war das Kern Problem.
Also habe ich eine CloseDevice Methode geschrieben:
Code: Alles auswählen
procedure TI2C.SetDevice(addr: cint);
begin
Handle:=fpIOCtl(fI2C_Device, I2C_SLAVE, Pointer(addr));
end;
procedure TI2C.CloseDevice(Addr: cint);
begin
FpClose(Handle);
end;
So sieht das ganze nun aus...
In write4Bits bei TLCD musste auch etwas angepasst werden, dann ging es.
Code: Alles auswählen
procedure TLCD.write4Bits(Value: byte);
const
ENABLE_MASK: byte = $04;
begin
I2C_Class.SetDevice(Device_Addr);
I2C_Class.writeBuf(Value or backlightStsMask or ENABLE_MASK);
Sleep(1);
I2C_Class.writeBuf((Value and not ENABLE_MASK) or backlightStsMask);
Sleep(1);
I2C_Class.CloseDevice(Device_Addr);
end;
Jetzt kann das ganze auch für mehrer I2C Geräte genutzt werden.
Ich verwende ein I2C Adapter nach USB:
http://mainframe.io/project/i2c-tiny-usb.dark.html
Klappt Prima damit. Im Anhang findet ihr das Projekt. Sieht noch nicht schön aus, aber es geht.
Dabei ist mir auch die Idee gekommen: Eine Gemeinsame Schnittstelle zu schreiben für I2C einmal für AVR und einmal für den PC über Kompiler Schalter sollen dann die eine oder andere Version "genommen" werden. Bisher ist das aber nur eine Idee... ich überlege noch wie ich das ganze am besten umsetzten kann.