Иногда бывает необходимо узнать, по какой причине была перезапущена программа, была ли нажата кнопка reset, или было переподключено внешнее питание. В микроконтроллерах atmega AVR для этой цели существует регистр статуса MCU — MCUSR (MCU Status Register). Отслеживая состояние бит этого регистра можно определить источник сброса.
Используются следующие биты:
Bit 1 — EXTRF: External Reset Flag — Флаг внешнего сброса.
Bit 0 — PORF: Power On Reset Flag — Флаг включения питания.
Бит EXTRF после включения питания не определен, после внешнего сброса выставляется в 1.
Бит PORF после включения питания выставляется в 1, после внешнего сброса не меняет своего состояния.
Пример программы определяющей источник сброса:
int main( void ) { stdio_init(); if( MCUSR & ( 1 << PORF ) ) { //cброс по питанию puts( "Power on\r\n"); MCUSR &= ~( 1 << PORF ); } else if ( MCUSR & ( 1 << EXTRF ) ) { //внешний сброс puts( "Hard reset\r\n"); MCUSR &= ~( 1 << EXTRF ); } else { //мы можем сюда попасть если, например, //был сделан программный сброс: asm( "jmp 0" ) //или сработал watchdog puts( "Soft reset\r\n"); } //основной цикл программы mainloop(); return 0; } |