|
Таймер1, режим по совпадению |
|
|
|
Jul 3 2006, 07:24
|

Местный
  
Группа: Свой
Сообщений: 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; // Ваш код..... }
|
|
|
|
|
Jul 3 2006, 07:38
|

Участник

Группа: Новичок
Сообщений: 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; // Ваш код..... } Си - это, конечно, хорошо, но кто-нибудь может привести пример на Ассемблере?
|
|
|
|
|
Jul 3 2006, 08:18
|
Местный
  
Группа: Участник
Сообщений: 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
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Jul 5 2006, 07:03
|

Шаман
     
Группа: Модераторы
Сообщений: 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).
|
|
|
|
|
Jul 5 2006, 11:08
|

Участник

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

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

Участник

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

|
OCR1A = 2000 - 1 = 1999 [/quote] Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035%
|
|
|
|
|
Jul 6 2006, 09:53
|

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

|
Цитата(Kesha123 @ Jul 6 2006, 04:38)  Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035%  Поясните, что вы измеряете? И как определяете погрешность? В своё время я довел относительную погрешность измерения периода входного сигнала на авр8515 до 1Е-7, т.е. 0.00001%, так что вам есть куда развиваться(:-)
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 6 2006, 10:10
|

Участник

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

|
Цитата(=GM= @ Jul 6 2006, 13:53)  Цитата(Kesha123 @ Jul 6 2006, 04:38)  Да! Пробовал при OCR1A без вычитания единицы - погрешность измерения временного интервала была 0,053%, вычел единицу - в итоге погрешность стала 0,0035%  Поясните, что вы измеряете? И как определяете погрешность? В своё время я довел относительную погрешность измерения периода входного сигнала на авр8515 до 1Е-7, т.е. 0.00001%, так что вам есть куда развиваться(:-) Прерывание вызывается каждую миллисекунду. Контролирую по электронному секундомеру СТЦ-2М.
|
|
|
|
|
Jul 6 2006, 12:56
|

Участник

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

|
Цитата(=GM= @ Jul 6 2006, 16:33)  Цитата(Kesha123 @ Jul 6 2006, 09:10)  Прерывание вызывается каждую миллисекунду. Контролирую по электронному секундомеру СТЦ-2М.
Ну вы толком объясните, что вы измеряете. Ваш секундомер находится внутри процессора? Инфу из вас приходится клещами тянуть(:-). Грубо говоря, процессор выступает в роли счетчика времени (показания выводятся на ЖКИ). В роли образцового счетчика - СТЦ-2М. Начальные показания = 0. При подаче команды СТАРТ стартуют оба устройства. При подаче СТОП, оба тормозят. После чего снимаю показания обоих и вычисляю погрешность.
|
|
|
|
|
Jul 6 2006, 14:20
|

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

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