реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Таймер1, режим по совпадению
Kesha123
сообщение Jul 3 2006, 05:54
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Кто-нибудь подскажет, как запустить режим по совпадению таймера1? А, именно, имеется мега32 16МГц, нужно вызывать прерывание каждую миллисекунду. Заранее благодарен!
Go to the top of the page
 
+Quote Post
ALexx
сообщение Jul 3 2006, 07:24
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 22-09-04
Из: Burbach, Germany
Пользователь №: 704



Цитата(Kesha123 @ Jul 3 2006, 08:54) *
Кто-нибудь подскажет, как запустить режим по совпадению таймера1? А, именно, имеется мега32 16МГц, нужно вызывать прерывание каждую миллисекунду. Заранее благодарен!


В приложении - Хидер и Сишник для обслуживания таймеров

В процедуре инициализации ставите слкдующие строки:

//Запуск системного таймера
Timer1_SetMode(DISABLE_OC, DISABLE_OC, T1_NORMAL);
Timer1_SetMatchValue(CHANNEL_A,2000); // 1000Hz(T=1ms) on f=CLK/8 (CLK=16MHz)
Tim_EnableInt(OCIE1A);
Timer1_Start(T1_CLK_8);


Процедура обработки прерывания:

//*******************************************************************************
// Timer 1 output compare interrupt service routine
//*******************************************************************************
interrupt [TIM1_COMPA]void Tim1_compA_ISR(void){
TCNT1=0;

// Ваш код.....
}
Прикрепленные файлы
Прикрепленный файл  Tim_MEGA.zip ( 2.4 килобайт ) Кол-во скачиваний: 57
 
Go to the top of the page
 
+Quote Post
Harvester
сообщение Jul 3 2006, 07:38
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



CS12...CS10 = 010 (регистр TCCR1B) - предделитель clk/8
значение для сравнения по формуле K = Tзад/(n/Fclk) = Fclk*Tзад/n
n - коэфф предделителя
Tзад - требуемый период
Fclk - тактовая частота
K = 16E6*1E-3/8 = 2000

1. биты WGM13...WGM10 = 0100 (WGM11, 10 - TCCR1A; WGM13, 12 - TCCR1B) - режим CTC
OCR1A = 2000 - с чем сравнивать
OCIE1A = 1 (регистр TIMSK) - прерывание
или
2. WGM13...WGM10 = 1100 - режим CTC
OCR1A = 2000 - с чем сравнивать
TICIE1 = 1 (регистр TIMSK) - прерывание


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 3 2006, 07:38
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Цитата(ALexx @ Jul 3 2006, 11:24) *
Цитата(Kesha123 @ Jul 3 2006, 08:54) *

Кто-нибудь подскажет, как запустить режим по совпадению таймера1? А, именно, имеется мега32 16МГц, нужно вызывать прерывание каждую миллисекунду. Заранее благодарен!


В приложении - Хидер и Сишник для обслуживания таймеров

В процедуре инициализации ставите слкдующие строки:

//Запуск системного таймера
Timer1_SetMode(DISABLE_OC, DISABLE_OC, T1_NORMAL);
Timer1_SetMatchValue(CHANNEL_A,2000); // 1000Hz(T=1ms) on f=CLK/8 (CLK=16MHz)
Tim_EnableInt(OCIE1A);
Timer1_Start(T1_CLK_8);


Процедура обработки прерывания:

//*******************************************************************************
// Timer 1 output compare interrupt service routine
//*******************************************************************************
interrupt [TIM1_COMPA]void Tim1_compA_ISR(void){
TCNT1=0;

// Ваш код.....
}


Си - это, конечно, хорошо, но кто-нибудь может привести пример на Ассемблере?
Go to the top of the page
 
+Quote Post
Harvester
сообщение Jul 3 2006, 08:18
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(Kesha123 @ Jul 3 2006, 11:38) *
Цитата(ALexx @ Jul 3 2006, 11:24) *

Цитата(Kesha123 @ Jul 3 2006, 08:54) *

Кто-нибудь подскажет, как запустить режим по совпадению таймера1? А, именно, имеется мега32 16МГц, нужно вызывать прерывание каждую миллисекунду. Заранее благодарен!


В приложении - Хидер и Сишник для обслуживания таймеров

В процедуре инициализации ставите слкдующие строки:

//Запуск системного таймера
Timer1_SetMode(DISABLE_OC, DISABLE_OC, T1_NORMAL);
Timer1_SetMatchValue(CHANNEL_A,2000); // 1000Hz(T=1ms) on f=CLK/8 (CLK=16MHz)
Tim_EnableInt(OCIE1A);
Timer1_Start(T1_CLK_8);


Процедура обработки прерывания:

//*******************************************************************************
// Timer 1 output compare interrupt service routine
//*******************************************************************************
interrupt [TIM1_COMPA]void Tim1_compA_ISR(void){
TCNT1=0;

// Ваш код.....
}


Си - это, конечно, хорошо, но кто-нибудь может привести пример на Ассемблере?


Я же написал, какие значения куда пихать!
Неужели трудно записать это на ассемблере? Там нужно всего-то пара команд - ldi и out

Сообщение отредактировал Harvester - Jul 3 2006, 08:25


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 4 2006, 10:21
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Кстати, нашел программку, с помощью которой можно быстро сосчитать всяческие предделители, OCR, TCNT и др.
Прикрепленный файл  AvrCalc.zip ( 21.35 килобайт ) Кол-во скачиваний: 166
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jul 5 2006, 07:03
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Если требование по точности временнОго интервала жёсткое, то такой метод
Код
TCNT1=0;
не подойдёт.
В этом случае интервал удлинняется на непредсказуемую величину, зависящую от времени реакции на прерывание.
Лучше сделать так:
Код
OCR1A += INTERVAL_VALUE;
или так:
Код
ldi r17,HIGH(INTERVAL_VALUE)
ldi r16,LOW(INTERVAL_VALUE)
in r18,OCR1AL
add r16,r18
in r18,OCR1AH
adc r17,r18
out OCR1AH,r17
out OCR1AL,r16


Или ещё вариант - использовать режим обнуления таймера по совпадению (CTC).
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 5 2006, 11:08
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Цитата(IgorKossak @ Jul 5 2006, 11:03) *
Или ещё вариант - использовать режим обнуления таймера по совпадению (CTC).


Именно, режим СТС!!!
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jul 5 2006, 17:55
Сообщение #9


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Harvester @ Jul 3 2006, 11:38) *
CS12...CS10 = 010 (регистр TCCR1B) - предделитель clk/8
значение для сравнения по формуле K = Tзад/(n/Fclk) = Fclk*Tзад/n
n - коэфф предделителя
Tзад - требуемый период
Fclk - тактовая частота
K = 16E6*1E-3/8 = 2000


OCR1A = 2000 - с чем сравнивать


OCR1A = 2000 - 1 = 1999
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 6 2006, 05:38
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



OCR1A = 2000 - 1 = 1999
[/quote]

Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035% smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 6 2006, 09:53
Сообщение #11


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Kesha123 @ Jul 6 2006, 04:38) *
Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035% smile.gif


Поясните, что вы измеряете? И как определяете погрешность? В своё время я довел относительную погрешность измерения периода входного сигнала на авр8515 до 1Е-7, т.е. 0.00001%, так что вам есть куда развиваться(:-)


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 6 2006, 10:10
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Цитата(=GM= @ Jul 6 2006, 13:53) *
Цитата(Kesha123 @ Jul 6 2006, 04:38) *

Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035% smile.gif


Поясните, что вы измеряете? И как определяете погрешность? В своё время я довел относительную погрешность измерения периода входного сигнала на авр8515 до 1Е-7, т.е. 0.00001%, так что вам есть куда развиваться(:-)


Прерывание вызывается каждую миллисекунду. Контролирую по электронному секундомеру СТЦ-2М.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 6 2006, 12:33
Сообщение #13


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Kesha123 @ Jul 6 2006, 09:10) *
Прерывание вызывается каждую миллисекунду. Контролирую по электронному секундомеру СТЦ-2М.

Ну вы толком объясните, что вы измеряете. Ваш секундомер находится внутри процессора? Инфу из вас приходится клещами тянуть(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Kesha123
сообщение Jul 6 2006, 12:56
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 17-04-06
Пользователь №: 16 197



Цитата(=GM= @ Jul 6 2006, 16:33) *
Цитата(Kesha123 @ Jul 6 2006, 09:10) *

Прерывание вызывается каждую миллисекунду. Контролирую по электронному секундомеру СТЦ-2М.

Ну вы толком объясните, что вы измеряете. Ваш секундомер находится внутри процессора? Инфу из вас приходится клещами тянуть(:-).


Грубо говоря, процессор выступает в роли счетчика времени (показания выводятся на ЖКИ). В роли образцового счетчика - СТЦ-2М. Начальные показания = 0. При подаче команды СТАРТ стартуют оба устройства. При подаче СТОП, оба тормозят. После чего снимаю показания обоих и вычисляю погрешность.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 6 2006, 14:20
Сообщение #15


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Kesha123 @ Jul 6 2006, 11:56) *
Грубо говоря, процессор выступает в роли счетчика времени (показания выводятся на ЖКИ). В роли образцового счетчика - СТЦ-2М. Начальные показания = 0. При подаче команды СТАРТ стартуют оба устройства. При подаче СТОП, оба тормозят. После чего снимаю показания обоих и вычисляю погрешность.


Если я правильно понял, исходя из параметров СТЦ-2, вы получаете разницу 35 мс на интервале в 1000 сек или что-то около того. Поскольку ваш измеритель дает погрешность в 1 мс, вы меряете не ошибку измерения периода, а погрешность вашего тактового генератора. Стоит подумать о замене генератора(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016