работа wdt в Attiny2313

Обсуждаем контроллеры компании Atmel.
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

работа wdt в Attiny2313

Сообщение Nolk »

Здравствуйте.Я пробую реализовать работу охранного таймера в режиме прерывания.Вроде бы и бит WDIE установлен и прерывания разрешены,но они не происходят.Может есть у кого нибудь исходник на асме показывающий работу wdt ?
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Чего-то в вашем сообщении ничего не сказано об установленом fuse - wdton
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

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

Насколько я понял из книги (читаю Белова) wdton надо устанавливать в том случае,если нужно чтобы охранный таймер запускался автоматически,я его хочу запустить уже в процессе работы.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

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

Не понятно,если вы читаете Белова,зачем спрашиваете.
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

Vov123 писал(а):"

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

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

Если вы правы и нужно установить wdton то получается что я не смогу увидеть работу таймера через AVR Studio?
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Nolk писал(а):Насколько я понял из книги (читаю Белова) wdton надо устанавливать в том случае,если нужно чтобы охранный таймер запускался автоматически,...
Именно так и есть (не слушай никого), а каким кодом запускаешь таймер-то?
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

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

Вот этим.

Код: Выделить всё

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
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Хм, код взят из ДШ, значит нужно копать в другом направлении. А как ты пришел к выводу, что прерываний нет?
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

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

Проверял работу на AVR Studio.По прерыванию управление должно было передатся на определенную метку.Кстати если не трудно поясни
с каким регистром работает команда wdr,а то про нее написано "сброс сторожевого таймера" и все. Опять же AVR Studio на нее никак не реагирует.
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

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
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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    ; но пишем неизмененную величину
Аватара пользователя
asteroid7
Опытный кот
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

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. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Автору вопроса
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
http://cadzone.ru/content/view/845/33/
Немного не понятно,ведь в 2313 нет регистра TWDCR,а есть TWDCSR.
Попробуйте воспользоваться рекомендациями.
Вложения
p0051.gif
(130.86 КБ) 745 скачиваний
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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, то в топку такую книгу, ибо это не учебник, а коллекция граблей.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Автору вопроса
Вот вам проектик с 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 КБ) 380 скачиваний
Последний раз редактировалось Vov123 Вс май 24, 2009 18:05:52, всего редактировалось 1 раз.
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

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

Можешь посоветовать на чем тогда тестировать?Вчера запустил программу на выполнение, ждал 20 мин результат также отсутствует.
Nolk
Родился
Сообщения: 7
Зарегистрирован: Пт май 22, 2009 09:49:20

Сообщение Nolk »

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

Сообщение Yellow Tiger »

Nolk писал(а):Можешь посоветовать на чем тогда тестировать?
Чтобы совсем без глюков? На Tiny2313. :))) Не видел еще ни одного безглючного эмулятора - вечно народ обсуждает минное поле их багов, где/что/как обходить стороной, потому ими и не пользуюсь - нет времени на изучение эмулятора ради изучения эмулятора - сначала пользовался, а когда увидел, что порой даже простейшие вещи не работают в эмуляторе, разочаровался и бросил. Что-то мелкое и нетребовательное посмотреть/прикинуть м.б. и можно еще, но даже в этом случае - сам видишь, что получается. Мне важнее сэкономить время, чем выяснять, с чьим глюком я имею дело.
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Сообщение simpleX »

Симуляция watchdog для данного МК (именно переход на прерывание, сброс я думаю работает как надо) скорее всего не поддерживается AVR Studio.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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

Вернуться в «AVR»