Зарегистрирован: Пт май 22, 2009 09:49:20 Сообщений: 7
Рейтинг сообщения:0
Здравствуйте.Я пробую реализовать работу охранного таймера в режиме прерывания.Вроде бы и бит WDIE установлен и прерывания разрешены,но они не происходят.Может есть у кого нибудь исходник на асме показывающий работу wdt ?
Зарегистрирован: Пт май 22, 2009 09:49:20 Сообщений: 7
Рейтинг сообщения:0
Vov123 писал(а):
Чего-то в вашем сообщении ничего не сказано об установленом fuse - wdton
Насколько я понял из книги (читаю Белова) wdton надо устанавливать в том случае,если нужно чтобы охранный таймер запускался автоматически,я его хочу запустить уже в процессе работы.
wdt включается fus-ом,включить его без программатора не получится.
Там к книге идёт диск,на диске fuse-calculator,к каждому fuse короткий коментарий:
" Сторожевой таймер предназначен для вывода микроконтроллера из режима "зависания". Прежде чем включать таймер, необходимо предусмотреть в вашей программе специальные команды работающие с ним. Подробнее смотрите в документации."
Не понятно,если вы читаете Белова,зачем спрашиваете.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Зарегистрирован: Пт май 22, 2009 09:49:20 Сообщений: 7
Рейтинг сообщения:0
Yellow Tiger писал(а):
Хм, код взят из ДШ, значит нужно копать в другом направлении. А как ты пришел к выводу, что прерываний нет?
Проверял работу на AVR Studio.По прерыванию управление должно было передатся на определенную метку.Кстати если не трудно поясни
с каким регистром работает команда wdr,а то про нее написано "сброс сторожевого таймера" и все. Опять же AVR Studio на нее никак не реагирует.
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
Ну так может ты просто не дождался прерывания? При симуляции масштаб времени другой. Ни в каком регистре следов от 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 ; но пишем неизмененную величину
Это не его инициализация - это Атмела, срочно сообщи им! ...
Это пример остановки WD таймера, а не инициализации. Инициализация или запуск его, страницей ниже. И, пожалуйста, не надо обращаться ко мне на ты.
Однако... у атмела в ДШ реально есть строка
Код:
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. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
Автору вопроса
Понятно,пример вы скопировали с книги со стр 361.
Но ведь там написано-пример процедуры отключения сторожевого таймера
http://cadzone.ru/content/view/845/33/ Немного не понятно,ведь в 2313 нет регистра TWDCR,а есть TWDCSR.
Попробуйте воспользоваться рекомендациями.
Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг.
asteroid7 писал(а):
Это пример остановки WD таймера, а не инициализации.
Это просто пример, а применяя его на практике, программист подставляет в него единичку или нолик - как ему нужно в его конкретном случае - было бы странно со стороны Атмела приводить дважды один фрагмент кода с отличием в одном бите.
asteroid7 писал(а):
Однако... у атмела в ДШ реально есть строка
Код:
andi r16, (0xff & (0<<WDRF))
Никогда на неё не обращал внимания... Проверил в "студио" - выражение считается как ноль.
Возможно, их ассемблер правильно понимает такие штуки.
asteroid7 писал(а):
3. Вы процитировали не весь код. Сначала разрешаем, потом запускаем. Это два обращения к регистру.
Я просто неверно сосчитал, где заканчиваются четыре такта. Странно, вроде бы еще не поздно было.
P.S.
asteroid7 писал(а):
И, пожалуйста, не надо обращаться ко мне на ты.
Этого не нужно добиваться, это должно происходить само-собой - на основе взаимности; но после таких вот экзерсисов:
asteroid7 писал(а):
Ваша инициализация - полный бред.
это бывает очень затруднено (ибо ответить взаимностью, в данном случае, означало бы нечто весьма далекое от уважения). Я не о себе говорю, о человеческой природе. Удачи.
Vov123 писал(а):
Попробуйте воспользоваться рекомендациями.
Что-то не похоже, что эти страницы посвящены именно Tiny2313-му - таблица делителей неверная, формат регистра управления тоже неверный. Прескейлер там не трех-, а четырехбитный, начинается не с 16K, а с 2K, а заканчивается не 2048K, а 1024K. В регистре управления биты с 7 по 5 не заререзервированы, как утверждается в книге, а содержат биты WDIE, WDIF и старший бит делителя.
Скорее всего, и во всем остальном соответствия Tiny2313 ожидать не следует - если окажется, что предложенные страницы действительно выдаются за описание Tiny2313, то в топку такую книгу, ибо это не учебник, а коллекция граблей.
Автору вопроса
Вот вам проектик с wdt и протом.Можете поиграться.При нажатии на кнопку загораются выходы порта PORTB и гаснут соответственно после срабатывания wdt.Потом удаляете в программе "настройка wdt" и наблюдаете,что при единственном нажатии кнопки выводы порта горят постоянно.Или введите команду wdr,вот так
main:
wdr
sbic PIND,0
rjmp main
ldi temp,0xff
out PORTB,temp
rjmp main
Также можете изменять прескалер wdt,при этом время горения порта PORTB также изменяется.
Дальше,наверное,сами разберётесь.
Зарегистрирован: Пт май 22, 2009 09:49:20 Сообщений: 7
Рейтинг сообщения:0
Yellow Tiger писал(а):
Nolk, я вчера погонял студию с примером - она действительно не вызывает прерывания. Я ей не пользуюсь, потому не стану утверждать, но есть подозрение, что она имеет в этом разделе эмуляции конкретный баг.
Можешь посоветовать на чем тогда тестировать?Вчера запустил программу на выполнение, ждал 20 мин результат также отсутствует.
Чтобы совсем без глюков? На Tiny2313. Не видел еще ни одного безглючного эмулятора - вечно народ обсуждает минное поле их багов, где/что/как обходить стороной, потому ими и не пользуюсь - нет времени на изучение эмулятора ради изучения эмулятора - сначала пользовался, а когда увидел, что порой даже простейшие вещи не работают в эмуляторе, разочаровался и бросил. Что-то мелкое и нетребовательное посмотреть/прикинуть м.б. и можно еще, но даже в этом случае - сам видишь, что получается. Мне важнее сэкономить время, чем выяснять, с чьим глюком я имею дело.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения