Co spowodowało reset Arduino?

Arduino UNO
Arduino UNO

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.