Jump to content

    
Sign in to follow this  
ILSF15

Прошу подсказки по настройкам таймера Arduino Nano

Recommended Posts

Приветствую! Вопрос про Timer_1 в Arduino Nano на базе процессора ATMega 328P. Программирую в Arduino IDE.

Подскажите, пожалуйста, как правильно с помощью команд на C/C++ включить таймер и считывать с него миллисекунды внутри функции прерывания ISR(PCINTx_vect) (прерывание по пину), при этом чтобы он не переполнялся хотя бы секунд 30.

Стандартные функции языка Arduino ориентированы на работу со временем по прерываниям, мне же нужно, чтобы функция ISR(PCINTx_vect) оставалась активной всё время выполнения алгоритма, а в режиме сна отсчёт времени не нужен вообще. Функциями setup() и loop() не пользуюсь.

 

Предварительная версия программы организована также, но "отсчитывает" время по количеству выполненных циклов. Проблема в том, что в зависимости от условий алгоритм одного цикла состоит из разного количества операторов, что приводит к непредсказуемости времени работы, а время нужно точное. Предварительная версия работает вполне исправно, если закрыть глаза на то, что весь алгоритм может работать 5 секунд вместо 6 и наоборот. Идентичная (с поправкой на другие регистры, тактирующую частоту и предделители таймера) программа для MSP430 также исправно работает.

 

В функции main() - только отключение WatchDog, инициация пинов и переход в режим сна со следующими параметрами:

PRR |= 0xEF;       //  Отключение периферии для экономии энергии
SMCR |= 0x04;      //  Режим сна Power-down
while(1) {
  SMCR |= 0x01;    //  Разрешение режима сна
  asm("sleep");    //  Уход в режим сна
}

В функции прерывания по пину пытаюсь активировать таймер таким образом:

TCCR1B |= 0x05;   //  Выбор предделителя на 1024
PRR &= ~0x08;     //  Включение Timer_1

Текущее значение таймера в цикле получаю через timer = TCNT1; (timer переменная типа unsigned long, погрешность в пределах времени выполнения одного-двух циклов для моей задачи вполне допустима).

Перед завершением функции прерывания -  выключение таймера:

PRR |= 0x08;      //  Выключение Timer_1
TCNT1 = 0x00;     //  Сброс регистра отсчёта Timer_1

Согласно даташиту ATMega 328P, при таких настройках значение переменной timer в цикле должно приблизительно равняться количеству миллисекунд, прошедшему с момента включения таймера минус время, прошедшее с последнего присваивания: тактирующая частота 1Mhz, предделитель таймера на 1024, итого - около 977 прибавлений к регистру TCNT1 в секунду, переполнение чуть больше, чем через минуту.

 

По всей видимости, в реальности значение отличается, причём критически, т.к программа в лучшем случае работает не то время, которое ожидается, в худшем - вообще не срабатывает. 

Программатора нет, и я не умею (в общем-то новичок в теме) без него "подсмотреть" значения переменных, при этом проект одноразовый, поэтому о приобретении или сборке программатора речь не идёт. Возможно, кто-то может подсказать, что не так с настройками? Заранее спасибо.

Edited by ILSF15

Share this post


Link to post
Share on other sites
17 minutes ago, ILSF15 said:

Подскажите, пожалуйста, как правильно с помощью команд на C/C++ включить таймер и считывать с него миллисекунды внутри функции прерывания ISR(PCINTx_vect) (прерывание по пину), при этом чтобы он не переполнялся хотя бы секунд 30.

Таймер 1, если мне не изменяет память - 16-битный? Т.е. имеем 65535 отсчётов. Если разрядов таймер больше - это даже лучше. Делите тактовую частоту микроконтроллера на 2^N, где N-разрядность таймера, и находите ближайший делитель по даташиту. Записываете его в регистр конфигурации таймера.

19 minutes ago, ILSF15 said:

Стандартные функции языка Arduino

Используйте Си/Си++. Изучите работу с битами. Программируйте регистры таймера и прочей периферии напрямую. Ардуино - всего-лишь красивая обёртка, под которой скрывается банальная устаревшая "аврка" и комплятор, если мне не изменяет память, GCC.

21 minutes ago, ILSF15 said:

программа для MSP430 также исправно работает.

Не смешивайте в одной темы разные микроконтроллеры. Это ни о чём не говорит.

23 minutes ago, ILSF15 said:

