Перейти к содержанию

Как програмно вызвать прерывание RESET?


Гость химик

Рекомендуемые сообщения

Добрый вечер. Нужно програмно в CVAVR для микроконтролера ATmega8 вызвать прерывание RESET.

Прерывание будет выполняться при определенном условии в обработчике прерывания таймера 0.

Ссылка на комментарий
Поделиться на другие сайты

Не уверен что это правильно, но если тупо на ногу Reset подцепить любой свободный выход с "1" при инициализации, а при необходимости сброса перекинуть его в "0"

Ссылка на комментарий
Поделиться на другие сайты

Увы, reset единственная свободная нога.

Мысли вслух: а можно ли в прерывании таймера инициализировать сторожевую собачку?

Ссылка на комментарий
Поделиться на другие сайты

Ну вообще Watchdog инициализируется программно, так что можно попробовать.

 

 

Добавлено после раздумий:

И в довесок еще бредовая идея :smile: , чтобы использовать пин Reset по назначению он должен быть входом и быть подтянутым к плюсу питания, но его ведь можно включить и как выход, в таком случае мы лишаемся этого самого внешнего сброса, НО тут есть интересный момент, делаем следующее, когда нам нужен программный сброс переключаем пин Reset на выход и подаем на него "0", затем переключаем Reset назад, т.е. вход с подтяжкой. А снаружи к этому пину цепляем некое логическое устройство, которое изначально имеет на выходе "1", но при появлении "0" само перекидывается в "0" и удерживает его какое то время, например пару секунд, а затем опять выставляет "1". Т.е. мы сначала отключаем Reset активируя этим логический "0" на ноге МК, а затем его же и ловим включенным Reset'ом. :smile:

Изменено пользователем hsl
Ссылка на комментарий
Поделиться на другие сайты

Кондёр с резистором по хорошему уже должен быть на Reset'е, остается его только увеличить до необходимой емкости, ну и проверить в железе все это безобразие ))

Ссылка на комментарий
Поделиться на другие сайты

И как это, переключить reset на выход, подать 0, а потом переключить на вход? А как поступать тогда с фьюзём reset?

Я так понял, что програмно можно только сторожевой таймер активировать, а reset только в железе?

Ссылка на комментарий
Поделиться на другие сайты

И как это, переключить reset на выход, подать 0, а потом переключить на вход? А как поступать тогда с фьюзём reset?

Я так понял, что програмно можно только сторожевой таймер активировать, а reset только в железе?

 

Что нужно? Чтобы прошел аппаратный сброс, с переинициализацией всей переферии как при включении? Или достаточно сбросить и начать выполнять заново только программу? Если второе - jmp 0000h передача управления в точку входа после сброса, если я не ошибаюсь.

Ссылка на комментарий
Поделиться на другие сайты

И как это, переключить reset на выход, подать 0, а потом переключить на вход? А как поступать тогда с фьюзём reset?

Я так понял, что програмно можно только сторожевой таймер активировать, а reset только в железе?

Причем тут фьюзы, вот

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=P State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x40;
DDRC=0x00;

пин ресет как вход с подтяжкой, а вот

// Port C initialization
// Func6=Out Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=0 State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x40;

Как выход с "0"

Ссылка на комментарий
Поделиться на другие сайты

Что нужно? Чтобы прошел аппаратный сброс, с переинициализацией всей переферии как при включении? Или достаточно сбросить и начать выполнять заново только программу? Если второе - jmp 0000h передача управления в точку входа после сброса, если я не ошибаюсь.

Эээ... Это в asm так просто, а я там дуб - дерево хвойное. Как в cvavr перейти без возврата из обработчика прерываний, да прямиком в функцию main();? Проще всего сделать reset. Но как бы это сделать програмно? Есть же вектор прерываний [1], есть регистрпрерываний, а вот мозгов не хватает, как из этого получить пользу.

Ссылка на комментарий
Поделиться на другие сайты

Эээ... Это в asm так просто, а я там дуб - дерево хвойное. Как в cvavr перейти без возврата из обработчика прерываний, да прямиком в функцию main();? Проще всего сделать reset. Но как бы это сделать програмно? Есть же вектор прерываний [1], есть регистрпрерываний, а вот мозгов не хватает, как из этого получить пользу.

Так и не ясно, нужно просто перейти в самое начало, или все сбросить?

Про переход почитайте здесь - _https://microsin.ru/content/view/1174/44/ , все просто.

Если возврат происходил из обработчика прерывания, то после всего этого устанавливаете флаг I в регистре SREG.

Сброс регистров в принципе тоже несложно сделать - цикл в котором записываются нули по адресам регистров. Можно и RAM так же обнулить.

Изменено пользователем alexakaohm
Ссылка на комментарий
Поделиться на другие сайты

Так и не ясно, нужно просто перейти в самое начало, или все сбросить?

Нужен полный сброс.

Про переход почитайте здесь - _https://microsin.ru/content/view/1174/44/ , все просто.

Если возврат происходил из обработчика прерывания, то после всего этого устанавливаете флаг I в регистре SREG.

Сброс регистров в принципе тоже несложно сделать - цикл в котором записываются нули по адресам регистров. Можно и RAM так же обнулить.

А если так:


interrupt [TIM0_OVF] void timer0_ovf_isr(void){         

  бла, бла, бла;

 if (   ){      
   Функция А();                            
    }else{                                              
      TCCR0=0x00;                                       
      TCNT0=0x00; 
      };
}

void Функция А(void){
   
  SREG = SREG ^ 0b10000000;

  бла, бла, бла;
  
}

 

Мне нужно при переходе в функцию А, окончить прерывание чтобы запустилось другое в функции А. Либо заменить Функция А(); операцией reset.

Изменено пользователем химик
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...