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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> "Правильный" софт ресет, который почти как хард ресет
Сергей Борщ
сообщение Nov 12 2008, 17:34
Сообщение #16


Гуру
******

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



Цитата(МП41 @ Nov 12 2008, 17:37) *
Речь идёт о том, что ресет делается из работающей программы, у которой уже в памяти что-то валяется.
Ну и что? И во время первого запуска после аппаратного ресета в памяти что-то валяется. Программа же не использует мусор, она сначала инициализирует переменные, а потом уже ими пользуется. И в стек она сначала кладет, потом вынимает. Зачем делать еще какую-то дополнительную "очистку оперативки"?
Цитата(МП41 @ Nov 12 2008, 17:37) *
Программа сама фузы не меняет, поэтому вывод сброса входом не станет,
Зато станет входом тот вывод, которым вы хотели дергать ногу ресета.


--------------------
На любой вопрос даю любой ответ
"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
zombi
сообщение Nov 12 2008, 17:55
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Сергей Борщ @ Nov 12 2008, 21:34) *
Зато станет входом тот вывод, которым вы хотели дергать ногу ресета.

Должно все работать ведь если он стал входом значит ресет уже сработал biggrin.gif

А вообще мне кажется проблема только в неправильной начальной инициализации стека,портов и перифирии. Возможно первая инициализация (по включению питания) происходит нормально т.к. после аппаратного сброса все регистры инициализируются начальным значением, чего нет при JMP.
Нужно по шагам проверить программу инициализации предполагая что в регистрах и портах не стартовые значения, ну и конечно CLI и инициализация стека в начале обязательно.
Сброс по WDT оч. прикольно, думаю должен решить проблему.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 12 2008, 19:42
Сообщение #18


Гуру
******

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



Цитата(zombi @ Nov 12 2008, 20:55) *
ну и конечно CLI и инициализация стека в начале обязательно.
Снова спрошу - зачем это шаманство с дополнительной инициализацией стека в начале? Программа и так его где надо проинициализирует. Раз она работает после аппаратного ресета, значит стек инициализируется где нужно. Даже(!) если будут разрешены прерывания, то их контекст будет сохраняться в ОЗУ, там, где остался указатель стека от предыдущего запуска программы.
Запрещать прерывания перед инициализацией (в случае перезапука методом jmp) конечно нужно.

Цитата(zombi @ Nov 12 2008, 20:55) *
Должно все работать ведь если он стал входом значит ресет уже сработал
У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?


--------------------
На любой вопрос даю любой ответ
"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
singlskv
сообщение Nov 12 2008, 20:46
Сообщение #19


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Обсуждалось уже очень много раз.
ИМХО:
- если нужен гарантированный сброс всего и временные рамки не давят, WDT лучший вариант
- если нужно быстро и без проблем, запрещаем прерывания и на
каждую функцию InitSomeHardware(...) заводим функцию StopSomeHardware(...) которая
останавливает ВСЕ что касается этой хардвари,
ВСЕ - это значит не только вырубить функцию, но и в некоторых случаях дождаться завершения
текущего действия...

Очищать стеки это что-то очень веселое... smile.gif
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Nov 12 2008, 21:39
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



С остановом периферии могут быть сюрпризы. Както раз мне приспичило остановить UART в 88-й меге, чтобы можно было той лапой, на которой TXD программно поуправлять. Так вот ничего у меня не вышло. При отключении UART этот вывод оставался выходом выдающим еденицу, и не желал повиноваться регистрам PORTD и DDRD. Так что если хочется без головной боли, то WDT - единственный выход.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 12 2008, 21:50
Сообщение #21


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Artem_Petrik @ Nov 13 2008, 00:39) *
С остановом периферии могут быть сюрпризы. Както раз мне приспичило остановить UART в 88-й меге, чтобы можно было той лапой, на которой TXD программно поуправлять. Так вот ничего у меня не вышло. При отключении UART этот вывод оставался выходом выдающим еденицу, и не желал повиноваться регистрам PORTD и DDRD. Так что если хочется без головной боли, то WDT - единственный выход.
А Вы дождались остановки UART ?
Я специально говорил что нужно дождаться окончания последнего действия:
Bit 3 – TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal
port operation for the TxD pin when enabled. The disabling of the Transmitter
(writing TXEN to zero) will not become effective until ongoing and pending transmissions
are completed, i.e., when the transmit Shift Register and transmit Buffer Register
do not contain data to be transmitted.
When disabled, the transmitter will no longer override
the TxD port.
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 12 2008, 22:20
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(zombi @ Nov 12 2008, 21:55) *
Должно все работать ведь если он стал входом значит ресет уже сработал biggrin.gif


Вот что Atmel думает об этом:
software reset

Цитата
We are currently updating the AVR FAQ and a software reset is actually one of the entries we've already made. Some people might recognise parts of this answer (and others, when the FAQ is up and running) that is simply because we have been crusing around avrfreaks searching for the most common questions, so many of the answers have been written many times before smile.gif

<START>

Question
How can I reset my AVR through software?

Answer
If you want to perform a software reset of your AVR you should use the internal Watchdog. Simply enable it and let it time out. When the Watchdog triggers it resets the program counter back to 0, clears all the registers and performs all the other tasks. This operation gives the same result as pulling the RESET line low.

