Показать сообщение отдельно
Непрочитано 28.03.2012, 01:37  
SAHA_T
Прописка
 
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
SAHA_T на пути к лучшему
По умолчанию Re: Задержка или опережение импульса

Люди а Вы точно программированием занимаетесь или все же автомобилями, так как знание в авто у Вас супер.
Завтра буду разбираться с этим исходником

#include ‹tiny2313.h›
#include ‹delay.h›

unsigned char i;
unsigned long int counter_rpm;
unsigned long int bufer;
flash char tablica[104]=
{
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
11,
12,
12,
13,
13,
14,
14,
15,
15,
15,
15,
15,
16,
16,
16,
16,
16,
16,
17,
17,
17,
17,
17,
17,
17,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
17,
16,
15,
14,
10,
};

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B=0x00; //останавливаем счётчик 1Мгц
TCNT1L=TCNT1H=0xff; //заносим макс. значение
};

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTB.4=1; //включаем КЗ
};

interrupt [TIM1_COMPB] void timer1_compb_isr(void)
{
TCCR1B=0x00; //останавливаем счётчик 1Мгц
PORTB.4=0; //выключаем КЗ
};

void main(void)
{
DDRA=DDRB=DDRD=0xff;
DDRD.2=0; //вход под датчик

OCR1AL=OCR1AH=0xff;
OCR1BL=OCR1BH=0xff;
TIMSK=0xE0;

delay_ms(500);
while(PIND.2==1)
{
PORTB.4=1;
delay_us(1500);
PORTB.4=0;
delay_us(3500);
};
PORTB.4=0;

while(1)
{
while(PIND.2==0); //ждём входа лепестка
#asm("cli")
PORTB.4=0; //выключаем КЗ
PORTB.3=1; //вкл. светодиод
if(i›18&i‹104) PORTB.4=1;
TCNT1L=TCNT1H=0x00; //сбрасываем счётчик
TCCR1B=0x02; //запускаем счётчик 1Мгц
delay_us(500); //убираем дребезг
while(PIND.2==1); //измеряем скорость вращения
TCCR1B=0x00; //останавливаем счётчик 1Мгц
PORTB.3=0; //выкл. светодиод

counter_rpm=(TCNT1L|((int)TCNT1H‹‹); //читаем скорость вращения
i=60000/counter_rpm; //вычисляем ячейку таблицы

bufer=counter_rpm-(counter_rpm*tablica[i]/36)-150; //вычисляем задержку
OCR1BH=(char)(bufer››; //заносим задержку
OCR1BL=(char)bufer; //в счётчик

bufer=bufer-2000; //длительность импульса 2мс
OCR1AH=(char)(bufer››;
OCR1AL=(char)bufer;

TIFR=0xff; //сбрасываем флаги
TCNT1L=TCNT1H=0x00; //сбрасываем счётчик
TCCR1B=0x02; //запускаем счётчик 1Мгц
#asm("sei")
};
};


сразу встречный вопрос зачем тут массив.
SAHA_T вне форума