Guten Tag.
Ich möchte mit dem Arduino Due ein 8-Bit breites Signal über den
Serial-Port übertragen der über den Serial-Monitor in der Arduino-IDE
empfangen wird. Dazu benutze ich an einem digitalen Eingang einen
Interrupt der auf FALLING reagiert. Das ganze funktioniert auch nach ein
paar übertragenen Bytes super. Dann allerdings kommt keine serielle
Übertragung mehr zustande. Nach einem Reset des DUEs funktioniert es
wieder für wenige Bytes. Dann ist wieder Schluss. Wer kann sich das
erklären?
Lieben Gruß
Tom
noInterrupts() und interrupts() benötigst du nicht, dass sollte der
Arduino Rahmen für dich erledigen.
Serial wurde schon gesagt.
Und für byte data_register = 0; könnte volatile von Nutzen sein.
Arduino Fanboy D. schrieb:> noInterrupts() und interrupts() benötigst du nicht, dass sollte der> Arduino Rahmen für dich erledigen.
Ab interrupts() bis zum wirklichen Ende des Interrupthandlers ist der
Interrupt enabled. Da schlägt natürlich sofort der nächste zu, bis der
Stack alle ist.
MfG Klaus
Tom schrieb:> Vor dem Due hatte ich einen Uno. Der war auf jeden Fall langsam.
Lass dich nicht verarschen re Arduino Speed.
> Schon> schade dass noInterrupts() hier nicht hilfreich ist.
Interrupts sind sowieso disabled in einer ISR. Das Problem ist, dass
Serial.print() selber Interrupts verwendet, um den Sendebuffer zu
leeren. Da diese aber ausbleiben, haengt dein Programm.
S. auch e.g. https://forum.arduino.cc/index.php?topic=131801.0
Setze also in der ISR ein (volatile) Flag, dass was zu tun ist und
verwende dieses in loop().
Als naechstes kannst du mal ueber den Vorteil von Schleifen nachdenken.
leo
leo schrieb:> der bei fixen 8 Bits genau was bringt?
Och....
Manchmal kommen sie in Strömen, die Bytes....
Bytes rudeln ganz gerne.
Und dann hat ein RingBuffer als Zwischenhändler zwischen ISR und
Hauptprogramm nicht nur Nachteile.
Arduino Fanboy D. schrieb:> Manchmal kommen sie in Strömen, die Bytes....
Ich denke der TO will zuerst mal ein Byte nach dem anderen ausgeben. Bis
zu den Stroemen ist noch ein weiter Weg ;-)
leo
Arduino Fanboy D. schrieb:> Und dann hat ein RingBuffer als Zwischenhändler zwischen ISR und> Hauptprogramm nicht nur Nachteile.
Ein Ringpuffer nützt allerdings auch nur, wenn sicher gestellt ist, dass
die mittlere Datenrate nicht höher ist, als die
Übertragungsgeschwindigkeit und der Puffer groß genug ist.
Kaj schrieb:> Der Due ist ein Cortex-M3
Und auch der disabled mindestens den gleichen Interrupt im Handler. Da
das Interrupt-Flag in SW zurückgesetzt werden muß, würde er sonst nie
den ersten C-Befehl des Handlers erreichen. Er käme noch nicht mal dazu,
ein paar Register zu retten.
MfG Klaus