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

 
 
> WDTimer, Запустил, а как остановить?
qulik
сообщение Jun 18 2009, 22:15
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Доброго вечера!
Заметил такую особенность: при "небольшом" загрязнении между контактами TX и RX (видимо электрический контакт появился), функция gets() безнадежно зависла. Подумал, что хорошо бы запустить перед началом gets() сторожевой таймер, который сбросит контроллер в случае зависания, мало ли чего. WDT запустил путем записи в его регистр сначала комбинации битов, разрешающих изменение режима WDT, а потом записал нужное значение. Через положеные 8 секунд произошол сброс контроллера. Попробовал остановить WDT путем записи в его регистр 0x00. Но эффекта не последовало, произошел сброс... Что делать?!?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jun 18 2009, 22:28
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(qulik @ Jun 19 2009, 02:15) *
WDT запустил путем записи в его регистр сначала комбинации битов, разрешающих изменение режима WDT, а потом записал нужное значение. Через положеные 8 секунд произошол сброс контроллера. Попробовал остановить WDT путем записи в его регистр 0x00. Но эффекта не последовало, произошел сброс... Что делать?!?


А вы пытались останавить его тоже комбинацией или простой записью?
Может быть так попробовать:

WDTCSR |= (1<<WDCE);
WDTCSR = 0;

или так:

WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;

Только не забудьте прерывания блокировать на время исполнения этих двух строк.
Ну в крайнем случае так:

cli();
wdt_reset();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;
sei();

Ну тут уж кажется всё предусмотрено с запасом...

Сообщение отредактировал Xenia - Jun 18 2009, 22:41
Go to the top of the page
 
+Quote Post
qulik
сообщение Jun 19 2009, 21:13
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 2-04-08
Из: Санкт-Петербург
Пользователь №: 36 424



Цитата(Xenia @ Jun 19 2009, 02:28) *
А вы пытались останавить его тоже комбинацией или простой записью?
Может быть так попробовать:

WDTCSR |= (1<<WDCE);
WDTCSR = 0;

или так:

WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0;


Так пробовал, непомогло.

А вот следующий вариант выглядит убедительно! Что-то я припоменаю про MCUSR при сбросе бита WDE... smile.gif Пойду попробую!


Цитата(Qwertty @ Jun 19 2009, 04:41) *
Вы бы лучше подумали - а нужна ли такая "полезная" функция. Которая видимо тупо ждет прихода чего бы то ни было в UDR. Используйте нормальный драйвер работающий по прерываниям.


Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!

INTERRUPT (SIG_USART_RCV)
{
gets();
}...

Или вы имеете ввиду посимвольно считывать строку???
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Jun 19 2009, 22:51
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(qulik @ Jun 20 2009, 01:13) *
Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!

INTERRUPT (SIG_USART_RCV)
{
gets();
}...

Или вы имеете ввиду посимвольно считывать строку???

Именно посимвольно. Данные пришли - только тогда читаем. Ничего не ждем. Ваш же метод - просто ужас. Если строка не придет, а это НОРМАЛЬНАЯ ситуация при работе в реальных условиях, а не у Вас на столе, то контроллер просто повиснет. Предусматривать выход из нормальной ситуаци через сброс по собаке не надо. Плохо это и неправильно. smile.gif И еще момент - Вы представляете время выполнения этой функции? К примеру при 9600бод и строке символов в 30? А она у Вас внутри обработчика - значит на это время все другие события(прерывания) будут отброшены.
Вот - почитайте - http://ru.wikipedia.org/wiki/Gets
Цитата
Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets.

Тут в шапке форума тема - Исходники программ и библиотек. Наверняка там есть нормальный драйвер с кольцевым буфером. Или напишите свой, там работы на пару часов. И не надо отключать ватчдог.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- qulik   WDTimer   Jun 18 2009, 22:15
|- - singlskv   Цитата(Xenia @ Jun 19 2009, 02:28) А вы п...   Jun 19 2009, 21:20
|- - qulik   Цитата(singlskv @ Jun 20 2009, 01:20) Ну ...   Jun 19 2009, 21:58
|- - Xenia   Цитата(singlskv @ Jun 20 2009, 01:20) ВСЕ...   Jun 19 2009, 22:00
|- - singlskv   Цитата(Xenia @ Jun 20 2009, 02:00) - межд...   Jun 19 2009, 22:13
|- - Xenia   Цитата(singlskv @ Jun 20 2009, 02:09) Оди...   Jun 19 2009, 22:14
|- - singlskv   Цитата(Xenia @ Jun 20 2009, 02:14) Конста...   Jun 19 2009, 22:21
|- - Xenia   Цитата(singlskv @ Jun 20 2009, 02:21) Вы ...   Jun 19 2009, 22:28
- - Qwertty   Цитата(qulik @ Jun 19 2009, 02:15) Доброг...   Jun 19 2009, 00:41
- - qulik   А что меняет выбор варианта оптимизации? В AVR Stu...   Jun 19 2009, 22:18
|- - singlskv   Цитата(qulik @ Jun 20 2009, 02:18) А что ...   Jun 19 2009, 22:35
|- - Xenia   Цитата(qulik @ Jun 20 2009, 02:18) Спасиб...   Jun 19 2009, 22:36
|- - singlskv   Цитата(Xenia @ Jun 20 2009, 02:36) Дольше...   Jun 19 2009, 22:48
- - qulik   Да, соглашусь со всем! gets() "убъет...   Jun 20 2009, 21:52
|- - Xenia   Цитата(qulik @ Jun 21 2009, 01:52) Да, со...   Jun 20 2009, 23:23
|- - qulik   Цитата(Xenia @ Jun 21 2009, 03:23) Совсем...   Jun 21 2009, 12:28
|- - Xenia   Цитата(qulik @ Jun 21 2009, 16:28) Приним...   Jun 21 2009, 13:58
|- - qulik   Цитата(Xenia @ Jun 21 2009, 17:58) По одн...   Jun 24 2009, 17:06
|- - Xenia   Цитата(qulik @ Jun 24 2009, 21:06) По кра...   Jun 24 2009, 23:11
|- - qulik   Цитата(Xenia @ Jun 25 2009, 03:11) ...   Jun 25 2009, 17:08
- - Qwertty   Вообще то неплохо контролировать правильность посы...   Jun 25 2009, 01:40


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

 


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


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