Hallo Gemeinde, kurze Frage: Ich verwende derzeit einen MSP430 i2c-Treiber der momentan endlos auf entsprechende Status-Bits des I2C-Bausteins polled: z.B.: /* Wait for the start condition to be sent and ready to transmit interrupt */ while ((UCB0CTL1 & UCTXSTT) && ((IFG2 & UCB0TXIFG) == 0)); /* Wait for the data */ while ( (IFG2 & UCB0RXIFG) == 0 ); Mit dieser Lösung bin ich leider nicht ganz zufrieden. Wenn nur ein Gerät am i2c-Bus sich aus welchen Gründen auch immer "verabschiedet" steht die SW halt für immer in einer der endlos-while()-Schleifen. Zudem verbraucht der MSP430 in der Schleife so um die 300uA. Ich würde die CPU daher gerne schlafen legen (LPM3) und von dem entsprechenden I2C-Interrupt wieder aufwecken. Allerdings: Was ist wenn der Interrupt niemals kommt, da ein angeschlossenes i2c-Gerät sich nicht meldet oder spinnt? Ich würde daher gerne den Watchdog parallel mitlaufen lassen, sodass ich aus diesem Endlos-Wartezustand wieder rauskomme... Den Watchdog würde ich vom ACLK speisen und auf 1000ms setzen. Nach einer 1 Sekunde würde die SW dann komplett neustarten, den I2c baustein wieder neu-initialisieren und versuchen das i2c-Gerät wieder anzusprechen. Die Frage ist, kann man das realisieren? Schlägt Watchdog auch zu, wenn man in LPM3 ist? Wie würdet ihr einen Timeout realisieren OHNE polling? Herzlichen Dank!!!
MSP430x2xx Family User's Guide 10 Watchdog Timer+ (WDT+) ....................341 10.2.6 Operation in Low-Power Modes ......345
Also so wie ich es jetzt verstanden habe, läuft der WDT auch in LPM3 mit, vorausgesetzt der wird vom ACLK gespeist. Dann passt das ja ganz gut... Danke!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.