Обсуждаем контроллеры компании Atmel.
Ответить

работа wdt в Attiny2313

Пт май 22, 2009 17:49:22

Здравствуйте.Я пробую реализовать работу охранного таймера в режиме прерывания.Вроде бы и бит WDIE установлен и прерывания разрешены,но они не происходят.Может есть у кого нибудь исходник на асме показывающий работу wdt ?

Сб май 23, 2009 00:43:11

Чего-то в вашем сообщении ничего не сказано об установленом fuse - wdton

Сб май 23, 2009 06:20:44

Vov123 писал(а):Чего-то в вашем сообщении ничего не сказано об установленом fuse - wdton

Насколько я понял из книги (читаю Белова) wdton надо устанавливать в том случае,если нужно чтобы охранный таймер запускался автоматически,я его хочу запустить уже в процессе работы.

Сб май 23, 2009 08:39:21

wdt включается fus-ом,включить его без программатора не получится.
Там к книге идёт диск,на диске fuse-calculator,к каждому fuse короткий коментарий:
" Сторожевой таймер предназначен для вывода микроконтроллера из режима "зависания". Прежде чем включать таймер, необходимо предусмотреть в вашей программе специальные команды работающие с ним. Подробнее смотрите в документации."

Не понятно,если вы читаете Белова,зачем спрашиваете.

Сб май 23, 2009 18:31:26

Vov123 писал(а):"

Не понятно,если вы читаете Белова,зачем спрашиваете.

Затем,что после прочтения книги я так и не смог добится нормальной работы охранного таймера. И видимо исходников ни у кого нет :(

Если вы правы и нужно установить wdton то получается что я не смогу увидеть работу таймера через AVR Studio?

Сб май 23, 2009 18:55:48

Nolk писал(а):Насколько я понял из книги (читаю Белова) wdton надо устанавливать в том случае,если нужно чтобы охранный таймер запускался автоматически,...
Именно так и есть (не слушай никого), а каким кодом запускаешь таймер-то?

Сб май 23, 2009 20:07:52

а каким кодом запускаешь таймер-то?

Вот этим.
Код:
cli
wdr
in r16,MCUSR
andi r16,(0xff&(0<<WDRF))
out MCUSR,r16
in r16,WDTCR
ori r16,(1<<WDCE)|(1<<WDE)
out WDTCR,r16
ldi r16,(1<<WDIE)
out WDTCR,r16
sei

Сб май 23, 2009 20:49:22

Хм, код взят из ДШ, значит нужно копать в другом направлении. А как ты пришел к выводу, что прерываний нет?

Сб май 23, 2009 21:09:29

Yellow Tiger писал(а):Хм, код взят из ДШ, значит нужно копать в другом направлении. А как ты пришел к выводу, что прерываний нет?

Проверял работу на AVR Studio.По прерыванию управление должно было передатся на определенную метку.Кстати если не трудно поясни
с каким регистром работает команда wdr,а то про нее написано "сброс сторожевого таймера" и все. Опять же AVR Studio на нее никак не реагирует.

Сб май 23, 2009 21:31:33

Nolk
Ваша инициализация - полный бред.
А где у вас вообще запуск дога?

Вот эта строчка бессмыслена
Код:
andi r16,(0xff&(0<<WDRF))

Если хотите сбросить бит, то
Код:
andi r16, ~(1 << WDRF)


Насчёт WD.
Как я понял, вы делаете режим "Прерывание потом сброс".
Желательно одной командой устанавливать и WDE и WDIE. Не помешает сбросить флаг прерывания.
Код:
cli
wdr
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCSR, r16
ldi r16, (1<<WDIF) | (1<<WDIE) | (1<<WDCE) | (1<<WDE) | (1<<WDP0)
out WDTCSR, r16
sei

Сб май 23, 2009 21:32:15

Nolk писал(а):Проверял работу на AVR Studio.
Ну так может ты просто не дождался прерывания? При симуляции масштаб времени другой. :)
Ни в каком регистре следов от WDR нет, эта инструкция попросту сбрасывает внутренний счетчик, по переполнению которого и производится сброс или вызов прерывания от WDT. Попробуй выставить самый мелкий прескейлер (WDP0..3 = 0), поставь точку останова в процедуре прерывания по WDT и затем дооолго жди, когда произойдет останов - частота встроенного генератора у WDT всего 128кГц, представляешь сколько тактов CPU должно пройти на один его такт? А ведь самый маленький прескейл у WDT равен 2048 тактов!
Кстати, может быть время ожидания удастся сократить, наврав Студии - скажи ей, что тактовая у твоего CPU маленькая. :)))
На всякий случай спрошу - а ты wdr как часто вызываешь? Если вот так:
Код:
void main()
{
        while (1){
            wdr();
        }
}
то прерывания и не должно быть... :)))

asteroid7 писал(а):Nolk Ваша инициализация - полный бред.
Это не его инициализация - это Атмела, срочно сообщи им! А-то, дурят народ своими байками (ДШ ревизии 2543-I-AVR-04/06, стр.43):
Изображение

asteroid7 писал(а):1. Как я понял, вы делаете режим "Прерывание потом сброс".
2. Желательно одной командой устанавливать и WDE и WDIE.

1. Нет - ему нужен режим только с прерываниями, судя по его коду ("ldi r16,(1<<WDIE) \ out WDTCR,r16")
2. Почему WDE и WDIE нужно устанавливать одной командой? Что-то не припомню такого требования у Атмела... :?
3. Можно пояснить, какой смысл разрешать изменения и не делать их?:
Код:
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)  ; разрешаем изменения
out WDTCSR, r16    ; но пишем неизмененную величину

Вс май 24, 2009 04:23:21

Yellow Tiger писал(а):Это не его инициализация - это Атмела, срочно сообщи им! ...
Это пример остановки WD таймера, а не инициализации. Инициализация или запуск его, страницей ниже. И, пожалуйста, не надо обращаться ко мне на ты.

Однако... у атмела в ДШ реально есть строка :shock:
Код:
andi r16, (0xff & (0<<WDRF))
Никогда на неё не обращал внимания... Проверил в "студио" - выражение считается как ноль. Это аналогично коду
Код:
andi r16, 0
Похоже, что атмеловцы в ДШ накосячили. :)


Yellow Tiger писал(а):1. Нет - ему нужен режим только с прерываниями, судя по его коду ("ldi r16,(1<<WDIE) \ out WDTCR,r16")
2. Почему WDE и WDIE нужно устанавливать одной командой? Что-то не припомню такого требования у Атмела... :?
3. Можно пояснить, какой смысл разрешать изменения и не делать их?:
Код:
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)  ; разрешаем изменения
out WDTCSR, r16    ; но пишем неизмененную величину

1. Я до сих пор не понял, что требуется ТС. Ни по приведённому коду ни по его постам. Я только предположил. А если ему нужно только прерывание, то нефиг трогать WDE.
2. Про требования ни словом не обмолвился. Ну на хрена разносить код, который можно написать в две строки.
3. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.

Вс май 24, 2009 13:02:00

Автору вопроса
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
http://cadzone.ru/content/view/845/33/
Немного не понятно,ведь в 2313 нет регистра TWDCR,а есть TWDCSR.
Попробуйте воспользоваться рекомендациями.
Вложения
p0051.gif
(130.86 KiB) Скачиваний: 726

Вс май 24, 2009 14:21:47

Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг. :)))

asteroid7 писал(а):Это пример остановки WD таймера, а не инициализации.
Это просто пример, а применяя его на практике, программист подставляет в него единичку или нолик - как ему нужно в его конкретном случае - было бы странно со стороны Атмела приводить дважды один фрагмент кода с отличием в одном бите.
asteroid7 писал(а):Однако... у атмела в ДШ реально есть строка :shock:
Код:
andi r16, (0xff & (0<<WDRF))
Никогда на неё не обращал внимания... Проверил в "студио" - выражение считается как ноль.
Возможно, их ассемблер правильно понимает такие штуки.
asteroid7 писал(а):3. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
Я просто неверно сосчитал, где заканчиваются четыре такта. Странно, вроде бы еще не поздно было. :)))

P.S.
asteroid7 писал(а):И, пожалуйста, не надо обращаться ко мне на ты.
Этого не нужно добиваться, это должно происходить само-собой - на основе взаимности; но после таких вот экзерсисов:
asteroid7 писал(а):Ваша инициализация - полный бред.
это бывает очень затруднено (ибо ответить взаимностью, в данном случае, означало бы нечто весьма далекое от уважения). Я не о себе говорю, о человеческой природе. Удачи. ;)

Vov123 писал(а):Попробуйте воспользоваться рекомендациями.
Что-то не похоже, что эти страницы посвящены именно Tiny2313-му - таблица делителей неверная, формат регистра управления тоже неверный. Прескейлер там не трех-, а четырехбитный, начинается не с 16K, а с 2K, а заканчивается не 2048K, а 1024K. В регистре управления биты с 7 по 5 не заререзервированы, как утверждается в книге, а содержат биты WDIE, WDIF и старший бит делителя.
Скорее всего, и во всем остальном соответствия Tiny2313 ожидать не следует - если окажется, что предложенные страницы действительно выдаются за описание Tiny2313, то в топку такую книгу, ибо это не учебник, а коллекция граблей.

Вс май 24, 2009 17:41:29

Автору вопроса
Вот вам проектик с wdt и протом.Можете поиграться.При нажатии на кнопку загораются выходы порта PORTB и гаснут соответственно после срабатывания wdt.Потом удаляете в программе "настройка wdt" и наблюдаете,что при единственном нажатии кнопки выводы порта горят постоянно.Или введите команду wdr,вот так
main:
wdr
sbic PIND,0
rjmp main
ldi temp,0xff
out PORTB,temp
rjmp main
Также можете изменять прескалер wdt,при этом время горения порта PORTB также изменяется.
Дальше,наверное,сами разберётесь.
Вложения
wdt_asm.rar
(26.31 KiB) Скачиваний: 364
Последний раз редактировалось Vov123 Вс май 24, 2009 18:05:52, всего редактировалось 1 раз.

Вс май 24, 2009 18:05:06

Yellow Tiger писал(а):Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг. :)))

Можешь посоветовать на чем тогда тестировать?Вчера запустил программу на выполнение, ждал 20 мин результат также отсутствует.

Вс май 24, 2009 18:16:23

Vov123 писал(а):Автору вопроса
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
Страница была 381 :) А насчет того что там отключение,так я знаю это.В моем коде устанавливается бит WDIE.

Вс май 24, 2009 22:17:18

Nolk писал(а):Можешь посоветовать на чем тогда тестировать?
Чтобы совсем без глюков? На Tiny2313. :))) Не видел еще ни одного безглючного эмулятора - вечно народ обсуждает минное поле их багов, где/что/как обходить стороной, потому ими и не пользуюсь - нет времени на изучение эмулятора ради изучения эмулятора - сначала пользовался, а когда увидел, что порой даже простейшие вещи не работают в эмуляторе, разочаровался и бросил. Что-то мелкое и нетребовательное посмотреть/прикинуть м.б. и можно еще, но даже в этом случае - сам видишь, что получается. Мне важнее сэкономить время, чем выяснять, с чьим глюком я имею дело.

Сб май 30, 2009 01:17:39

Симуляция watchdog для данного МК (именно переход на прерывание, сброс я думаю работает как надо) скорее всего не поддерживается AVR Studio.

Сб май 30, 2009 12:50:36

А как понимать слова "скорее всего" - как результат личного опыта, как цитату из некоей доки, о которой мы не знаем, или как-то иначе?
Ответить