Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как программно сгенерить ресет?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
aesok
Цитата(Rock @ May 26 2008, 23:16) *
уточните какая эта версия 2007хххх пожалуйста, придётся обновить ....

smile.gif я думаю что то типа 2009хххх надо будет у Эрика уточнить.

Последняя вышедшая версия WinAVR - 20080512 в ней avr-gcc 4.3. Я уверен что переход на нулевой адрес в ней работает. Если нет пишите.

Анатолий.

Цитата(singlskv @ May 26 2008, 23:14) *
to aesok, а почему бы вам не прописать __vectors в хидерах ?
Правда наверное тогда завалят вопросами "а почему у меня не работает ...." smile.gif


Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)

avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset

Анатолий.
singlskv
Цитата(aesok @ May 26 2008, 23:27) *
Потому что нет никаких причин переходить на 0 адрес. Переход на нелевой адрес это не ресет. (точка.)
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...
Особенно учитывая что в приведенном Вами линке:
Цитата
avr-libc-user-manual FAQ #30 How do I perform a software reset of the AVR? http://www.nongnu.org/avr-libc/user-manual...l#faq_softreset
Есть небольшое такое предупреждение smile.gif :
CAUTION! Older AVRs will have the watchdog timer disabled on a reset. For these older AVRs, doing a soft reset by enabling the watchdog is easy, as the watchdog will then be disabled after the reset. On newer AVRs, once the watchdog is enabled, then it stays enabled, even after a reset! For these newer AVRs a function needs to be added to the .init3 section (i.e. during the startup code, before main()) to disable the watchdog early enough so it does not continually reset the AVR.

А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...

а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)
aesok
Цитата(singlskv @ May 27 2008, 00:26) *
ну давайте все-таки обойдемся без нравоучений, я сам в своем софте лучше знаю
когда нужно делать ресет через watchdog а когда рестарт через джамп на 0 адрес...

Вы правы, переход на нулевой адрес являеться рестартом программы а не ресетом контроллера. Ресет и рестарт разные вещи и не нужно их путать (я не про Вас). Просто выполнять ресет более надежно.

Цитата
А по поводу нужности, ну покажите что ли код с использованием watchdog который будет
начинать работу заново менее чем через 1мс ...


Ну не все вещи в этой жизни можно решить нажимая на кнопочки, в смысле програмно. Програмно AVR-ку можно сбросит за 16мс. Надо быстрее ставте аппаратный формирователь сброса и дергайте его пином. C'EST LA VIE.

Цитата
а то что есть по приведенной Вами ссылке, не более чем предупреждение для тех кто не
в состоянии провести правильно инициализацию/деинициализацию, ну и уж истиной
в последней инстанции это точно не являеться... (типа просто совета так не делать)


А зачем полагаться на программиста который может ошибиться, может проще подождать 16 мс и быть уверенным что работа программы всегда будет начинаться на контроллере который находиться в предсказуемом состоянии? Я выбираю надежность перед крутизной.

Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.

Анатолий.
singlskv
Цитата(aesok @ May 27 2008, 01:03) *
Давайте будем считать, что отсутсвие пределения "__vectors" в avr-libc и являеться советом.
договорились beer.gif
Просто реально бывают ситуации когда нужно "начать все с начала", при этом програмный
контроль всего и вся займет кода(и времени) значительно больше чем просто вариант
"все остановили, все перезапустили", а 16мс это иногда так много...
defunct
Цитата(singlskv @ May 27 2008, 00:16) *
а 16мс это иногда так много...

пином Reset дергайте smile.gif
singlskv
Цитата(defunct @ May 27 2008, 01:36) *
пином Reset дергайте smile.gif
реально быстро стартануть после настоящего ресета можно только
или на внутреннем RC или на керамике, ну нету у авр варианта переключения
источника тактирования.
_Pasha
Цитата(singlskv @ May 26 2008, 23:14) *
НО, Вы можете переопределить обработчик для незадействованных прерывание(типа контроль),


Нет, я имел ввиду по умолчанию.


Цитата(defunct @ May 27 2008, 01:36) *
пином Reset дергайте smile.gif


Тогда надо помнить о таких багах:

Цитата
2. Part may hang in reset
Some parts may get stuck in a reset state when a reset signal is applied when the internal
reset state-machine is in a specific state. The internal reset state-machine is in this state for
approximately 10 ns immediately before the part wakes up after a reset, and in a 10 ns window
when altering the system clock prescaler...... There are theoretical possibilities of this happening also
in run-mode. The following three cases can trigger the device to get stuck in a reset-state:
- Two succeeding resets are applied where the second reset occurs in the 10ns window
before the device is out of the reset-state caused by the first reset.
- A reset is applied in a 10 ns window while the system clock prescaler value is updated by
software.
..............


Возможные последствия усложнения схемы ресета: девайс отъезжает при наносекундных помехах.
bb-offtopic.gif
Лично меня (в моих приложениях) даже подтягивающий резистор на ресете >1кОм уже в ступор вводит. 300 Ом - не больше - ставлю, когда ISP не надо.
singlskv
По мотивам этой темы озадачился вопросом кодогенерации в Gcc.
Ну вобщем все правильно, вышеприведенная ошибка(с неправильным джампом) есть только
в более менее давних версиях Gcc.
Сравнивалась кодогенерация в версиях gcc_3.4.6 и gcc_4.1.2 :
gcc_3.4.6:
Код
;; Unconditional and other jump instructions.
.......................
(define_insn "call_insn"
.......................
  return AS1(%~call,%c0);
}"
.......................
(define_insn "call_value_insn"
.......................
  return AS1(%~call,%c1);
}"

gcc_4.1.2:
Код
;; Unconditional and other jump instructions.
.......................
(define_insn "call_insn"
.......................
  else if (which_alternative==2)
    return AS1(%~call,%c0);
  return (AS2 (ldi,r30,lo8(%0)) CR_TAB
          AS2 (ldi,r31,hi8(%0)) CR_TAB
          \"icall\");
}"
.......................
(define_insn "call_value_insn"
.......................
  else if (which_alternative==2)
    return AS1(%~call,%c1);
  return (AS2 (ldi, r30, lo8(%1)) CR_TAB
          AS2 (ldi, r31, hi8(%1)) CR_TAB
          \"icall\");
}"

то есть как видно из рисунка, при переходе от 3.4.6 к 4.1.2 эта ошибка была подправленна,
как это точно соотноситься с версиями WinAvr точно не знаю, но думаю что все что было
начиная с 200705xx уже правильное.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.