работа wdt в Attiny2313
работа wdt в Attiny2313
Здравствуйте.Я пробую реализовать работу охранного таймера в режиме прерывания.Вроде бы и бит WDIE установлен и прерывания разрешены,но они не происходят.Может есть у кого нибудь исходник на асме показывающий работу wdt ?
wdt включается fus-ом,включить его без программатора не получится.
Там к книге идёт диск,на диске fuse-calculator,к каждому fuse короткий коментарий:
" Сторожевой таймер предназначен для вывода микроконтроллера из режима "зависания". Прежде чем включать таймер, необходимо предусмотреть в вашей программе специальные команды работающие с ним. Подробнее смотрите в документации."
Не понятно,если вы читаете Белова,зачем спрашиваете.
Там к книге идёт диск,на диске fuse-calculator,к каждому fuse короткий коментарий:
" Сторожевой таймер предназначен для вывода микроконтроллера из режима "зависания". Прежде чем включать таймер, необходимо предусмотреть в вашей программе специальные команды работающие с ним. Подробнее смотрите в документации."
Не понятно,если вы читаете Белова,зачем спрашиваете.
Vov123 писал(а):"
Не понятно,если вы читаете Белова,зачем спрашиваете.
Затем,что после прочтения книги я так и не смог добится нормальной работы охранного таймера. И видимо исходников ни у кого нет
Если вы правы и нужно установить wdton то получается что я не смогу увидеть работу таймера через AVR Studio?
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
а каким кодом запускаешь таймер-то?
Вот этим.
Код: Выделить всё
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 писал(а):Хм, код взят из ДШ, значит нужно копать в другом направлении. А как ты пришел к выводу, что прерываний нет?
Проверял работу на AVR Studio.По прерыванию управление должно было передатся на определенную метку.Кстати если не трудно поясни
с каким регистром работает команда wdr,а то про нее написано "сброс сторожевого таймера" и все. Опять же AVR Studio на нее никак не реагирует.
Nolk
Ваша инициализация - полный бред.
А где у вас вообще запуск дога?
Вот эта строчка бессмыслена
Если хотите сбросить бит, то
Насчёт WD.
Как я понял, вы делаете режим "Прерывание потом сброс".
Желательно одной командой устанавливать и WDE и WDIE. Не помешает сбросить флаг прерывания.
Ваша инициализация - полный бред.
А где у вас вообще запуск дога?
Вот эта строчка бессмыслена
Код: Выделить всё
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
Ну так может ты просто не дождался прерывания? При симуляции масштаб времени другой.Nolk писал(а):Проверял работу на AVR Studio.
Ни в каком регистре следов от WDR нет, эта инструкция попросту сбрасывает внутренний счетчик, по переполнению которого и производится сброс или вызов прерывания от WDT. Попробуй выставить самый мелкий прескейлер (WDP0..3 = 0), поставь точку останова в процедуре прерывания по WDT и затем дооолго жди, когда произойдет останов - частота встроенного генератора у WDT всего 128кГц, представляешь сколько тактов CPU должно пройти на один его такт? А ведь самый маленький прескейл у WDT равен 2048 тактов!
Кстати, может быть время ожидания удастся сократить, наврав Студии - скажи ей, что тактовая у твоего CPU маленькая.
На всякий случай спрошу - а ты wdr как часто вызываешь? Если вот так:
Код: Выделить всё
void main()
{
while (1){
wdr();
}
}Это не его инициализация - это Атмела, срочно сообщи им! А-то, дурят народ своими байками (ДШ ревизии 2543-I-AVR-04/06, стр.43):asteroid7 писал(а):Nolk Ваша инициализация - полный бред.

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 ; но пишем неизмененную величинуЭто пример остановки WD таймера, а не инициализации. Инициализация или запуск его, страницей ниже. И, пожалуйста, не надо обращаться ко мне на ты.Yellow Tiger писал(а):Это не его инициализация - это Атмела, срочно сообщи им! ...
Однако... у атмела в ДШ реально есть строка
Код: Выделить всё
andi r16, (0xff & (0<<WDRF))Код: Выделить всё
andi r16, 0Yellow 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. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
Автору вопроса
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
http://cadzone.ru/content/view/845/33/
Немного не понятно,ведь в 2313 нет регистра TWDCR,а есть TWDCSR.
Попробуйте воспользоваться рекомендациями.
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
http://cadzone.ru/content/view/845/33/
Немного не понятно,ведь в 2313 нет регистра TWDCR,а есть TWDCSR.
Попробуйте воспользоваться рекомендациями.
- Вложения
-
- p0051.gif
- (130.86 КБ) 745 скачиваний
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг.

