Гость химик Опубликовано 26 Октября, 2012 в 18:08 Жалоба Поделиться Опубликовано 26 Октября, 2012 в 18:08 Добрый вечер. Нужно програмно в CVAVR для микроконтролера ATmega8 вызвать прерывание RESET. Прерывание будет выполняться при определенном условии в обработчике прерывания таймера 0. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 26 Октября, 2012 в 18:53 Жалоба Поделиться Опубликовано 26 Октября, 2012 в 18:53 Не уверен что это правильно, но если тупо на ногу Reset подцепить любой свободный выход с "1" при инициализации, а при необходимости сброса перекинуть его в "0" Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 26 Октября, 2012 в 19:17 Жалоба Поделиться Опубликовано 26 Октября, 2012 в 19:17 Увы, reset единственная свободная нога. Мысли вслух: а можно ли в прерывании таймера инициализировать сторожевую собачку? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 27 Октября, 2012 в 08:27 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 08:27 (изменено) Ну вообще Watchdog инициализируется программно, так что можно попробовать. Добавлено после раздумий: И в довесок еще бредовая идея :smile: , чтобы использовать пин Reset по назначению он должен быть входом и быть подтянутым к плюсу питания, но его ведь можно включить и как выход, в таком случае мы лишаемся этого самого внешнего сброса, НО тут есть интересный момент, делаем следующее, когда нам нужен программный сброс переключаем пин Reset на выход и подаем на него "0", затем переключаем Reset назад, т.е. вход с подтяжкой. А снаружи к этому пину цепляем некое логическое устройство, которое изначально имеет на выходе "1", но при появлении "0" само перекидывается в "0" и удерживает его какое то время, например пару секунд, а затем опять выставляет "1". Т.е. мы сначала отключаем Reset активируя этим логический "0" на ноге МК, а затем его же и ловим включенным Reset'ом. :smile: Изменено 27 Октября, 2012 в 08:28 пользователем hsl Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость alx25v Опубликовано 27 Октября, 2012 в 12:11 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 12:11 например кондёр с резистором. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 27 Октября, 2012 в 15:55 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 15:55 Кондёр с резистором по хорошему уже должен быть на Reset'е, остается его только увеличить до необходимой емкости, ну и проверить в железе все это безобразие )) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 27 Октября, 2012 в 16:25 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 16:25 И как это, переключить reset на выход, подать 0, а потом переключить на вход? А как поступать тогда с фьюзём reset? Я так понял, что програмно можно только сторожевой таймер активировать, а reset только в железе? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость borman Опубликовано 27 Октября, 2012 в 17:26 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 17:26 И как это, переключить reset на выход, подать 0, а потом переключить на вход? А как поступать тогда с фьюзём reset?Я так понял, что програмно можно только сторожевой таймер активировать, а reset только в железе? Что нужно? Чтобы прошел аппаратный сброс, с переинициализацией всей переферии как при включении? Или достаточно сбросить и начать выполнять заново только программу? Если второе - jmp 0000h передача управления в точку входа после сброса, если я не ошибаюсь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость hsl Опубликовано 27 Октября, 2012 в 17:34 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 17:34 И как это, переключить 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" Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 27 Октября, 2012 в 17:53 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 17:53 Что нужно? Чтобы прошел аппаратный сброс, с переинициализацией всей переферии как при включении? Или достаточно сбросить и начать выполнять заново только программу? Если второе - jmp 0000h передача управления в точку входа после сброса, если я не ошибаюсь. Эээ... Это в asm так просто, а я там дуб - дерево хвойное. Как в cvavr перейти без возврата из обработчика прерываний, да прямиком в функцию main();? Проще всего сделать reset. Но как бы это сделать програмно? Есть же вектор прерываний [1], есть регистрпрерываний, а вот мозгов не хватает, как из этого получить пользу. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость alexakaohm Опубликовано 27 Октября, 2012 в 18:55 Жалоба Поделиться Опубликовано 27 Октября, 2012 в 18:55 (изменено) Эээ... Это в asm так просто, а я там дуб - дерево хвойное. Как в cvavr перейти без возврата из обработчика прерываний, да прямиком в функцию main();? Проще всего сделать reset. Но как бы это сделать програмно? Есть же вектор прерываний [1], есть регистрпрерываний, а вот мозгов не хватает, как из этого получить пользу. Так и не ясно, нужно просто перейти в самое начало, или все сбросить? Про переход почитайте здесь - _https://microsin.ru/content/view/1174/44/ , все просто. Если возврат происходил из обработчика прерывания, то после всего этого устанавливаете флаг I в регистре SREG. Сброс регистров в принципе тоже несложно сделать - цикл в котором записываются нули по адресам регистров. Можно и RAM так же обнулить. Изменено 27 Октября, 2012 в 19:01 пользователем alexakaohm Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 29 Октября, 2012 в 15:04 Жалоба Поделиться Опубликовано 29 Октября, 2012 в 15:04 (изменено) Так и не ясно, нужно просто перейти в самое начало, или все сбросить? Нужен полный сброс. Про переход почитайте здесь - _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. Изменено 29 Октября, 2012 в 16:24 пользователем химик Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения