Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Таймеры/счётчики в AVR

Сообщение Jack_A »

akl писал(а):Не нравится отсутствие синхронности между отсчетом 1 секунды и выводом на индикатор. В часах должно быть всё синхронно.

Если для управления адронным коллайдером или запуском геостационарных спутников - таки да. :) А так ли это важно в обычных бытовых часах ? Конечно, 6 разрядов удобнее, чем 4 с выводом секунд по кнопке. Зато дешевше.
Изображение
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Re: Таймеры/счётчики в AVR

Сообщение mixon46 »

я собирался сделать как замену стандартным часам в ваз 2107. как сделаю так напишу статью )
X200881
Родился
Сообщения: 17
Зарегистрирован: Вт янв 25, 2011 12:52:34

Re: Таймеры/счётчики в AVR

Сообщение X200881 »

mixon46 писал(а):помогите а то совсем не показывает как надо :)

Здравствуйте. Есть рабочий проэкт часов на AT90S2313/ATTiny2313 динамика, CodeVision (работают около 5 лет дома, точность приемлемая). Интересует?
Аватара пользователя
mixon46
Говорящий с текстолитом
Сообщения: 1644
Зарегистрирован: Сб фев 18, 2012 15:42:29
Откуда: Курск

Re: Таймеры/счётчики в AVR

Сообщение mixon46 »

не) предпочитаю свои проекты)
Аватара пользователя
BlYur
Открыл глаза
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Re: Таймеры/счётчики в AVR

Сообщение BlYur »

Здрасьте.
Никак не доходит, как на ATTiny2313 настроить таймер TC0 в режиме СТС и прерывание по OCR.
Читаю даташит, книги разных умных людей.
Выписал себе на листок нужные (как мне кажется) регистры, биты, флаги, но в голове никак не хочет складываться воедино общая картина.
Кому не в западло, плиз, черканите эти заветные несколько строчек инициализации TC0 желательно (но не обязательно) на ассемблере.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Загружаете регистр OCR. Счетчик будет до него считать и обнуляться
Разрешаете прерывание по совпадению с регистром OCR
Задаете источник тактирования для таймера.

И все. Если прерывания разрешены глобально, он будет возникать при совпадении с регистром OCR.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Спойлер

Код: Выделить всё

   .include "tn2313def.inc"

.org   0
   RJMP   START
.org   0x0D
T0_COMPA:
   RETI
;************************************
START:
   LDI   XL,LOW(RAMEND)
   OUT   SPL,XL

   LDI   R16,1<<SE
   OUT   MCUCR,R16

   LDI R16,100-1
   OUT   OCR0A,R16

   LDI R16,1<<WGM01
   OUT   TCCR0A,R16

   LDI R16,1<<WGM01
   OUT TCCR0A,R16
   LDI R16,1<<CS00
   OUT   TCCR0B,R16

   OUT TCCR1B,R16
   LDI   R16,1<<OCIE0A
   OUT   TIMSK,R16
   OUT   TIFR,R16

   SEI
WAIT:
   SLEEP
   NOP
   RJMP   WAIT
.EXIT
Как то так.
Аватара пользователя
BlYur
Открыл глаза
Сообщения: 52
Зарегистрирован: Пн май 27, 2013 17:02:32

Re: Таймеры/счётчики в AVR

Сообщение BlYur »

А, похоже стало доходить:
1) Записать требуемое значение в регистр сравнения OCR0A
2) TCCR0A <-- 0b00000010 - режим СТС
3) TCCR0B <-- битами CS02, CS01 и CS00 выбираем предделитель.
КАКОЙ ПРЕДДЕЛИТЕЛЬ ЛУЧШЕ ВЫБРАТЬ ДЛЯ binary angle modulation?
4) TIMSK <-- 0b00000001 - разрешение прерываний от TC0
5) sei - глобально разрешаем прерывания.

Как-то так?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

BlYur писал(а): binary angle modulation?
Тыц
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Re: Таймеры/счётчики в AVR

Сообщение 12val12 »

подскажите как на AVR сделать процедуру задержки
(100 +N*cycle ) // N - int_16 ; cycle =1/Sysclk
при увеличеннии входящего аргумета на 1 задержка увеличивается на 1 клок (50 нсек при 20 Мгц)
Желательно переносимое на CvAVR
ух ты.... показывает
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Таймеры/счётчики в AVR

Сообщение Vov123 »

За один "клок" в AVR, в лучшем случае, выполнится одна команда, без 8-битного аргумента. Соответственно никак.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Vov123 писал(а):без 8-битного аргумента
Лично я не понял, что Вы имеет ввиду.

12val12 запускаете таймер -100 тактов переполнения. Затем запускает на нужное чиссло. Таймер 16 битный. Отрицательное число не знаю как, может если минус то без задержки.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Таймеры/счётчики в AVR

Сообщение Vov123 »

Ну настроит он таймер по совпадению, сработает прерывание, сколько "клоков" на это уйдёт до реагирования на событие, вероятно не один, а товарищ хочет именно один. К тому-же проц его до прерывания будет, вероятно, чем-то занят, переход сколько клоков займёт?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

12val12 писал(а):подскажите как на AVR сделать процедуру задержки
(100 +N*cycle ) // N - int_16 ; cycle =1/Sysclk
при увеличеннии входящего аргумета на 1 задержка увеличивается на 1 клок (50 нсек при 20 Мгц)
Желательно переносимое на CvAVR
Fo=20000000 cycle=50*Fo/1000000000. Точнее (100 +N*cycle)-1-Δ, где Δ-дополнительная задержка вызванная прерыванием.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Re: Таймеры/счётчики в AVR

Сообщение 12val12 »

Специалист akl я Вас не понял.
задержа нужна не фиксированная а переменная ..вообще планируется что величина задержки будет приходить по uart
цель с шагом 50 нСек исследовать входной посторяющийся сигнал отдаленный от известного импульса синхронизации на время более 5мксек

например нужно глянуть что через 100.05 мксек после ИЗ
подали величину задержки 100.05 мксек . контроллер отсчитал это время от ИЗ включил на 50 нсек УВХ
защелнул уровень на конденсаторе 20 пф ацп меги измерил уровень и передал обратнопо uart пару задержка100.05- уровень

потом подали величину задержки 100.10 мксек . контроллер отсчитал это время от ИЗ включил на 50 нсек УВХ
защелнул уровеньна конденсаторе 20 пф ацп меги измерил уровень и передал по uart пару задержка100.10- уровень


через некоторое количество посылок (пока что до 65000) будет готовая осцилограмма с разрешающей способностью 50 нсек
спасибо сделал без таймера .
задержка (5 +0.05*int_16)
ух ты.... показывает
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Понятно. Вы не видите разницу между микросекундой и тактом таймера/контроллера; в выражении задержки явно не хватает коэффициента пропорциональности. Удачи.
12val12
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Re: Таймеры/счётчики в AVR

Сообщение 12val12 »

вот тест
с каждым нефиксированным нажатием на кнопку время задежки увеличивается на 50 нс (1 клок при 20МГц)
начальная задежка 4600нсек
аргумент целоцисленный . таким образом моджно менять задержку от 4600нсек до 3280000 нсек с шагом 50 нСек
при тактовой 20Мгц

актуальная часть программы
DDRD.7=1; DDRD.6=1; //
Cycle =0;
while (1)
{
if ( PIND.5 )
{
Cycle=Cycle+1; while (PIND.5) {}
}

for (k=0;k<1 ;k++) { PORTD.6=1 ; } PORTD.6=0 ; //sync
Delay_int_cycle ( Cycle); //процедура задержки
PORTD.7= 1 ; PORTD.7= 0 ;//задержанный импульс
}
}
Вложения
strobo_mega8.zip
(31.65 КБ) 196 скачиваний
ух ты.... показывает
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Таймеры/счётчики в AVR

Сообщение Vov123 »

Неправильно.
Задержку в 1 тик даёт только команда ассемблера "nop".

Вот здесь калькулятор задержек на асме http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html

Посмотри сколько команд выполняется на ту или иную задержку, соответственно сколько тиков уходит на её выполнение.

Также обрати внимание на разницу в числе задержки и числа заносимого в регистры.
Последний раз редактировалось Vov123 Вс окт 30, 2016 09:52:45, всего редактировалось 2 раза.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Vov123 писал(а):Задержку в 1 тик даёт только команда ассемблера "nop".
Большая часть команд AVR выполняется за один такт.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Таймеры/счётчики в AVR

Сообщение Jack_A »

Не сочтите за оффтопик.
СпойлерКажется, времена изобретения велосипеда закончились - имеем очередное "изобретение" : стробоскопического осциллографа . Жаль, что работать не будет. Но не для работы это делалось - для жизнедеятельности пытливого ума. Только эта пытливость ума не позволяет взять книжку и прочесть, как устроен стробоскопический осциллограф и почему его не сделать на AVR, равно как и почему от батарейки нельзя запитать электровоз.
Учиться, учиться, еще раз учиться ! © Ленин .
Изображение
Ответить

Вернуться в «AVR»