P.S.

Скорее всего, и во всем остальном соответствия Tiny2313 ожидать не следует - если окажется, что предложенные страницы действительно выдаются за описание Tiny2313, то в топку такую книгу, ибо это не учебник, а коллекция граблей.
Это просто пример, а применяя его на практике, программист подставляет в него единичку или нолик - как ему нужно в его конкретном случае - было бы странно со стороны Атмела приводить дважды один фрагмент кода с отличием в одном бите.asteroid7 писал(а):Это пример остановки WD таймера, а не инициализации.
Возможно, их ассемблер правильно понимает такие штуки.asteroid7 писал(а):Однако... у атмела в ДШ реально есть строка
Никогда на неё не обращал внимания... Проверил в "студио" - выражение считается как ноль.Код: Выделить всё
andi r16, (0xff & (0<<WDRF))
Я просто неверно сосчитал, где заканчиваются четыре такта. Странно, вроде бы еще не поздно было.asteroid7 писал(а):3. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
P.S.
Этого не нужно добиваться, это должно происходить само-собой - на основе взаимности; но после таких вот экзерсисов:asteroid7 писал(а):И, пожалуйста, не надо обращаться ко мне на ты.
это бывает очень затруднено (ибо ответить взаимностью, в данном случае, означало бы нечто весьма далекое от уважения). Я не о себе говорю, о человеческой природе. Удачи.asteroid7 писал(а):Ваша инициализация - полный бред.
Что-то не похоже, что эти страницы посвящены именно Tiny2313-му - таблица делителей неверная, формат регистра управления тоже неверный. Прескейлер там не трех-, а четырехбитный, начинается не с 16K, а с 2K, а заканчивается не 2048K, а 1024K. В регистре управления биты с 7 по 5 не заререзервированы, как утверждается в книге, а содержат биты WDIE, WDIF и старший бит делителя.Vov123 писал(а):Попробуйте воспользоваться рекомендациями.
Скорее всего, и во всем остальном соответствия Tiny2313 ожидать не следует - если окажется, что предложенные страницы действительно выдаются за описание Tiny2313, то в топку такую книгу, ибо это не учебник, а коллекция граблей.
Автору вопроса
Вот вам проектик с wdt и протом.Можете поиграться.При нажатии на кнопку загораются выходы порта PORTB и гаснут соответственно после срабатывания wdt.Потом удаляете в программе "настройка wdt" и наблюдаете,что при единственном нажатии кнопки выводы порта горят постоянно.Или введите команду wdr,вот так
main:
wdr
sbic PIND,0
rjmp main
ldi temp,0xff
out PORTB,temp
rjmp main
Также можете изменять прескалер wdt,при этом время горения порта PORTB также изменяется.
Дальше,наверное,сами разберётесь.
Вот вам проектик с 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 раз.
Yellow Tiger писал(а):Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг.
Можешь посоветовать на чем тогда тестировать?Вчера запустил программу на выполнение, ждал 20 мин результат также отсутствует.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Чтобы совсем без глюков? На Tiny2313.Nolk писал(а):Можешь посоветовать на чем тогда тестировать?
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17