реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как программно сгенерить ресет?
Karl
сообщение Jul 26 2005, 10:52
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Контроллер мега8535. Свободных выводов нет.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jul 26 2005, 11:27
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



1) можнро через вачдог если он есть

2) а можно так ( ( void ( void * ) ( void ) ) 0x0000 ) ( );

3) или на асме JMP 0x0000
Go to the top of the page
 
+Quote Post
nml
сообщение Jul 26 2005, 11:34
Сообщение #3


Частый гость
**

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



Цитата(Karl @ Jul 26 2005, 13:52)
Контроллер мега8535. Свободных выводов нет.
*


Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс.
Go to the top of the page
 
+Quote Post
Karl
сообщение Jul 27 2005, 03:22
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 4-02-05
Пользователь №: 2 429



Цитата(nml @ Jul 26 2005, 16:34)
Цитата(Karl @ Jul 26 2005, 13:52)
Контроллер мега8535. Свободных выводов нет.
*


Наверное, разрешить WDT и зациклиться. По истечени определенного времени (по настройкам предделителя WDT) будет сброс.
*



Тоже подумал, что это единственный выход для меня. Переход на начало программы - это не сброс. Не происходит установки в исходное состояние выводов и регистров.
Go to the top of the page
 
+Quote Post
lolikandr
сообщение Jul 28 2005, 06:18
Сообщение #5


Участник
*

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



В своё время удовлетворился таким решением - глобальное запрещение прерываний, запрещение всех важных прерываний, сброс всех важных регистров, сброс стека + rjmp Reset.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 29 2005, 07:04
Сообщение #6


Шаман
******

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



Цитата(lolikandr @ Jul 28 2005, 09:18)
В своё время удовлетворился таким решением - глобальное запрещение прерываний, запрещение всех важных прерываний, сброс всех важных регистров, сброс стека + rjmp Reset.
*

Наверное, под важными регистрами имелась в виду ещё и начальная инициализация всей внутренней периферии.
Go to the top of the page
 
+Quote Post
lolikandr
сообщение Jul 29 2005, 13:26
Сообщение #7


Участник
*

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



Цитата
Наверное, под важными регистрами имелась в виду ещё и начальная инициализация всей внутренней периферии.

Если необходимая инциализация есть после сброса, а у меня именно так, то перечисленных процедур достаточно.
Go to the top of the page
 
+Quote Post
Rock
сообщение May 21 2008, 13:52
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение May 21 2008, 14:04
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Ещё один способ:
пишем ручками стартап со всеми необходимыми действиями, линкуем в программу, а для сброса делаем jump на свой стартап.
Не понял: а почему jump 0х0000 не подходит?
произойдёт переход по вектору сброса, то есть на тот же стартап.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 21 2008, 14:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2008, 14:23
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
kada
сообщение May 21 2008, 16:39
Сообщение #12


Частый гость
**

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



Работающий пример на IARe:

Код
// Программный сброс
__disable_interrupt();
__watchdog_reset();
WDTCR |= (unsigned char)(1 << WDE);
while(1);
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 21 2008, 19:05
Сообщение #13


Шаман
******

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



Цитата(Сергей Борщ @ May 21 2008, 17:23) *
Наверное MALLOY2 подразумевал ((void(*)()0x0000)();

Увы, опечатка, ибо при беглом взгляде видно, что скобки не парные. Наверное всё таки вот так:
Код
((void (*)())0x0000)();

Не знаю, будет ли работать в WinAVR, но в IAR точно работает.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 21 2008, 19:27
Сообщение #14


Гуру
******

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



Цитата(IgorKossak @ May 21 2008, 21:05) *
Не знаю, будет ли работать в WinAVR, но в IAR точно работает.

А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал 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
Go to the top of the page
 
+Quote Post
Rock
сообщение May 26 2008, 12:10
Сообщение #15


Участник
*

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



Цитата(zltigo @ May 21 2008, 23:27) *
((void(*)(void))0)();
А чего не работать, если чистейший "C" smile.gif
Уже как-то поминал http://electronix.ru/forum/index.php?showtopic=35580

Только это рестарт, а не ресет. Reset через Watchdog.

А вот и не работает в WinAvr'e, улетает не на нулевой адрес!!! laughing.gif
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01611 секунд с 7
ELECTRONIX ©2004-2016