Volker B. schrieb:
> Bist Du Dir sicher, dass USART0_sendString() aus einem Interrupt heraus
> aufgerufen werden darf? Zeig' doch bitte den Code dieser Funktion.
Ja, ich bin sicher. Und zur Sicherheit habe ich es ja auch mit einem
Port-Pin-Toggle versucht und einem Counter, um die Zeit in der ISR zu
minimieren.
beobachta schrieb:
> Zunächst sehe ich da zwei "Probleme" versteckt. Zum einen ballert
> der Master mit vermutlich hoher Datenrate auf den Bus was einen
> Slave zur Verzweiflung bringen kann selbst wenn das Prinzip der
> Datenübertragung funktioniert. Der Slave hat ja noch was anderes
> zu tun aussser Bytes in Empfang zu nehmen. Zum anderen ist bei
> TWI bzw. I2C ein Bus-Handshake vorgesehen (das ACK wir abgewartet)
> das der Master in diesem Fall vermutlich nicht abwartet.
Das ist alles Richtig was Du schreibst aber mir ging es ja erstmal um
überhaupt eine Reaktion der TWI Hardware, z.B. dass der Interrupt
Handler aufgerufen wird. Darin bastelt man ja dann die Logik wie ich in
TWI_HandleSlaveIRQ angedeutet habe. Aber das Problem ist ja, dass
überhaupt nix passiert.
__Weißer Rauch!__
__TL;DR: es läuft!__
Ich habe nochmal drüber nachgedacht, ob es nicht einen Zusammenhang mit
der von mir benutzten UART gibt weil die ja teilweise Pins teilen. Also
habe ich versucht die alternativen Pins für die UART zu verwenden und
das hat nicht geklappt weil die Symbole im C Code als nicht definiert
markiert wurde und zu einem Compiler-Fehler geführt haben. Und da hatte
ich es: ich hatte das falsche Board eingestellt (ATtiny826) und nach
Änderung auf das Korrekte läuft es einwandfrei! Ich bekomme ganz viele
"ISR"-Ausgaben auf der seriellen Konsole (was auch oben die zwei
"Fragen" beantwortet - eine Reaktion kann ich erzeugen auch ohne ACK
etc. Logik).
D.h. Ihr habt mich auf die Lösung gebracht - Dankeschön!
P.S.: Falls jemand - wie ich - irgendwie den Eindruck gewinnt, dass es
nirgendwo Beispiele zu TWI-Slave gibt, dem kann ich nur
https://github.com/SpenceKonde/megaTinyCore/tree/master/megaavr/libraries/Wire/src
empfehlen, weil daran habe ich mich orientiert.
P.S.S.: Zu:
> ... Zum anderen ist bei
> TWI bzw. I2C ein Bus-Handshake vorgesehen (das ACK wir abgewartet)
> das der Master in diesem Fall vermutlich nicht abwartet.
Das klappt auch mit meiner "Brechstangenmethode", weil: initial setzt
man ja via "TWI0.SADDR = address<<1;" die Adresse, d.h. die Hardware des
AVR antwortet eigenständig und korrekt auf die "Anfragen" des Masters,
weil dieser ja die Adresse des Slaves + R oder W auf den Bus legt.
Lediglich weitere Kommunikation schlägt fehl. Aber das war ja erstmal
auch nicht mein Ziel.