Угу, в прерывании по переполнению этого таймера начальное значение счета задавать можно, например. Либо настроить таймер в режиме CTC (Clear To Compare - Сброс При Совпадении). Тогда достаточно будет один раз в регистр сравнения число загрузить, и таймер будет считать от 0 и до этого значения.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Только в даташите смотрите, какие таймеры поддерживают этот режим.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Сб дек 10, 2016 08:30:10
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Спасибо. Если я правильно понял, то выходит, что отсчитать нужный интервал времени можно двумя способами: 1. Задать Timer1 начальное значение, и он будет считать от этого значения и до 65535. Но в этом случае нужно
указывать начальное значение при каждом обращении к таймеру. 2. При конфигурировании Timer1 заносим конечное значение в регистр сравнения, и таймер каждый раз считает от 0
до этого значения. Второй способ мне кажется более удобным.
Совершенно верно. Удобство зависит от того, как используется таймер. Второй вариант больше подходит под задачу "запустили и забыли". Отсчет времени тот же, например. Первый же вариант тоже жизнеспособен, когда нужно изредка запускать отсчет какой-либо выдержки. Тут можно даже написать функцию, в которую передается значение для начального отсчета, а в прерывании по переполнению выставляется флаг окончания отсчета. Все это удобно и гибко.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
akl, так и есть, один такт отнимать нужно. Код старый, первые шаги еще. Для примера приведен был.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Indic: 'индикация A = Seco Number(1) = A / 10 Number(2) = A Mod 10 Reset Dig1 : Reset Dig2 Incr Count : If Count > 2 Then Count = 1 Portb = Lookup(number(count) , Digits) Select Case Count Case 1 : Set Dig1 Case 2 : Set Dig2 End Select Return
Timecount: 'рассчет времени Incr Seco : If Seco > 59 Then Seco = 0 F = 1 'установка флага Return
Enable Timer1 - это разрешение прерывания по переполнению. У Вас же прерывание по совпадению. А следовательно, Enable Oc1a.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Вт дек 13, 2016 07:31:53
Встал на лапы
Зарегистрирован: Вс мар 27, 2011 07:48:48 Сообщений: 127 Откуда: г. Екатеринбург
Рейтинг сообщения:0
Привет! Исправил код по вашему совету. Все работает супер. Спасибо за помощь. Заодно узнал, что Timer1 начинает работать после команды Enable Timer1, поэтому приходится его сначала тушить, а в нужном месте запускать командой Start Timer1.
Вообще таймер начинает тикать как только будет сконфигурированы биты прескаллера. Вот как только задали Prescale, таймер пошагал считать. Команда Stop Timer останавливает таймер именно обнуляя прескалллер, а запускает восстанавливая его значение.
Команда же Enable / Disable Timer разрешает / запрещает именно прерывание этого таймера в регистре TIMSK. Что все это значит?
После того как таймер был сконфигурирован, он начинает считать. Если прерывание было запрещено, то он просто крутит счетный регистр по кругу, без всяких внешних реакций. С одной-то стороны и ладно. Если речь идет о таймере индикации, например. А с другой это чревато тем, что мы не знаем что там в счетном регистре в момент разрешения прерывания. И если важно именно прошедшее время, то нужно однозначно таймер перезапускать, обнуляя счетный регистр. Такие дела.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Да, еще к этой теме, раз речь зашла. Даже не смотря на запрет прерывания, его флаг все равно выставится в соответствующем регистре при соблюдении условий. И как только оно будет разрешено, программа уйдет в его обработчик.
Этот флаг сбрасывается при переходе по соответствующему вектору прерывания, либо как заметил akl, самостоятельной записью 1 в соответствующий бит регистра флагов (например, у таймеров TIFR - Timer/Counter Interrupt Flag Register).
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Можно открыть файл .DAT соответствующего контроллера, в папке с установленной программой. Обычным блокнотом. Там много всего интересного, на самом деле. Например, прерывания Attiny2313:
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения