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

 
 
> Затраты на обработку прерывания по переполнению таймера.
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
Ответов
zheka
сообщение Jan 22 2010, 14:39
Сообщение #2


Гуру
******

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



Все господа.... мысли кончились. Не гонясь за точностью, пытаюсь сделать хоть что-то.
Завел Timer0 на 16 МГц. ПО переполнению инкрементирую OVF_count - счетчик переполнений. Timer1 в режиме PWM настроен на период 20 мс, выход поступает на вход INT0, фронту импульса запускается обработчик, который умножает OVF_count на 256 , прибавляет текущее значение TCNT0, после чего делит на 16 - получаем период в микросекундах. У меня же проказывает не 20 000 мкс, а 1610 либо 1594. Вот код, где я не прав?
CODE
#include <mega32.h>
#include <delay.h>
#include <stdio.h>

#asm
.equ __lcd_port=0x15;PORTC
#endasm
#include <lcd.h>


#define FAN PORTB.4

#define FINEUP PIND.7
#define FINEDOWN PIND.4

#define SPEED_MINUS PIND.6
#define SPEED_PLUS PIND.1


#define SPEED_MIN 0x0490
#define SPEED_MAX 0x07D0

#define SPEED OCR1A





char lcd_buffer[33];
unsigned char s[8];

unsigned int a,b;

unsigned int OVF_count;


unsigned long int time;




// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
a=TCNT0;
time=(OVF_count*256+a)/16;
OVF_count=0;
lcd_clear();
lcd_gotoxy(0,0);
sprintf(s,"%u", time);
lcd_puts(s);

}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
OVF_count++;
}




main()
{

unsigned char i,j, devices;
int temp;

OVF_count=0;


// 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;


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000,000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x80;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x4E;
ICR1L=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0b00000001;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;


SPEED=SPEED_MIN;

DDRA=0xFF;
DDRD=0x00;
PORTD=0xFF;

DDRD.5=1;

DDRB.4=1;
FAN=1;
delay_ms(500);
FAN=0;

DDRD.2=0;
PORTD.2=0;

DDRD.0=0;
PORTD.0=1;


lcd_init(8);
lcd_clear();


#asm
sei
#endasm



while (1)
{

if (!SPEED_PLUS)
{
if (SPEED<SPEED_MAX) SPEED++;
delay_ms(2);
}

if (!SPEED_MINUS)
{

if (SPEED>SPEED_MIN) SPEED--;
delay_ms(2);
}





}








}


Сообщение отредактировал rezident - Jan 22 2010, 15:07
Причина редактирования: Нарушение п.3.4 Правил форума.
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, 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
- - fantex   Вот пример реализации измерения частоты импульсов ...   Jan 25 2010, 11:38
- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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