Gast
#2502195
Guten Morgen werte Bastlerkollegen! Ich benötige euren Rat: Bin seit längerem daran, eine kleine IMU auf Basis des MBED (LPC1768) und des 9DOF Stick von Sparkfun aufzubauen. (btw. das Sensorboard hat den nicht sehr guten ADXL345 drauf, würde ich daher heutzutage nicht mehr kaufen!) Als Compiler kommt der arm-none-eabi-gcc von CodeSourcery zum Einsatz im Zusammenspiel mit Makefile. Weiter benutze ich der Einfachheit halber FreeRTOS um alles zu deichseln. Die Sensoren werden per I2C ausgelesen, dazu benutze ich das I2C-Modul im Interrupt modus. Im Normalfall funktioniert alles bestens, so wie gewünscht, nur sporadisch, (alle 10-15Minuten) bleibt der Controller mit einem Hard-Fault-Error hängen. Was ich dazu bisher rausgefunden habe ist, dass ein Hard-Fault-Error auftritt, sobald versucht wird eine ungültige Adresse im Flash-Speicher zu lesen/schreiben, die nicht existent ist oder aber nicht richtig aligned ist? Wie ihr merkt, bin ich da selber noch nicht ganz durchgestiegen, was es mit dem Hard-Fault auf sich hat, wäre daher für eine Erklärung dankbar! Bin nun wie folgt vorgegangen um das Problem einzugrenzen: Meine Vermutung geht dahin, dass das I2C-Modul das Problem verursacht, da evtl. ein Sensor nicht richtig reagiert oder ähnliches. -Habe also kurzerhand die Datenleitung während des Betriebs auf Masse gelegt, um einen Fehler zu simulieren. -So lange wie die Leitung auf Masse liegt, tritt die programmierte Fehlerroutine in Aktion, die IMU kann halt keine Daten mehr einlesen, der Controller hängt sich jedoch nicht auf. -Sobald jedoch der I2C-Bus wieder frei ist, geht der Controller in den Hard-Fault-Error und bleibt stehen, bis der Watchdog einen Reset auslöst. In der I2C-Routine habe ich alle notwedigen States mit einer Switch-Anweisung berücksichtigt und für alle anderen mit "default" eine Standardrotuine geschaffen. Komme nun jedoch nicht mehr weiter, keine der I2C-Routinen wird beim Freigeben des Bus (aufheben der Fehlerbedingung) angesprungen. Vielleicht kann mir jemand von euch einen Tip geben, wie ich weiter debuggen kann oder jemand kann mir seine I2C-Interruptroutine zur Verfügung stellen? Freue mich über jede Hilfe und Anregung. Habe den I2C-Code angehängt; Der interessante Teil beginnt ab Zeile 410, wo sich die I2C-Hardware-Routinen befinden. Mit bestem Dank, Tueftler