В общем ковырял-ковырял, да и выковырял.
Спасибо всем, кто оказал помощь!
Рабочий код выглядит вот так:
PHP код:
|
#include ‹tiny13.h›
unsigned int i=0;
//Прерывание от данных пришедших с вала двигателя
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (i ‹ 35) //если i не успевает приплюсоваться до трех значит частота на валу Больше чем ограничение.
PORTB.3=0;
else PORTB.3=1;
i=0; //наплюсовали - надо снулить нашу i дабы снова она начала плюсоваться
}
// Прерывание по таймеру 37,5 килогерц проц 9.60 мегагерц - те фактически, такймер переполняется 37500/255 = 147.06 Гц?
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x01;
i++;
if (i ›= 65535) i=0;
}
void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0b001000; // Ставим бит в PORTB.3, так как диод на VCC.
DDRB=0b001000; //PORTB.3 у нас будет выходом на светодиод
// Организуем таймер на: 37,5 килогерц
TCCR0A=0x00;
TCCR0B=0x02; //делим 9600000 на 8 = 37,5 килогерц
TCNT0=0x01; // Зачем?
OCR0A=0x00;
OCR0B=0x00;
// Зададим выпадание в прерывание если идет падающий сигнал от датчика на валу
GIMSK=0x40; // Прерывание по INT0
MCUCR=0x03; // Прерывание на INT0 нарастающему фронту
GIFR=0x40;
//Прочее
TIMSK0=0x02;
ACSR=0x80;
ADCSRB=0x00;
#asm("sei")
while (1)
{
//Траляля три рубля =))) Нифига тут нам не надо
};
}
|
Осталось организовать спячку и скользящее среднее.
Хотя и так срабатывает весьма стабильно.