Hallo Frank,
Hier ist keinerlei Denkfehler.
Ich kenne mich mit dem I²C-Bus bestens aus. (Hardware & Software)
Man muß einfach einmal von der Denkweise, daß ein Interrupt sofort abgearbeitet werden muß, wegkommen.
Ein Interrupt ist im Bereich vom I²C-Bus nur dazu da, eine Änderung zu signalisieren.
Ein Interrupt von I²C-Bus-Bausteinen muß nie an einen Interrupt-Eingang eines Controllers.
Vielmehr muß dieser an einen normalen I/O-Port und dient nur dazu
zu signalisieren, ob sich ein I²C-Bus-Zugriff "lohnt", um unnötiges Polling zu vermeiden.
Das ist vielleich bei der CC1 nicht schlimm, da diese ohnehin langsam ist,
und man hier nicht viel mit dem I²C-Bus macht.
Aber bei der CC2 würde man dies bei komplexeren Anwendungen deutlich merken.
Meine Hardware ist nunmal in erster Linie für die CC2 entwickelt.
Daß die meiste Hardware auch mit der CC1 nutzbar ist, ist ein angenehmer Nebeneffekt. :-)
Und um das als Programmcode zu verdeutlichen:
(Kleine Testfunktion in C2.)
Code:
byte lcnt[16];//Zwischenspeichern des letzten Zählerwerts
const AddrR[]=0x41,0x43,0x45,0x47,0x49,0x4B,0x4D,0x4F,
0x71,0x73,0x75,0x77,0x79,0x7B,0x7D,0x7F;
function getCnt(byte addr, byte IntPort) returns byte
{byte x,y;
if not ports.get(IntPort) // wenn Int-Port auf low
{
if i2c.cstart(AddrR[addr])
{
x=i2c.readlast();
i2c.stop();
y=x-lcnt[addr];
lcnt[addr]=x;
return y;
}
i2c.stop();
}
return 0;
}
Viele meiner (I²C-)Erweiterungen haben Interruptausgänge.
Ohne diese würde der I²C-Bus schnell "überlastet" und damit langsam.
MfG André H.
Lesezeichen