Hallo,
Wir haben ein Board basierend auf dem Arduino Mkr Zero Board mit dem
SAMD21G18 uC entwickelt. Der Arduino-Sketch wurde konvertiert und in ein
Atmel/Microship-Studio Projekt importiert. Wir verwenden die onboard RTC
mit der RTCZero lib für zeitbasierte Interrupts um Daten aus der
Peripherie zu erhalten. Diese Daten stammen von i2c, ADC und so weiter -
alle basierend auf SERCOM mit SERCOM-Handlern/Interrupts. Das
funktioniert alles einwandfrei und ohne Probleme.
Nun wollten wir über einen MAX14840 IC und ein UART Interface (mit der
SERCOM5-Schnittstelle) eine Modbus-Funktionalität hinzufügen. Bei der
Ausführung in der Schleife (loop()) funktioniert alles einwandfrei, aber
bei der Ausführung im RTC Interrupt stürzt die read Holding Registers
Funktion der Arduino Modbus lib ab. Beim Debuggen im Microship Studio
(break-all) scheint es, als würde der Controller in der
Uart-Flush-Funktion warten, insbesondere in der while-Schleife. (in der
originalen Uart.cpp-Datei)
1 | void Uart::flush ()
|
2 | {
|
3 | while (txBuffer. available ()); // warten, bis der TX-Buffer leer ist
|
4 | sercom->flushUART ();
|
5 | }
|
Für mich sieht es so aus, als gäbe es ein Problem mit den Interrupts
oder der Interrupt-Priorität. Hat irgendjemand ähnliche Probleme schon
mal beobachtet? Oder eine andere Idee?
Vielen Dank!
Grüße Thomas