количество нажатий на RESET в IAR (обработка перывания)
все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
битва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Код: Выделить всё
v++;
if (v > 1) v = 0;- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
а можно подробнее?Мастер Ломастер писал(а):все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
не вышло (BerZerK-ku писал(а):А проверку регистра убрать, почему указано у автора примера.Код: Выделить всё
v++; if (v > 1) v = 0;
как же еще подробнее? но попробуюAR_AROV писал(а):а можно подробнее?Мастер Ломастер писал(а):все флаги в MCUSR устанавливаются аппаратно и до снятия питания не сбрасываются. поэтому вы сам должны обнулять тот флаг, анализ которого позволит вам отличить одно состояние от другого. в вашем случае очистки MCUSR нет - нет и реакции на разные события - всегда срабатывает первое - сброс по включению питания.
флаг PORF устанавливается после подачи питания на МК. но не сбрасывается при сбросе, поэтому все время, пока питание на МК подано и не прерывается, этот флаг будет установлен. значит, если вы где-то делаете if(MCUSR & (1<<PORF)), то это условие будет выполняться ВСЕГДА. соответственно вторая ваша проверка НА СОВПАДЕНИЕ с ДРУГИМ ФЛАГОМ никогда не пройдет - будет мешать вечно стоящий PORF. выход только один: сбрасывать принудительно "лишние" флаги. проще всего - обнулять ПОСЛЕ АНАЛИЗА весь регистр целиком. примерно так:
Код: Выделить всё
if(MCUSR & (1<<PORF)){
// обрабатываем подачу питания
v = 0; // v не инициализируется автоматически у вас
} else if(MCUSR & (1<<EXTRF)){
// обрабатываете то, что надо для этого флага
}// если надо - аналогично обрабатываете все прочие флаги
MCUSR = 0; // принудительно ВСЕ ФЛАГИ сбрасываембитва с дураками проиграна, победители торжествуют. слава победителям!
- Реклама
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
не реагирует, вот так написал:
Код: Выделить всё
DDRB = 255;
DDRD = 255;
if (MCUSR&(1<<PORF))
{
v = 0;
}
else if (MCUSR==(1<<EXTRF))
{
v++;
}
if (v > 1) { v = 0; MCUSR = 0;}я вам на чистом Си написал, как надо делать обработку - вы все творите по-своему... ну что ж, тогда я пас, продолжайте творить
битва с дураками проиграна, победители торжествуют. слава победителям!
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
Мастер Ломастер писал(а):я вам на чистом Си написал, как надо делать обработку - вы все творите по-своему... ну что ж, тогда я пас, продолжайте творить
что я не так сделал?
__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)
{
//было три сброса
}
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)
{
//было три сброса
}
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
огромедное спасибо!!! я не понимал что есть еще что то типа "подрегистров"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 писал(а):огромедное спасибо!!! я не понимал что есть еще что то типа "подрегистров"
Что имелось в виду под подрегистров?
— Не говорите мне что делать и я не скажу куда Вам идти...
PORF, EXTRF, BORF, WDRF - это НЕ подрегистры. Это биты регистра MCUSR (Micro Controller Unit Status Register)
Откройте даташит на МК и будет всё ясно, как белый день.
Откройте даташит на МК и будет всё ясно, как белый день.
I am DX168B and this is my favourite forum on internet!
- Сообщения: 59
- Зарегистрирован: Сб янв 14, 2012 11:05:46
md5sum вот эти биты и имел ввиду... не знал как называются
Спасибо за разъяснение... в даташите все на буржуйском и ни разу ни понятно ((( но я работаю над этим, исправлюсь )DX168B писал(а):PORF, EXTRF, BORF, WDRF - это НЕ подрегистры. Это биты регистра MCUSR (Micro Controller Unit Status Register)
Откройте даташит на МК и будет всё ясно, как белый день.


