Co spowodowało reset Arduino?
Reset Arduino może być spowodowany przez różne źródła. Może to być sygnał reset, zabezpieczenie przed zbyt niskim napięciem czy może działanie watchdoga. W zaawansowanych scenariuszach, gdy coś resetuje Arduino może to być ważna informacja. Na szczęście w procesorach Atmela jest rejestr przechowujący takie informacje. Nazywa się on MCUSR.
Jak odczytać przyczynę resetu z MCUSR?
Zacznijmy może od kodu. Jeśli w setup
dodasz taką sekwencję:
unsigned char ResetSrc = MCUSR; // save reset source MCUSR = 0x00; // clear reset source if (ResetSrc & _BV(PORF) ) Serial.println(F("PWR RESET")); if (ResetSrc & _BV(EXTRF)) Serial.println(F("EXT RESET")); if (ResetSrc & _BV(BORF)) Serial.println(F("BOD RESET")); if (ResetSrc & _BV(WDRF)) Serial.println(F("WDT RESET"));
Napisze ona na Serial co było przyczyną resetu. Jak widać, wartość MCUSR jest zapisywana i następnie porównywana z kolejnymi maskami. Magiczne _BV
to makro ułatwiające operacje na maskach bitowych, a kody PORF, EXTRF
i inne są zdefiniowane w bibliotekach kompilatora. Ten kod będzie poprawny dla Arduino wyposażone w ATmega328, ATmega168, czy procesory ATtiny.
Arduino oparte o ATmega32u4 (Leonardo, Micro) mają dodatkowe źródła resetu: USB oraz JTAG (użyj dodatkowych ifów z USBRF i JTRF). Jeśli masz inny procesor, szukaj informacji w karcie katalogowej czy są możliwe jeszcze jakieś inne opcje.