Программатора нет, и я не умею (в общем-то новичок в теме) без него "подсмотреть" значения переменных, при этом проект одноразовый, поэтому о приобретении или сборке программатора речь не идёт.

Ну хоть заказали. Я ведь вам советовал ещё в начале месяца. 

 

25 minutes ago, ILSF15 said:

По всей видимости, в реальности значение отличается, причём критически, т.к программа в лучшем случае работает не то время, которое ожидается, в худшем - вообще не срабатывает.

Вообще, пишете вы очень несвязно. Сложно понять, что вам нужно. Напишите по пунктам, что должна делать ваша программа (только без вставки кусков кода). Затем, напишите что сделали вы и что получилось.

Share this post


Link to post
Share on other sites
29 minutes ago, haker_fox said:

Таймер 1, если мне не изменяет память - 16-битный? Т.е. имеем 65535 отсчётов. Если разрядов таймер больше - это даже лучше. Делите тактовую частоту микроконтроллера на 2^N, где N-разрядность таймера, и находите ближайший делитель по даташиту. Записываете его в регистр конфигурации таймера.

Именно это я и сделал, там куски кода приведены. Не работает.

29 minutes ago, haker_fox said:

Используйте Си/Си++. Изучите работу с битами. Программируйте регистры таймера и прочей периферии напрямую. Ардуино - всего-лишь красивая обёртка, под которой скрывается банальная устаревшая "аврка" и комплятор, если мне не изменяет память, GCC.

Именно это я и делаю, там куски кода приведены. Arduino IDE использую просто потому, что он С тоже компилирует, и при этом прошивает через USB.

29 minutes ago, haker_fox said:

Не смешивайте в одной темы разные микроконтроллеры. Это ни о чём не говорит.

Это по идее говорит о том, что сам алгоритм правильный, нэ?

29 minutes ago, haker_fox said:

Ну хоть заказали. Я ведь вам советовал ещё в начале месяца. 

Не заказали и не собираемся. Я помню, что вы советовали, но, как я сказал, проект одноразовый. А Arduino IDE прекрасно шьёт через USB. Debagger-а нет, это правда. Наткнулся на вродебыинструкцию, как брать через серийный порт значения переменных и выводить из программы на встроенный в IDE Serial monitor, но операторы вставил, а на этом мониторе как было пусто, так и осталось.

Нужна конкретика. Возможно, кто-то, кто это делал, и знает, КАК (не отладку. Настройку таймера)

20 minutes ago, ILSF15 said:

Делите тактовую частоту микроконтроллера на 2^N, где N-разрядность таймера

Стоп, что? К регистру отсчёта же должен прибавляться 1 на один такт тактирующей частоты, а не на Х тактов (в зависимости от разрядности), нет?!

UPD. А, понял! Нет, я же сказал, что меня не устраивает отсчёт по переполнениям. Это приводит к известной непредсказуемости. Я выбрал делитель, который по идее должен обеспечивать переполнение сильно позднее завершения алгоритма, а данные беру прямо из регистра отсчёта (с запуска прошло Х тактов таймера)

Edited by ILSF15

Share this post


Link to post
Share on other sites
22 minutes ago, ILSF15 said:

Именно это я и сделал, там куски кода приведены. Не работает.

Что вы подразумеваете под "не работает"? Таймер тикает?

24 minutes ago, ILSF15 said:

Именно это я и делаю, там куски кода приведены.

Не совсем. Писать "магические цифры" в регистры - быть самому себе злобным...

24 minutes ago, ILSF15 said:

Это по идее говорит о том, что сам алгоритм правильный, нэ?

Это ничего не говорит. Вы описание алгоритма не привели. Вернее, что-то там написали вам понятно, но человеку постороннему там ничего не ясно. Или ясно очень отдалённо, как с похмелья утром. Алгоритмы иногда сильно зависят от железа. Один и тот же код, перенесённый на другую платформу, даже с поправкой на регистры, может и не работать. Почему, догадайтесь сами. Если что, подскажу.

26 minutes ago, ILSF15 said:

Не заказали и не собираемся.

Ну тогда продолжайте и дальше трахаться с одноразовым проектом. Может быть, и заведёте. В симуляторе хотя бы запустите код. AVR Studio имеет таковой.

27 minutes ago, ILSF15 said:

Нужна конкретика. Возможно, кто-то, кто это делал, и знает, КАК (не отладку. Настройку таймера)

Конкретика нужна прежде всего от вас. Вы пишете, извините за прямоту, галиматью. В ней очень трудно уловить смысл. Повторюсь: вам-то всё понятно. Но мне нет.

Я уже говорил вам, что работал с аврками достаточно долго. Естественно, что и таймеры использовал, и последовательный порт и кучу другой периферии. И операционку на них тоже ставил. Но я читал даташиты, не пренебрегал отладкой. И всё работало.

29 minutes ago, ILSF15 said:

К регистру отсчёта же должен прибавляться 1 на один такт тактирующей частоты

К регистру счётчика таймера (TCNT, если не изменяет память) прибавляется единичка каждые Fclk (частота процессора) / делитель таймера.

31 minutes ago, ILSF15 said:

а не на Х тактов (в зависимости от разрядности), нет?!

Через "разярдность таймера" он у вас переполнится и потикает от нуля. Вам же нужно было, чтобы 30 секунд не переполнялся.

Share this post


Link to post
Share on other sites
6 minutes ago, haker_fox said:

Что вы подразумеваете под "не работает"? Таймер тикает?

Видимо, тикает. Иногда даже более-менее сообразно с ожиданиями (3 секунды вместо 5). А иногда, скорее всего, значение переменной timer бессмысленно, и в следствие этого программа не выполняется.

7 minutes ago, haker_fox said:

Но я читал даташиты,

Я тоже читал даташиты. Вы не поверите, конечно, но:

Quote

8.2.1 Default Clock Source
The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 programmed, resulting in 1.0MHz
system clock. The startup time is set to maximum and time-out period enabled. (CKSEL = “0010”, SUT = “10”,
CKDIV8 = “0”). The default setting ensures that all users can make their desired clock source setting using any available
programming interface.

15.11.2 TCCR1B – Timer/Counter1 Control Register B

<...>

Table 15-6. Clock Select Bit Description
CS12 CS11 CS10 Description
0       0      0       No clock source (Timer/Counter stopped).
0       0      1       clkI/O/1 (no prescaling)
0       1      0       clkI/O/8 (from prescaler)
0       1      1       clkI/O/64 (from prescaler)
1       0      0       clkI/O/256 (from prescaler)
1       0      1       clkI/O/1024 (from prescaler)

Итого: тактирующая частота 1Mhz, делитель на 1024 приводит к увеличению регистра отсчёта на ~1000 в секунду, переменная timer по идее должна содержать количество миллисекунд с момента запуска таймера, а переполнение регистра отсчёта должно занимать порядка 6.5 минут. Очевидно, что в переменную либо попадают не те значения, которые ожидались, либо вообще мусор. И вопрос - что надо, чтобы эта переменная содержала миллисекунды, а не мусор.

12 minutes ago, haker_fox said:

Вы описание алгоритма не привели.

Не понимаю, зачем оно вам надо для ответа на вопрос о скорости заполнения регистра отсчёта.

19 minutes ago, haker_fox said:

Почему, догадайтесь сами. Если что, подскажу.

Подсказывайте. Не забудьте только, когда будете подсказывать, что тот же код, точно так же перенесённый с той же первой на ту же вторую платформу, только без таймера - работает.

Чуть меньше заносчивости олдового профессионала, а то шуму много, а по теме от силы крупицы. Уж извините за прямоту, но прямо напрашивается. Особенно после фразы про даташит. И после вот этого:

25 minutes ago, haker_fox said:

Не совсем. Писать "магические цифры" в регистры - быть самому себе злобным...

Как учили - так и пишу. По другому не учили. От того, как записан оператор изменения бита, о профи, результирующее значение байта ВНЕЗАПНО не меняется. Лишь бы нужный бит менять, а остальные - не трогать.

Share this post


Link to post
Share on other sites
23 minutes ago, ILSF15 said:

Видимо, тикает.

Дааа... отладчик не покупаем, через последовательный порт отлаживать не умеем... Как вы этот разовый проект вообще довести до конца собираетесь?

23 minutes ago, ILSF15 said:

Итого: тактирующая частота 1Mhz, делитель

RC-генератор у аврок, как я помню, довольно нестабильный и подплывает от температуры. Если хотите точного отсчёта времени, ставьте внешний кварц.

23 minutes ago, ILSF15 said:

количество миллисекунд

Да какие миллесекунды: 1 000 000 / 1024 = 976.6 Гц, это частота тактирования таймера. Период будет равен 1.024 мс. Т.е. 24 мкс не отметаем.

23 minutes ago, ILSF15 said:

а переполнение регистра отсчёта должно занимать порядка 6.5 минут

2^16 / (1 000 0000 / 1024) = 67.1 с.

23 minutes ago, ILSF15 said:

Очевидно, что в переменную либо попадают не те значения, которые ожидались, либо вообще мусор.

Или питание с шумом, или стэк переполняется. Гадать можно до бесконечности.

23 minutes ago, ILSF15 said:

Не понимаю, зачем оно вам надо для ответа на вопрос о скорости заполнения регистра отсчёта.

На этот вопрос вы можете ответить, если вспомните арифметику за третий класс. Ну там возведение в степень не проходили. Но я вам подсказал чуть выше.

23 minutes ago, ILSF15 said:

Подсказывайте.

Всё очень просто: в одном микроконтроллере таймер 16 бит, в другом только 8. Вот вам самый простой пример. И корректировкой только регистров вы не обойдётесь. Нужно использовать либо прерывание для инкремента старших 8 бит в переменной, либо как-то по-другому решать ситуацию.

23 minutes ago, ILSF15 said:

только без таймера - работает

Я вам пример абстрактный привёл, чтобы вы не сильно увлекались сравнением двух платформ.

23 minutes ago, ILSF15 said:

Чуть меньше заносчивости олдового профессионала, а то шуму много, а по теме от силы крупицы.

А что вы сделали, чтобы вам не крупицы давали, а помогли? Чем меньше вы даёте информации, тем меньше и я вам даю. Не потому, что жалко. А потому, что вы на вопросы профессионала отвечаете так, буд-то скрываете государственную тайну. Зато без дела приводите фрагменты кода, ничего не говорящие, спорите с профессионалом, ставите под сомнение его профессионализм. Только за плечами профессионала PIC'и, AVR'ки, ARM'ы, а что у вас? И, заметьте, я ведь тоже не со знаниями родился. У меня были под рукой только даташиты, да инет на диал-апе (2003 - 2004 года).

23 minutes ago, ILSF15 said:

Особенно после фразы про даташит.

А чё, даташит только для слабаков?

23 minutes ago, ILSF15 said:

По другому не учили.

Я вас учу. Сейчас.

23 minutes ago, ILSF15 said:

От того, как записан оператор изменения бита, о профи, результирующее значение байта ВНЕЗАПНО не меняется.

Это для вас "ВНЕЗАПНО". А для меня очевидно.

А теперь сравните это

SOME_REG &= ~0x7050;

И это

SOME_REG &= ~(DIESEL_BIT_ON | IGNITION_BIT_ON | SPEED_UP_START);

Что более читаемо и не требует комментариев?

Итак: либо продолжаете дальше скрывать свой алгоритм и данные, либо аккуратно, как Гоголь или Горький описываете то, что вам надо, что делаете и получили. На поставленные вопросы - отвечаете. И не задаёте встречные вопросы в стиле "А зачем вам это надо?". Либо при очередной порции ерунды от вас я больше вам не пишу, и ждите помощи других участников. Либо выбирайтесь сами.

Share this post


Link to post
Share on other sites

Непедагогичненько:
SOME_REG &= ~0x7050; \\ семь "влияющих" битов
а в
SOME_REG &= ~(DIESEL_BIT_ON | IGNITION_BIT_ON | SPEED_UP_START); \\ три (влияющих) символических имени
практически напёрсточничество ;-)

Share this post


Link to post
Share on other sites
1 hour ago, haker_fox said:

Как вы этот разовый проект вообще довести до конца собираетесь?

Ну, мне за него денег не плотють, это скорей для развлечения (с некоторым полезным выходом). Могу снять функции, завязанные на точный отсчёт времени и скинуть всё на отсчёт циклов. Нужные количества циклов с некоторым запасом подберу методом тыка. И всё.

1 hour ago, haker_fox said:

Да какие миллесекунды: 1 000 000 / 1024 = 976.6 Гц, это частота тактирования таймера. Период будет равен 1.024 мс. Т.е. 24 мкс не отметаем.

На самом деле, точности достаточно до десятых долей секунды. Миллисекунды позволяют обойтись целочисленной математикой вместо дробной, а погрешности теряются. Нормальный рабочий цикл - приблизительно от 5 до 10 секунд (причём скорее максимум шесть). За шесть секунд погрешность (если правильно считаю) должна быть меньше двух десятых секунды, что для меня вполне приемлемо.

1 hour ago, haker_fox said:

RC-генератор у аврок, как я помню, довольно нестабильный и подплывает от температуры. Если хотите точного отсчёта времени, ставьте внешний кварц.

Собственно - см выше про погрешности. Не плавает же он от температуры в полтора-два раза?! Речь о процентах на градус, не так ли?

1 hour ago, haker_fox said:

2^16 / (1 000 0000 / 1024) = 67.1 с.

Тьфу, сам уже сбился. Конечно же, порядка минуты. Мне этого с нормальным рабочим циклом в пределах 10 секунд - за глаза.

1 hour ago, haker_fox said:

Или питание с шумом, или стэк переполняется. Гадать можно до бесконечности.

Питание от всё того же USB. В данный момент - пока вожусь с программой - от компьютера. 

1 hour ago, haker_fox said:

в одном микроконтроллере таймер 16 бит, в другом только 8

Ну уж не настолько я болван, чтобы этого не понимать. В MSP430 и тактировка совсем другая, и делители, и сами регистры иначе устроены. Но там я тоже шестнадцатибитным таймером пользуюсь.

 Когда я говорю "алгоритм" - я имею в виду алгоритм, а не код. Вот ту старую добрую диаграммку с прямоугольничками, параллелограмчиками, овальчиками, ромбиками.

И, если уж на то пошло - действительно, разница в данном случае именно что в реализации таймеров. И я задал про конкретный таймер конкретной атмеги конкретный вопрос. Меня вот беспокоит в даташите такой момент: 

Quote

The TCNT1, OCR1A/B, and ICR1 are 16-bit registers that can be accessed by the AVR® CPU via the 8-bit data bus.
The 16-bit register must be byte accessed using two read or write operations. Each 16-bit timer has a single 8-bit register for
temporary storing of the high byte of the 16-bit access. The same temporary register is shared between all 16-bit registers
within each 16-bit timer. Accessing the low byte triggers the 16-bit read or write operation. When the low byte of a 16-bit
register is written by the CPU, the high byte stored in the temporary register, and the low byte written are both copied into the
16-bit register in the same clock cycle. When the low byte of a 16-bit register is read by the CPU, the high byte of the 16-bit
register is copied into the temporary register in the same clock cycle as the low byte is read.

Может быть - в этом причина того, что в timer мусор попадает? Может быть, timer = TCNT1; - не легитимная операция. И человек, не задающийся попытками научить того, кто учёбы не просил, мог бы сразу ответить на этот вопрос, а мы тут за общие принципы дискутируем.

1 hour ago, haker_fox said:

А чё, даташит только для слабаков?

То есть, то, что я вам цитаты из даташит привёл и в первом посте его упомянул, вас даже не смутило?

1 hour ago, haker_fox said:

А теперь сравните это

Даже не спорю. Но мне свой проект не сдавать, а если кому-то не ясны "магические циферки", он может спросить просто: а что это ты там настроил? И я просто отвечу: в таком-то регистре - то-то. А лекций на тему того, какой я плохой программист, не надо. Я вообще не программист.

 

1 hour ago, haker_fox said:

я больше вам не пишу, и ждите помощи других участников. Либо выбирайтесь сами

А так можно, да?

24 minutes ago, Obam said:

Непедагогичненько:
SOME_REG &= ~0x7050; \\ семь "влияющих" битов
а в
SOME_REG &= ~(DIESEL_BIT_ON | IGNITION_BIT_ON | SPEED_UP_START); \\ три (влияющих) символических имени
практически напёрсточничество ;-)

Да ладно. В этом он прав - действительно такая работа с битами регистров более удобочитаема, но я в неё не умею - и не задаюсь уметь, потому что это, блин, не заказ профессионалу за деньги, а развлечение дилетанта для себя. Но если надо уточнить, что я там вписал в конкретный регистр - могу ответить (я, собственно, в комментариях всё указал, но, видимо, профессионалы, как и компилятор, комментарии игнорируют :)

Edited by ILSF15

Share this post


Link to post
Share on other sites
30 minutes ago, Obam said:

Непедагогичненько:

По уровню вопросов задающего как вы думаете, для него сейчас эти мелочи сильно актуальны? Тем более ссыль я ему выше дал. Он вчера взялся за программирование МК и освоение Си. При этом пытается спорить и дерзить. Без основания.

Share this post


Link to post
Share on other sites
4 minutes ago, haker_fox said:

Без основания

