работа wdt в Attiny2313
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Словами "скорее всего" не намекают, а высказывают предположение.

Автору вопроса предложи - ему будет в тему, а я уже говорил, что студией попросту не пользуюсь - перевести?asteroid7 писал(а):The Watchdog is not simulated. Перевести?

- simpleX
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Сб май 30, 2009 00:51:42
- Откуда: Россия, г. Курск
- Контактная информация:
Yellow Tiger писал(а):А как понимать слова "скорее всего" - как результат личного опыта, как цитату из некоей доки, о которой мы не знаем, или как-то иначе?
Как результат личного опыта (в AVR Studio). После нашел в хелпе иформацию об этом. "Скорее всего" было сказано на тот случай, если вам вдруг всё-таки удалось несмотря ни на что заставить IDE генерировать прерывания WDT =)
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Re: работа wdt в Attiny2313
Для всех, кто ещё столкнётся с подобным.
При написании программы в CodeVisionAVR с использованием WDT
НЕ РЕКОМЕНДУЕТСЯ ПРИМЕНЯТЬ функции delay_ms или delay_us
встроенной библиотеки delay.h, поскольку в них имеется команда "wdr" сброса WD таймера.
Сам недавно наступил на эти "грабли" и благодарен a_skr за подсказку.
При написании программы в CodeVisionAVR с использованием WDT
НЕ РЕКОМЕНДУЕТСЯ ПРИМЕНЯТЬ функции delay_ms или delay_us
встроенной библиотеки delay.h, поскольку в них имеется команда "wdr" сброса WD таймера.
Сам недавно наступил на эти "грабли" и благодарен a_skr за подсказку.
Re: работа wdt в Attiny2313
уточню, что применять задержки не то, чтобы не рекомендуется, а:
1. если WDT используется по своему прямому назначению - для защиты от зависаний, - то можно.
2. если WDT используется как генератор периодических прерываний, - то нужно иметь ввиду, что прерывания вы не получите пока выполняются функции задержек. а так ничего не мешает, если задержки используются относительно редко и прерываниями на эти моменты можно пожертвовать.
все вышесказанное относится только к CodeVisionAVR.
- Rimsky
- Грызет канифоль
- Сообщения: 299
- Зарегистрирован: Вт июн 15, 2010 07:16:42
- Откуда: Иркутск
- Контактная информация:
Re: работа wdt в Attiny2313
// инициализация WDT
//----------
void wdt_init(void)
{
wdr();
WDTCSR = (1<<WDCE)|(1<<WDE);
WDTCSR = (1<<WDE)|(1<<WDP1)|(1<<WDP0); // 0,125 Sec
}
//----------
void wdt_init(void)
{
wdr();
WDTCSR = (1<<WDCE)|(1<<WDE);
WDTCSR = (1<<WDE)|(1<<WDP1)|(1<<WDP0); // 0,125 Sec
}
Re: работа wdt в Attiny2313
ELcat писал(а):Для всех, кто ещё столкнётся с подобным.
При написании программы в CodeVisionAVR с использованием WDT
НЕ РЕКОМЕНДУЕТСЯ ПРИМЕНЯТЬ функции delay_ms или delay_us
встроенной библиотеки delay.h, поскольку в них имеется команда "wdr" сброса WD таймера.
Сам недавно наступил на эти "грабли" и благодарен a_skr за подсказку.
Блин а я столько с wdt на tiny2313 промучился ,оказывается вот где засада.Кто знает,можно библиотеку cvavr подправить?
Re: работа wdt в Attiny2313
Подправить-то можно, да стоит ли? Правильнее всего задержки формировать при помощи таймеров. В моём случае WDT понадобился для вывода МК из "спячки", т.к. разрабатываемое устройство питается от батареи и для экономии энергии МК должен будет периодически "пробуждаться", опрашивать порты и заново уходить в "спячку". Лично мне сброс WDT в процедуре задержки даже наоборот кажется полезным - в рабочем цикле отпадает необходимость отключать WD.
Re: работа wdt в Attiny2313
Кто нибудь может дать нормальную инструкцию для начинающих, как включается WDT .
Как он сбрасывается. Желательно на С и для Atmel Studio (ибо есть нюансы с хидерами и самим языком С).
Моя проблема - отсчеты больших интервалов (до 180 мин). Были случаи зависания 2313.
Как он сбрасывается. Желательно на С и для Atmel Studio (ибо есть нюансы с хидерами и самим языком С).
Моя проблема - отсчеты больших интервалов (до 180 мин). Были случаи зависания 2313.
Re: работа wdt в Attiny2313
Точнее, чем даёт datasheet (стр.42) не сможет дать никто. У ATtiny2313 WD с четырьмя возможными режимами: отключён, только прерывание, только сброс и прерывание с последующим сбросом (по окончанию первого интервала выдаётся запрос на прерывание, по второму - сброс). Максимально возможный интервал отсчёта - 8 секунд. Управляющий регистр один - WDTCSR. Именно он задаёт режим работы и временной интервал WD таймера. Будьте внимательны, некоторые операции с данным регистром требуют двух обращений (в первом необходимо установить бит разрешения изменений WDCE). Кроме того можно включить WD таймер соответствующим битом в поле фуз-битов.
Сброс WD таймера для всех компиляторов Си одинаков и выглядит как ассемблерная вставка с командой:
Пример инициализации WD Тини2313 для CV AVR (период срабатывания 8с, прерывание разрешено):
Так же следует учесть, что в случае с двойным срабатыванием (прерывание затем сброс), после первого срабатывания WD аппаратно сбрасывается бит разрешения прерываний WDIE регистра WDTCSR. Поэтому в обработчике прерываний WD необходимо предусмотреть команду восстановления данного бита, если и последующие срабатывания по задумке должны сопровождаться прерыванием, а не сбросом.
Ну а вообще, зависания столь простых микроконтроллеров, как Тини2313 могут быть обусловлены лишь плохой схемотехникой/разводкой печатной платы в условиях ЭМ помех с повышенной напряжённостью или наличием бага в вашем коде (например, ожидание какого-нибудь заведомо не происходящего события).
Сброс WD таймера для всех компиляторов Си одинаков и выглядит как ассемблерная вставка с командой:
Код: Выделить всё
#asm("wdr")Пример инициализации WD Тини2313 для CV AVR (период срабатывания 8с, прерывание разрешено):
Код: Выделить всё
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: On
#pragma optsize-
WDTCR=0x39;
WDTCR=0x69;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endifТак же следует учесть, что в случае с двойным срабатыванием (прерывание затем сброс), после первого срабатывания WD аппаратно сбрасывается бит разрешения прерываний WDIE регистра WDTCSR. Поэтому в обработчике прерываний WD необходимо предусмотреть команду восстановления данного бита, если и последующие срабатывания по задумке должны сопровождаться прерыванием, а не сбросом.
Ну а вообще, зависания столь простых микроконтроллеров, как Тини2313 могут быть обусловлены лишь плохой схемотехникой/разводкой печатной платы в условиях ЭМ помех с повышенной напряжённостью или наличием бага в вашем коде (например, ожидание какого-нибудь заведомо не происходящего события).
Re: работа wdt в Attiny2313
Спасибо за ответ.
Со схемотехникой - все в порядке. А вот с помехами - проблема. Изделие стоит в щите, где много импульсных БП и разных пускателей и реле.
Так что есть 100% уверенность в причине сбоев - помехи.
Со схемотехникой - все в порядке. А вот с помехами - проблема. Изделие стоит в щите, где много импульсных БП и разных пускателей и реле.
Так что есть 100% уверенность в причине сбоев - помехи.
Re: работа wdt в Attiny2313
Это взаимоисключающие явления. Если со схемотехникой и платой всё ок, то никакие помехи ей не страшны. Если причина зависаний не код, а именно помехи, то со схемотехникой и конструкцией платы не в порядке.v_vovchek писал(а):Со схемотехникой - все в порядке...Так что есть 100% уверенность в причине сбоев - помехи.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: работа wdt в Attiny2313
Добрый вечер. Столкнулся с проблемкой. Необходимо запустить на ATiny84 сторожевой таймер в режиме "только прерывание". На ATiny85 получилось, а на ATiny84 никак не получается. Reset получался. Так вот и прыгаю с камешка на камешек. В этом контексте изучаю возможность применения WDT как альтернативу классическим таймерам Timer0/Timer1. Напр. обработать некоторые значения и каждые 8 сек. отправлять на индикатор.
Спойлер
Код: Выделить всё
/* ATtiny 85/84, Atmel Studio 7 */
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <util/atomic.h>
#include "tm1637(6).h"
volatile uint32_t n = 0;
ISR(WDT_vect){
n++;
led_digit(n);
}
int main(void){
serial_init();
led_digit(123456);// Test tm1637
// только прерывание
#if (__AVR_ATtiny85__)
// WDTCR – Watchdog Timer Control Register
WDTCR |= (1<<WDCE)|(1<<WDE);
WDTCR = (1<<WDIF)|(1<<WDIE)|
(1<<WDP2)|(1<<WDP1);// 1 Sec;
#endif
#if (__AVR_ATtiny84__)
// WDTCSR – Watchdog Timer Control and Status Register
WDTCSR |= (1<<WDCE)|(1<<WDE);
WDTCSR = (1<<WDIF)|(1<<WDIE)|
(1<<WDP2)|(1<<WDP1);// 1 Sec
#endif
_delay_ms(10);
sei();
while (1) { }
}
/*
//WDP3 - WDP2 - WPD1 - WDP0 - time
// 0 0 0 0 16 ms
// 0 0 0 1 32 ms
// 0 0 1 0 64 ms
// 0 0 1 1 0.125 s
// 0 1 0 0 0.25 s
// 0 1 0 1 0.5 s
// 0 1 1 0 1.0 s
// 0 1 1 1 2.0 s
// 1 0 0 0 4.0 s
// 1 0 0 1 8.0 s
*/
/*
Вы можете использовать сторожевой таймер только в режиме прерывания
(без сброса устройства), включив WDIE, а не WDE. Увеличьте (непостоянный)
счетчик в подпрограмме обслуживания прерывания,
и вы можете увеличить период таймера на все, что захотите.
*/
/*
WDE WDIE Watchdog Timer State Action on Time-out
0 0 Stopped None
0 1 Running Interrupt
1 0 Running Reset
1 1 Running Interrupt
*/
/*
Bit 3 – WDE: Watchdog Enable
Если WDE установлен, WDIE автоматически очищается
аппаратно при истечении времени ожидания. Это полезно
для обеспечения безопасности сброса сторожевого таймера
при использовании прерывания. После сброса бита WDIE
следующий тайм-аут приведет к сбросу.
Чтобы избежать сброса сторожевого таймера, WDIE должен
устанавливаться после каждого прерывания.
*/
/*
Bit 4 – WDCE: Watchdog Change Enable
Этот бит должен быть установлен, когда бит WDE записывается в логический ноль.
В противном случае сторожевой таймер не будет отключен. Однажды написано в
логическая единица, аппаратное обеспечение сбросит этот бит после четырех тактов.
См. Описание бита WDE для отключения сторожевого таймера.
процедура. Этот бит также должен быть установлен при изменении
битов предварительного делителя.
*/
// ATOMIC_BLOCK(ATOMIC_RESTORESTATE){}
- Вложения
-
- counter_WDT.gif
- Картинка в протеусе
- (58.56 КБ) 101 скачивание
Re: работа wdt в Attiny2313
Эйлер Леонард, или уберите строчку "WDTCSR |= (1<<WDCE)|(1<<WDE);", если вам только прерывание нужно, либо в прерывании каждый раз поднимайте WDIE назад: "WDTCSR |= (1<<WDIE)". Потому что в ДШ написано, что если WDE и WDIE выставлены одновременно, то при первом срабатывании таймера и переходе в прерывание, флаг WDIE снимается аппаратно и след. таймаут вызовет уже сброс, а не прерывание. У вас даже в комментарии это написано. Странно что цифры до 4 успевают дойти только в протеусе...
PS: Выводить цифры в прерывании не очень хорошо. Лучше led_digit вызывайте из основного цикла, в прерывании только инкрементируйте n.
PS: Выводить цифры в прерывании не очень хорошо. Лучше led_digit вызывайте из основного цикла, в прерывании только инкрементируйте n.
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: работа wdt в Attiny2313
NStorm, Благодарю за отклик. Приручить пёсика пока не удалось, не столь актуально. А Ваша рекомендация не размещать в прерываниях всякие индикаторы и телевизоры - это дело. (не скрою, есть такой грех). Пойду лучше повытряхиваю всё во while(1){
}
Re: работа wdt в Attiny2313
Почему не хорошо? На MSP430 вся работа организуется в прерываниях, ибо там это проще всего из-за организации аппаратной машины состояний.Выводить цифры в прерывании не очень хорошо.
Именно так. При входе в обработчик прерывания бит WDIE сбрасывается.поднимайте WDIE назад