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

 
 
> Затраты на обработку прерывания по переполнению таймера.
zheka
сообщение Jan 21 2010, 18:11
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа, пишу программку для подсчета периода импульсов. Могу применять только 8-битный таймер, ибо 16-ти битный таймер занят.
Всвязи с тем что переполнение его наступает через каждые 256 тактов, их приходится точно просчитывать.
Вот такой вот код:
Код
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
//tacts++;
a=TCNT0;
TCCR0=0x00;
lcd_gotoxy(0,0);
lcd_putsf("       ");

lcd_gotoxy(0,0);
   sprintf(s," %i", a);
     lcd_puts(s);

TCCR0=0x01;


}


То есть сразу по прерывания по переполнения таймер по идее должен сбрасываться. В самом начале обработчика значение TCNT0 записывается в переменную a. И ее значение выводится на экран. Так вот в данном случае оно равно 32 или 33 (в зависимости от фазы луны и того, чем я похмелялся )))) ). Что контроллер делает эти 32 такта?
ПРичем 32 такта выдается хоть при 16 000 кГц, хоть при делении на 8 (2000 кГц).
Инициализирую таймер так:

Код
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;


Что делать и кто виноват?

У кого нибьудь есть опыт написания таких программ, когда приходилось несколько циклов переполнения таймера складывать. Как-нибудь компенсировали время, затрачиваемое на обработку прерывания?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
fantex
сообщение Jan 25 2010, 11:38
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Вот пример реализации измерения частоты импульсов на CPU188-MX5.
Основная идея способа - считать количество импульсов и время между передними фронтами импульсов.
Если время между фронтами превышает заданное (в данном случае 3 секунды), то полученые значения кол-ва импульсов
и время между фронтами копируется в соответствующие переменные, из которых внешняя функция вычисляет уже частоту импульсов.

CODE

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

namespace FI
{
word timeMS = -1;
word freqCount = 0;

void __declspec(naked) interrupt IntHandler();
};

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void __declspec(naked) interrupt FI::IntHandler()
{
static word sMS = 0;
static word count = 0;

__asm
{
push ax // 14
push dx // 14
push ds // 13

mov ax, seg millisecondsCount // 4
mov ds, ax // 2

inc [count] // 19
mov ax, [word ptr millisecondsCount] // 2
mov dx, [sMS] // 2
sub ax, dx // 3
cmp ax, 3000 // 3

jnc loc2 // 4, 13

locret:

pop ds
pop dx
pop ax
iret

loc2:

add dx, ax

mov [byte ptr sMS], dl // 2
mov [byte ptr sMS+1], dh // 2
mov [byte ptr timeMS], al // 2
mov [byte ptr timeMS+1], ah // 2

mov al, [byte ptr count] // 2
mov ah, [byte ptr count+1] // 2

mov [byte ptr freqCount], al // 2
mov [byte ptr freqCount+1], ah // 2

xor al, al // 3
mov [byte ptr count], al // 2
mov [byte ptr count+1], al // 2


pop ds // 12
pop dx // 14
pop ax // 14
iret // 28

}
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

float FI::GetFreq()
{
TRACE

float f1;
float f2;

_cli();

f1 = FI::freqCount;
f2 = FI::timeMS;
FI::freqCount = 0; FI::timeMS = -1;

_sti();

return 1000.0 * f1 / f2;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Сообщение отредактировал fantex - Jan 25 2010, 11:39
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zheka   Затраты на обработку прерывания по переполнению таймера.   Jan 21 2010, 18:11
- - Goodefine   Цитата(zheka @ Jan 21 2010, 22:11) ...Всв...   Jan 21 2010, 18:34
- - zheka   Господи, ну читайте же внимательно мой код. Или ук...   Jan 21 2010, 18:37
- - rezident   Цитата(zheka @ Jan 21 2010, 23:11) Что ко...   Jan 21 2010, 18:37
- - zheka   КодА листинг ассемблера посмотреть не догадались? ...   Jan 21 2010, 18:52
|- - defunct   Цитата(zheka @ Jan 21 2010, 20:52) Никак ...   Jan 21 2010, 19:14
- - rezident   Цитата(zheka @ Jan 21 2010, 23:52) К сожа...   Jan 21 2010, 19:07
- - zheka   Господа, я в принципе только сейчас понял: вывод н...   Jan 22 2010, 03:54
|- - _Pasha   Цитата(zheka @ Jan 22 2010, 07:54) на каж...   Jan 22 2010, 04:54
- - Александр Куличок   ЦитатаДлительность от 500 мкс до 1 сек. Точность -...   Jan 22 2010, 06:15
- - fantex   ЦитатаОпять таки-чисто практический вопрос - имея ...   Jan 22 2010, 09:09
|- - rezident   Цитата(fantex @ Jan 22 2010, 14:09) При п...   Jan 22 2010, 09:59
- - fantex   Тогда какой смысл измерять с таким разрешением (0....   Jan 22 2010, 10:41
- - zheka   ЦитатаПри периоде импульсов 1 сек, получается точн...   Jan 22 2010, 11:37
- - _Pasha   Если точность 1 клок, то Вам без input capture не ...   Jan 22 2010, 12:40
- - zheka   Все господа.... мысли кончились. Не гонясь за точн...   Jan 22 2010, 14:39
|- - Палыч   Цитата(zheka @ Jan 22 2010, 17:39) Вот ко...   Jan 22 2010, 15:36
- - zheka   Хм.. а вот тут уже незнание мной матчасти, вопрос ...   Jan 22 2010, 19:14
- - Александр Куличок   ЦитатаTimer1 в режиме PWM настроен на период 20 мс...   Jan 22 2010, 21:10
|- - Палыч   Цитата(Александр Куличок @ Jan 23 2010, 00...   Jan 23 2010, 07:38
- - zheka   ЦитатаА почему не используете одно из прерываний т...   Jan 24 2010, 11:05
|- - _Pasha   Цитата(zheka @ Jan 24 2010, 15:05) PWM пе...   Jan 24 2010, 13:11
- - zheka   Дискретность? думаю, что той что обеспечит 8-битны...   Jan 24 2010, 14:56
- - zheka   В общем, конфликтуют у меня два таймера. Переделал...   Jan 24 2010, 18:50
- - zheka   Fantex, спасибо, но, с алгоритмом я разобрался, у ...   Jan 25 2010, 12:44
|- - ILYAUL   Цитата(zheka @ Jan 25 2010, 15:44) ... ре...   Jan 25 2010, 13:26
- - zheka   Камень ATMega32. Вот, господа, упростил до безобр...   Jan 25 2010, 13:59
|- - Палыч   Цитата(zheka @ Jan 25 2010, 16:59) Почему...   Jan 25 2010, 15:49
- - zheka   Палыч, вообще-то прерывания тапймера1 запрещены. П...   Jan 25 2010, 16:00
|- - Палыч   Цитата(zheka @ Jan 25 2010, 19:00) вообще...   Jan 25 2010, 16:19
- - zheka   Палыч, однако спасибо Вам. Вынес все наружу. Все з...   Jan 25 2010, 17:32


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:11
Рейтинг@Mail.ru


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