количество нажатий на RESET в IAR (обработка перывания)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение Мастер Ломастер »

все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение BerZerK-ku »

Код: Выделить всё

v++; 
if  (v > 1) v = 0;
А проверку регистра убрать, почему указано у автора примера.
Реклама
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

Мастер Ломастер писал(а):все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
а можно подробнее?
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

BerZerK-ku писал(а):

Код: Выделить всё

v++; 
if  (v > 1) v = 0;
А проверку регистра убрать, почему указано у автора примера.
не вышло (
Реклама
Эиком - электронные компоненты и радиодетали
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение Мастер Ломастер »

AR_AROV писал(а):
Мастер Ломастер писал(а):все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
а можно подробнее?
как же еще подробнее? но попробую :)
флаг PORF устанавливается после подачи питания на МК. но не сбрасывается при сбросе, поэтому все время, пока питание на МК подано и не прерывается, этот флаг будет установлен. значит, если вы где-то делаете if(MCUSR & (1<<PORF)), то это условие будет выполняться ВСЕГДА. соответственно вторая ваша проверка НА СОВПАДЕНИЕ с ДРУГИМ ФЛАГОМ никогда не пройдет - будет мешать вечно стоящий PORF. выход только один: сбрасывать принудительно "лишние" флаги. проще всего - обнулять ПОСЛЕ АНАЛИЗА весь регистр целиком. примерно так:

Код: Выделить всё

if(MCUSR & (1<<PORF)){
   // обрабатываем подачу питания
   v = 0; // v не инициализируется автоматически у вас
} else if(MCUSR & (1<<EXTRF)){
   // обрабатываете то, что надо для этого флага
}// если надо - аналогично обрабатываете все прочие флаги

MCUSR = 0; // принудительно ВСЕ ФЛАГИ сбрасываем
при таком коде когда произойдет ОЧЕРЕДНОЙ сброс - флаг PORF уже будет отсутствовать, как и все прочие, что позволит однозначно определить причину сброса.
битва с дураками проиграна, победители торжествуют. слава победителям!
Реклама
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

не реагирует, вот так написал:

Код: Выделить всё

DDRB = 255;
  DDRD = 255;
  
  if (MCUSR&(1<<PORF)) 
  {
    v = 0;
  } 
  else if (MCUSR==(1<<EXTRF)) 
  {
    v++;
  }  

  if (v > 1) { v = 0; MCUSR = 0;}
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение Мастер Ломастер »

я вам на чистом Си написал, как надо делать обработку - вы все творите по-своему... ну что ж, тогда я пас, продолжайте творить
битва с дураками проиграна, победители торжествуют. слава победителям!
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

Мастер Ломастер писал(а):я вам на чистом Си написал, как надо делать обработку - вы все творите по-своему... ну что ж, тогда я пас, продолжайте творить
:( не надо пас...

что я не так сделал?
Аватара пользователя
iplogger
Грызет канифоль
Сообщения: 262
Зарегистрирован: Пн дек 15, 2008 19:28:38
Откуда: Омск

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение iplogger »

__no_init unsigned int v;

if (MCUSR & (1<<PORF))
{
//был сброс по подаче питания (первый раз подали питание на контроллер)
v = 0; //инициализируем переменную
}
else if (MCUSR & (1<EXTRF))
{
//был сброс по RESET
v++; //наращиваем счетчик "сбросов"
}
else if (MCUSR & (1<<BORF))
{
//была "просадка" по питанию - ничего не делаем
}
else if (MCUSR & (1<<WDRF))
{
//сработал сторожевой таймер - ничего не делаем
}

MCUSR = 0; // очистить регистр статуса

if (v == 1)
{
//был один сброс

}
else if (v == 2)
{
//было два сброса

}
else if (v == 3)
{
//было три сброса

}
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

iplogger писал(а):__no_init unsigned int v;

if (MCUSR & (1<<PORF))
{
//был сброс по подаче питания (первый раз подали питание на контроллер)
v = 0; //инициализируем переменную
}
else if (MCUSR & (1<EXTRF))
{
//был сброс по RESET
v++; //наращиваем счетчик "сбросов"
}
else if (MCUSR & (1<<BORF))
{
//была "просадка" по питанию - ничего не делаем
}
else if (MCUSR & (1<<WDRF))
{
//сработал сторожевой таймер - ничего не делаем
}

MCUSR = 0; // очистить регистр статуса

if (v == 1)
{
//был один сброс

}
else if (v == 2)
{
//было два сброса

}
else if (v == 3)
{
//было три сброса

}
огромедное спасибо!!! я не понимал что есть еще что то типа "подрегистров"
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение md5sum »

AR_AROV писал(а):огромедное спасибо!!! я не понимал что есть еще что то типа "подрегистров"
Не советую выдумывать себе новые определения! Потом сами запутаетесь...
Что имелось в виду под подрегистров?
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение DX168B »

PORF, EXTRF, BORF, WDRF - это НЕ подрегистры. Это биты регистра MCUSR (Micro Controller Unit Status Register)
Откройте даташит на МК и будет всё ясно, как белый день. :)
I am DX168B and this is my favourite forum on internet!
AR_AROV
Открыл глаза
Сообщения: 59
Зарегистрирован: Сб янв 14, 2012 11:05:46

Re: количество нажатий на RESET в IAR (обработка перывания)

Сообщение AR_AROV »

md5sum вот эти биты и имел ввиду... не знал как называются

DX168B писал(а):PORF, EXTRF, BORF, WDRF - это НЕ подрегистры. Это биты регистра MCUSR (Micro Controller Unit Status Register)
Откройте даташит на МК и будет всё ясно, как белый день. :)
Спасибо за разъяснение... в даташите все на буржуйском и ни разу ни понятно ((( но я работаю над этим, исправлюсь )
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»