ich habe einen ATtiny85, der einerseits mit der Manchester-Library auf Daten von einem 433MHz-Empfänger lauscht, die aufnimmt und speichert (Pin 6/PB1), andererseits mit der TinyWire-Library über die Pins 5 und 7 (PB0 und PB2) eine I²C-Verbindung zu einem weiteren Controller hat.
Der Controller fragt asynchron über I²C die gespeicherten Daten ab, die Manchester-Daten kommen ebenfalls asynchron herein.
So lange nicht beides gleichzeitig passiert, geht alles gut. Sobald aber während des Empfangs der Manchester-Daten der Controller über I²C anfragt, gehen natürlich die beiden Interrupt-gesteuerten Funktionen in den Wald...
Ich plane, in der Interruptfunktion für I²C den Pin-Change-Interrupt für den 433MHz-Empfänger auszublenden (in PCMSK0) und nach der Übertragung der I²C-Daten wieder ein - geht das so einfach? Kann man innerhalb einer durch Interrupt ausgelösten Routine die Interruptmaske überhaupt ändern?
Die Konsistenz der Manchester-Daten bestimme ich eh' über eine Checksumme, so dass ein in der Mitte der Übertragung eintreffender Request vom Controller keine unvollständige Lieferung bekommen wird, es geht einfach nur eine verloren.
Kannst du nicht mit einer weiteren Leitung (IRQ) dem zweiten Controller mitteilen, es sind 433 MHz Daten vorhanden und dieser holt die Daten per I2C ab ?
ja, das ist ein Problem, sowohl Software-I2C als auch der 433MHz Empfang sind ja recht zeitkritisch.
Ja, Du kannst in der I2C-ISR deine Interrupts umstellen, lösche auch das IRQ-Flag der 433MHz-Routine vorsichtshalber, sonst bearbeiet er den IRQ noch, wenn einer anstand, nach verlassen der I2C-IRQ-Routine und sorgt doch für Chaos.
HotSystems:
Kannst du nicht mit einer weiteren Leitung (IRQ) dem zweiten Controller mitteilen, es sind 433 MHz Daten vorhanden und dieser holt die Daten per I2C ab ?
So mache ich es mit IR-Daten auf einem ATtiny85.
Nein, leider nicht - der Controller (ein MKR1000) ist sehr zeitkritisch unterwegs und handelt selber mehrere asynchrone Quellen ab; da kann ich die Sensordaten von dem ATtiny-Empfänger nur abfragen, wenn ich gerade ein paar Millisekunden Pause habe.
Miq1:
Nein, leider nicht - der Controller (ein MKR1000) ist sehr zeitkritisch unterwegs und handelt selber mehrere asynchrone Quellen ab; da kann ich die Sensordaten von dem ATtiny-Empfänger nur abfragen, wenn ich gerade ein paar Millisekunden Pause habe.
Aber gerade dann ist das doch lösbar.
Der MKR1000 bekommt die Info, Daten vorhanden und fragt diese ab, wenn es seine Zeit erlaubt.
ja, das ist ein Problem, sowohl Software-I2C als auch der 433MHz Empfang sind ja recht zeitkritisch.
Ja, Du kannst in der I2C-ISR deine Interrupts umstellen, lösche auch das IRQ-Flag der 433MHz-Routine vorsichtshalber, sonst bearbeiet er den IRQ noch, wenn einer anstand, nach verlassen der I2C-IRQ-Routine und sorgt doch für Chaos.