You should not try to:
- Use another pin of the AVR to pull the external RESET line. The pins of the AVR are tristated halfway through the minimum reset time, this releases the RESET line and hence nothing happens.
- Jump to program location 0. Jumping to program location 0 does not clear all the registers and hence you do not have a "clean" reset.


Я думаю также будет полезно прочитать FAQ#30 в avr-libc-user-manual:
How do I perform a software reset of the AVR?

Анатолий.
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Nov 12 2008, 22:52
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(singlskv @ Nov 13 2008, 01:50) *
А Вы дождались остановки UART ?
Я специально говорил что нужно дождаться окончания последнего действия:
Bit 3 – TXEN: Transmitter Enable
Writing this bit to one enables the USART Transmitter. The Transmitter will override normal
port operation for the TxD pin when enabled. The disabling of the Transmitter
(writing TXEN to zero) will not become effective until ongoing and pending transmissions
are completed, i.e., when the transmit Shift Register and transmit Buffer Register
do not contain data to be transmitted.
When disabled, the transmitter will no longer override
the TxD port.

Спасибо, на будущее учту.
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 13 2008, 00:53
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Сергей Борщ @ Nov 12 2008, 23:42) *
У вас есть уверенность, что перевод портов в третье состояние - заключительная стадия процесса ресета?

Полной уверенности нет.
Но раз процесс ресета пошел разве он может не завершиться???
Go to the top of the page
 
+Quote Post
ARV
сообщение Nov 13 2008, 07:52
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(zombi @ Nov 13 2008, 03:53) *
Полной уверенности нет.
Но раз процесс ресета пошел разве он может не завершиться???

вполне может. сброс - процесс многоэтапный, для 51-ых я где-то встречал подробное описание всех стадий. так вот, скажем на первом такте при наличии нужного уровня RST происходит сброс регистров pull-up, на втором такте - сброс DDRx, на третьем - остановка таймеров и т.д. (порядок условный - мои предположения). поэтому, если не дождавшись этапа, когда происходит, например, остановка работы ядра контроллера, убрать RST - контроллер вообще может оказаться в неопределенном состоянии (недосброшенным). теоретически может даже зависнуть... но скорее всего процедура сброса просто не будет выполнена до конца: может не произойти переход на адрес 0000, но вся периферия сбросится и т.п. имхо, лучше не экспериментировать.

P.S. так же имхо, нет приложений, критичных к скорости программного сброса, так что нечего бояться времени срабатывания WDT.

Сообщение отредактировал ARV - Nov 13 2008, 07:53


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Nov 13 2008, 08:46
Сообщение #26


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(aesok @ Nov 13 2008, 01:20) *
Вот что Atmel думает об этом:
software reset
Я думаю также будет полезно прочитать FAQ#30 в avr-libc-user-manual:
How do I perform a software reset of the AVR?

Анатолий.


+1000.
Пора, уже понять и "принять к исполнению", тот факт, что у AVR нет иного "правильного" программного сброса, кроме как с использованием WDT. Все остальное от лукавого.
Go to the top of the page
 
+Quote Post
zombi
сообщение Nov 14 2008, 15:23
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(ARV @ Nov 13 2008, 11:52) *
убрать RST - контроллер вообще может оказаться в неопределенном состоянии (недосброшенным). теоретически может даже зависнуть...

Пипец!
А даташите напысано шо внешний резэт срабатывает по фронту ? 08.gif
Или я пэрэвёл нэправылно???


08.gif (недосброшенным) 01.gif

Сообщение отредактировал zombi - Nov 14 2008, 15:31
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 14 2008, 15:56
Сообщение #28


Гуру
******

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



Цитата(zombi @ Nov 14 2008, 17:23) *
А даташите напысано шо внешний резэт срабатывает по фронту ? 08.gif
Или я пэрэвёл нэправылно???
08.gif (недосброшенным) 01.gif
Читать надо весь даташит, а не выборочно: ATmega8, 2486Q–AVR–10/06, Table 15:
Цитата
tRST Minimum pulse width on RESET Pin 1.5 µs
Переводите как хотите. Невнимательным: twak.gif


--------------------
На любой вопрос даю любой ответ
"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
zombi
сообщение Nov 14 2008, 16:14
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(Сергей Борщ @ Nov 14 2008, 19:56) *
Читать надо весь даташит, а не выборочно: ATmega8, 2486Q–AVR–10/06, Table 15:Переводите как хотите. Невнимательным: twak.gif

Да действительно надо весь читать!
Начал читать.
.
.
.
Прочитал.
Там написано что при импульсе короче 1.5 мкс не гарантируется сброс.
"Shorter pulses are not guaranteed to generate a reset."
Т.е. процедура сброса не начнется.

Но я ничего не могу найти о зависании мк из за короткого импульса.
Или я ищу не там?
Go to the top of the page
 
+Quote Post
МП41
сообщение Nov 14 2008, 16:21
Сообщение #30


4 синих кубика
****

Группа: Участник
Сообщений: 526
Регистрация: 19-09-08
Из: полупроводника, металла и стекла
Пользователь №: 40 326



Многоэтапный сброс будет необратим, если он вообще начнётся, я так думаю, импульс сброса всего-лишь начинает этот процесс.


--------------------
p-n-p-p-n-p-n-n-p-n-p структура однако очень эффективна
Go to the top of the page
 
+Quote Post

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

 


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


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