Ну почему же, с основанием. Вместо конкретного ответа на конкретный вопрос (смутно ответ промелькнул - но рамазанно на несколько постов, при том - ничего того, что я не прочёл бы в даташит ДО написания поста, не было), я получил непрошеную лекцию о: способах записи операторов (со ссылкой); необходимости ради разового развлечения приобрести или собрать программатор; необходимости читать даташит (то, что я его читал, было успешно проигнорировано); необходимости испытывать пиетет к опытности профессионалов, какой бы фигнёй они меня не грузили (даже если это совершенно ненужная мне фигня); разнице между микроконтроллерами.

Что ожидалось от профессионала: "если ты вот эти свои регистры написал, как надо - должно работать". Или "должны быть вот такие команды, проверь". Или, если действительно проблема там, где я думаю, а профессионал решал такую задачу: "это присвоение не будет работать, тебе надо считывать данные из регистра счётчика так-то" (не обязательно набор операторов, достаточно принципиального объяснения, как раздельно прочитать высокий и низкий байт регистра, если действительно дело в этом).

Что имеем по результату: только моя далеко не врождённая сдержанность предотвращает использование более нелестных выражений в ваш адрес. Поэтому давайте остановимся на вашем предложении 

1 hour ago, haker_fox said:

я больше вам не пишу

 

Share this post


Link to post
Share on other sites
16 minutes ago, ILSF15 said:

Что ожидалось от профессионала

Форум бесплатны. Здесь вам никто ничего не должен. Довольствуйтесь тем, что дают. Или научитесь вопросы задавать так, чтобы их понимали другие люди. Я вам ещё в первых постах задал вопрос, попросил написать алгоритм. А вы? Восприняли это как личную обиду.

17 minutes ago, ILSF15 said:

не врождённая сдержанность предотвращает использование более нелестных выражений в ваш адрес.

Уважение заключается не в красивых словах, сказанных с придыханием. Поэтому, не сдерживайтесь, говорите. Только вместо словесного поноса уже давно бы объяснили внятно, что вам нужно от микроконтроллера.

Share this post


Link to post
Share on other sites
4 hours ago, ILSF15 said:

 


PRR |= 0x08;      //  Выключение Timer_1
TCNT1 = 0x00;     //  Сброс регистра отсчёта Timer_1

 

 

Вы сначала выключаете таймер, а потом бытаетесь изменить значение одного из его регистров.

Сначала делайте завись в TCNT1, а только потом выключайте его.

Share this post


Link to post
Share on other sites
1 minute ago, dimka76 said:

Вы сначала выключаете таймер, а потом бытаетесь изменить значение одного из его регистров.

Сначала делайте завись в TCNT1, а только потом выключайте его.

Это сброс на выходе. Чтобы при следующем включении он считал от нуля, а не от прошлого раза. Бита сброса в управляющих регистрах, судя по даташиту нет, и судя по нему же, последующее включение приводит к запуску не с нуля, а с того места, где остановился. Вот поэтому сброс.

1 minute ago, haker_fox said:

уже давно бы объяснили внятно, что вам нужно от микроконтроллера

А я разве невнятно объяснил? Мне надо, чтобы пока работает функция прерывания по кнопке (любой из, и совершенно не важно, что в ней делается), во время работы таймер считал время. И в тот момент, когда мне нужно знать сколько (приблизительно) в миллисекундах прошло от начала работы функции - предоставлял мне эту информацию в виде значения переменной. Что тут ещё должно быть?

Share this post


Link to post
Share on other sites
1 minute ago, ILSF15 said:

Это сброс на выходе. Чтобы при следующем включении он считал от нуля, а не от прошлого раза. Бита сброса в управляющих регистрах, судя по даташиту нет, и судя по нему же, последующее включение приводит к запуску не с нуля, а с того места, где остановился. Вот поэтому сброс.

Я не о нужности этого сброса вам говорю, а о последовательности операций.

Сделайте сначала сброс, а потом отключайте его.

Вот так

TCNT1 = 0x00;     //  Сброс регистра отсчёта Timer_1
PRR |= 0x08;      //  Выключение Timer_1

 

Share this post


Link to post
Share on other sites
1 minute ago, dimka76 said:

Сделайте сначала сброс, а потом отключайте его

Ну... на сколько я могу судить из даташит, к прямому изменению этот регистр доступен всегда, а стирание до остановки таймера приведёт к тому, что он может успеть что-то насчитать до выключения. Впрочем, так или иначе, не помогло.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this