|
WDTimer, Запустил, а как остановить? |
|
|
|
Jun 18 2009, 22:15
|
Участник

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

|
Доброго вечера! Заметил такую особенность: при "небольшом" загрязнении между контактами TX и RX (видимо электрический контакт появился), функция gets() безнадежно зависла. Подумал, что хорошо бы запустить перед началом gets() сторожевой таймер, который сбросит контроллер в случае зависания, мало ли чего. WDT запустил путем записи в его регистр сначала комбинации битов, разрешающих изменение режима WDT, а потом записал нужное значение. Через положеные 8 секунд произошол сброс контроллера. Попробовал остановить WDT путем записи в его регистр 0x00. Но эффекта не последовало, произошел сброс... Что делать?!?
|
|
|
|
|
 |
Ответов
|
Jun 18 2009, 22:28
|

Гуру
     
Группа: Модератор 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
|
|
|
|
|
Jun 19 2009, 21:13
|
Участник

Группа: Новичок
Сообщений: 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...  Пойду попробую! Цитата(Qwertty @ Jun 19 2009, 04:41)  Вы бы лучше подумали - а нужна ли такая "полезная" функция. Которая видимо тупо ждет прихода чего бы то ни было в UDR. Используйте нормальный драйвер работающий по прерываниям. Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART! INTERRUPT (SIG_USART_RCV) { gets(); }... Или вы имеете ввиду посимвольно считывать строку???
|
|
|
|
|
Jun 19 2009, 22:51
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(qulik @ Jun 20 2009, 01:13)  Ну дак у меня gets() и находится в блоке обработки прерывания, вызываемого при приеме очередного символа по USART!
INTERRUPT (SIG_USART_RCV) { gets(); }...
Или вы имеете ввиду посимвольно считывать строку??? Именно посимвольно. Данные пришли - только тогда читаем. Ничего не ждем. Ваш же метод - просто ужас. Если строка не придет, а это НОРМАЛЬНАЯ ситуация при работе в реальных условиях, а не у Вас на столе, то контроллер просто повиснет. Предусматривать выход из нормальной ситуаци через сброс по собаке не надо. Плохо это и неправильно.  И еще момент - Вы представляете время выполнения этой функции? К примеру при 9600бод и строке символов в 30? А она у Вас внутри обработчика - значит на это время все другие события(прерывания) будут отброшены. Вот - почитайте - http://ru.wikipedia.org/wiki/GetsЦитата Применение gets весьма осуждается. Функция оставлена в стандартах C89 и C99 для обратной совместимости. Множество инструментов разработки ПО, как например, GNU ld выдает предупреждения в случае обнаружения при компоновке кода с использованием gets. Тут в шапке форума тема - Исходники программ и библиотек. Наверняка там есть нормальный драйвер с кольцевым буфером. Или напишите свой, там работы на пару часов. И не надо отключать ватчдог.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|