плохо читал. есть регистр SFIOR, там есть биты для сброса предделителей таймеров. если сомневаешься, что после подачи питания предделители в нуле, сбрось их самостоятельно.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Уточню, для получения интервала 1 секунда, задавать нужно OCR1A = 62500-1, иначе интервал будет на 256 тактов длиннее. viewtopic.php?p=4222274#p4222274
Из других систем и языков мне осталос правило: в начале, по возможности: все с первоначальным установлением. Как в случае и с используем Таймер_х: в начальном состоянии все регистры.
Да, пожалуй, хороший совет, на корифеев надейся, а сам не плошай. Написал следующую программу. На выводе PB0 весит светодиод. Идея заключается в следующем. Программа инициализирует таймер 0, подключая его к предделителю на 1024, затем выжидает 768 (с хвостиком) тактов и читает значение счётчика этого таймера. Если значение отлично от нуля, то светодиод на PB0 выключается. Смысл в том, чтобы загрузить эту программу в МК и периодически делать reset. Если предделитель аппаратно не сбрасывается, то хотя бы иногда за 3/4 периода он будет выдавать импульс на таймер 0 за счёт того, что его содержимое было отлично от нуля в начале работы МК. Поэтому светодиод иногда будет гаснуть. Если же он аппаратно сбрасывается, то содержимое счётчика таймера в момент чтения программой будет 0 всегда, светодиод будет гореть всегда.
Код:
.include"m8def.inc"
;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-== ; Инициализация периферии МК ; Настройка портов ввода-вывода ldi r16, 0xFF ; На входах -- подтяжка out PORTB, r16 out PORTD, r16 out PORTC, r16 ldi r16, 0x01 ; PB0 -- выход, остальные биты out DDRB, r16 ; порта B -- входы clr r16 ; Порты C и D -- входы out DDRC, r16 out DDRD, r16 ; Настройка таймера 0 clr r16 out TCNT0, r16 ldi r16, 0x05 ; Предделитель 1024 out TCCR0, r16 ;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-== ; Основная программа ; Выжидание 768 тактов clr r16 pauseLoop: dec r16 brne pauseLoop ; Проверка содержимого счётчика таймера 0 in r16, TCNT0 tst r16 breq finalLoop ; Если счётчик отличен от нуля, сброс пина PB0 в ноль ldi r16, 0xFE out PORTB, r16 ; Конец программы finalLoop: rjmp finalLoop ;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
Результат эксперимента: светодиод горит всегда. Конечно, если я ОЧЕНЬ несчастливый человек, и мне жутко не везёт КАЖДЫЙ раз, то это ничего не значит. В противном случае с вероятностью экспоненциально стремящейся к 100%, предделитель таймеров аппаратно сбрасывается при хардовом ресэте. Вопрос решён, всем спасибо за дискуссию!
П.С. Пожелание разрабам: пишите в документацию все подробности работы вашего устройства!
Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Вт сен 27, 2011 07:28:44 Сообщений: 46 Откуда: Москва
Рейтинг сообщения:0
Господа коты, помогите разобраться с формированием интервалов. Я использую WDT-таймер настроенный на интервал 16мс. В прерывании таймера я инкрементирую 8-и битную переменную.
1. Без явного указания беззнаковости интервала (10U) оно не работает, почему так? Со всякими millis()'ами ведь работает? 2. Экономлю память, поэтому все переменные uint8_t, соотв. ловлю переполнение и происходит "дрыг". Как сделать, чтобы переполнение было пофиг? Самого диапазона интервалов при 1 тике раз в 16мс мне хватает, разобраться бы с переполнением. Я подсмотрел вот такой код у Гайвера, он работает, но значение интервала желательно выбрать кратным степени двойки, т.к. используется деление, а это не всегда возможно...
внутри обработчика прерывания не нужно использовать ATOMIC_BLOCK, поскольку обработчик прерывания уже "атомно" исполняется по отношению к остальному коду.
поскольку я не помню (и не собираюсь запоминать) приоритеты операций, рекомендую взять разность в скобки
Код:
if ((systime - tmr1) >= 10U)
влияние U может быть в том, что по умолчанию все результаты и константы имеют тип int, т.е. со знаком, а вам знак не нужен...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 3
Рейтинг сообщений: 0
Зарегистрирован: Вт сен 27, 2011 07:28:44 Сообщений: 46 Откуда: Москва
Рейтинг сообщения:0
Со скобками полезный совет, спасибо! Т.к. у меня тоже приоритеты не запоминаются, всегда подглядываю в таблицу. В общем с этим U непонятно, у меня переменная таймера и переменная "подтаймера" строго uint8_t. Значит минус туда не запихнешь. Но интересно другое! Если используется промежуточная переменная или счет времени обернуть в функцию, то тогда явное указание беззнаковости не нужно. Например:
Подозреваю эффект открытия новых чудес, когда плохо читал документацию... Но что-то я упускаю. И еще про этот кусок кода, он корректно отрабатывает переполнение щ0ччика, интервалы все ровные, но смущает вот что: Изначально было так:
Код:
tmr1 += 8 * (timeLeft / 8);
Я на бумажке посчитал, результат такой же, как если бы просто значение этой переменной прибавить к tmr1. Зачем тут эти выкрутасы с делением и умножением?
я думаю, вы просто взяли за основу обучения код такого же, как вы, начинающего. т.е. того, кто "так работает - ну и ладно!". нельзя учиться на коде "от гуру" и на коде от "начинающего", надо учиться на коде опытного, но но не настолько, чтобы свободно применять конструкции типа
Код:
v = {1,2,3,4}[i > 0 ? 17 ^ b * *с[x]++ : 136 / '\012'];
но уже отказавшегося от конструкций типа
Код:
if(x == 0) y = 'a'; else if(x == 1) y = 'b'; else if(x == 2) у = 'c';
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зачем вы употребляете термины, значение которых не знаете? Есть же стандарт. Читаем 6.3.1.1 и обнаруживаем, что может быть как int, так и unsigned int. Что примеры по моей ссылке и подтверждают.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения