|
|
  |
Как программно сгенерить ресет? |
|
|
|
Jul 26 2005, 11:34
|

Частый гость
 
Группа: Свой
Сообщений: 86
Регистрация: 13-06-04
Из: Minsk
Пользователь №: 29

|
Цитата(Karl @ Jul 26 2005, 13:52) Контроллер мега8535. Свободных выводов нет. Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс.
|
|
|
|
|
Jul 27 2005, 03:22
|
Частый гость
 
Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429

|
Цитата(nml @ Jul 26 2005, 16:34) Цитата(Karl @ Jul 26 2005, 13:52) Контроллер мега8535. Свободных выводов нет. Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс. Тоже подумал, что это единственный выход для меня. Переход на начало программы - это не сброс. Не происходит установки в исходное состояние выводов и регистров.
|
|
|
|
|
Jul 28 2005, 06:18
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 25-06-05
Пользователь №: 6 300

|
В своё время удовлетворился таким решением - глобальное запрещение прерываний, запрещение всех важных прерываний, сброс всех важных регистров, сброс стека + rjmp Reset.
|
|
|
|
|
Jul 29 2005, 13:26
|
Участник

Группа: Свой
Сообщений: 56
Регистрация: 25-06-05
Пользователь №: 6 300

|
Цитата Наверное, под важными регистрами имелась в виду ещё и начальная инициализация всей внутренней периферии. Если необходимая инциализация есть после сброса, а у меня именно так, то перечисленных процедур достаточно.
|
|
|
|
|
May 21 2008, 13:52
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478

|
Цитата(MALLOY2 @ Jul 26 2005, 15:27)  1) можнро через вачдог если он есть
2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );
3) или на асме JMP 0x0000 В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет, ещё бы хотелось узнать что эта запись означает. А если в процессоре нет команды jmp, то кроме wdt можно сбросить процессор запретив все прерывания очистить стек и следующую команду поставить ret.
|
|
|
|
|
May 21 2008, 14:20
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Rock @ May 21 2008, 16:52)  В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет, ещё бы хотелось узнать что эта запись означает. Наверное, правильнее ( ( void ( * ) ( void ) ) 0x0000 ) ( ); Сие означает, что число ноль приводится к типу "указатель на функцию, котороя ничего не возвращает и без параметров"; производится вызов этой функции через указатель. Т.е. другими словами: вызываем подпрограмму, начинающуюся с адреса ноль. Цитата(MrYuran @ May 21 2008, 17:04)  Не понял: а почему jump 0х0000 не подходит? произойдёт переход по вектору сброса, то есть на тот же стартап. Переход на адрес ноль - не совсем сброс в том смысле, что перефирия не сбрасывается. Например, USART, который передавал байт в момент перехода на нулевой адрес не прекратит его передавать, а после его передачи начнет передавать следующий из UDR, если он был положен туда до перехода на 0...
|
|
|
|
|
May 21 2008, 14:23
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Rock @ May 21 2008, 16:52)  В WinAVR'е ( ( void ( void * ) ( void ) ) 0x0000 ) ( ); это не работет, ещё бы хотелось узнать что эта запись означает. Наверное MALLOY2 подразумевал ((void(*)()0x0000)(); - приведение константы 0х0000 к типу "указатель на функцию" и вызов функции по этому указателю. Поиск по форуму по "((void(*)()0x0000)()" вам даст несколько ссылок на обсуждения.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 21 2008, 16:39
|

Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 23-05-05
Из: Ташкент
Пользователь №: 5 324

|
Работающий пример на IARe: Код // Программный сброс __disable_interrupt(); __watchdog_reset(); WDTCR |= (unsigned char)(1 << WDE); while(1);
|
|
|
|
|
May 21 2008, 19:05
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(Сергей Борщ @ May 21 2008, 17:23)  Наверное MALLOY2 подразумевал ((void(*)()0x0000)(); Увы, опечатка, ибо при беглом взгляде видно, что скобки не парные. Наверное всё таки вот так: Код ((void (*)())0x0000)(); Не знаю, будет ли работать в WinAVR, но в IAR точно работает.
|
|
|
|
|
May 21 2008, 19:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(IgorKossak @ May 21 2008, 21:05)  Не знаю, будет ли работать в WinAVR, но в IAR точно работает. А чего не работать, если чистейший "C"  Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580Цитата 1. 0 Берем, например, 0 2. ()0 Будем явно тип преобразовывать 3. (*)0 В указатель 4, ((*)())0 .................. на функцию 5. ((*)(void))0 ........................................без параметров 6. (void(*)(void))0 ничего не возвращающую 7. Ну и вызываем это ((void(*)(void))0)(); При необходимости добавляем параметры и возвращаемые значеня по месту.. Только это рестарт, а не ресет. Reset через Watchdog.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 26 2008, 12:10
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 18-02-06
Пользователь №: 14 478

|
Цитата(zltigo @ May 21 2008, 23:27)  ((void(*)(void))0)(); А чего не работать, если чистейший "C"  Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580Только это рестарт, а не ресет. Reset через Watchdog. А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!!
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|