AVR: Определяем причину сброса

Иногда бывает необходимо узнать, по какой причине была перезапущена программа, была ли нажата кнопка 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;
}
Запись опубликована в рубрике Микроконтроллеры avr с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>