Ok um das nochmal auszugraben, ich hab das jetzt so gemacht wie oben
beschrieben. Die Ringpuffer-Sache funktioniert auch soweit, allerdings
ist mir bei der Ansteuerung der TWI-Schnittstelle eine Sache nicht ganz
klar.
Laut Datenblatt ist ja im TWCR das TWINT-Bit der Trigger, um die nächste
Aktion durchzuführen. TWEN möchte ich eigentlich beim initialisieren
einmal setzen und es dann gesetzt lassen. Die restlichen Bits TWSTA,
TWSTO etc. wollte ich dann jeweils einzeln setzen und zuletzt das TWINT
Bit setzen (um die Interrupt-Flag zu "clearen").
Problem an der Sache: Es funktioniert nicht.
Wenn ich allerdings das TWCR explizit mit dem gesamten Bitmuster setze
(TWCR = (1<<TWINT)|(0<<TWSTA)|...), dann funktioniert es plötzlich.
Warum?
Das zweite Problem betrifft die Stop-Condition. Diese löst nach
Abschluss ja kein weiteres Interrupt aus. Da der angesprochene Chip aber
per Default das soeben angewiesene erst nach Empfang der Stop-Condition
ausführt, habe ich jetzt ein Problem, wenn ich mehrere Datenblöcke aus
dem Puffer verschicken will.
(Also STA | SLA+W | OFFSET1 | VALUE1 | STOP | STA | SLA+W | OFFSET2
|...)
Eine Möglichkeit wäre, die Stop-Condition direkt in der ISR anzuweisen,
und dort zu warten, bis sie ausgeführt wurde, aber das widerspricht ja
ein wenig der Idee einer Interrupt-Routine. Ich möchte auch nicht in der
Mainfunction ständig nachschauen, ob der TWI grade nicht mehr läuft,
aber noch Datenblöcke vorhanden sind, auch das widerspricht der Idee
eines möglichst eigenständigen Hardware-Treibers. Habt Ihr da einen Tip
für mich?