не правильно показания тахометра

Yer
Offline
Зарегистрирован: 12.02.2016

Здравствуйте всем, написал код для тахометра но не правильно показывает и не получается считать входяший длительность импульса. Подаю сигналы с осцилографом длительность импульса 4 мс и период 62мс

 

unsigned long lastflash;
int RPM;
void setup() {
DDRD &=~(1<<PD3);
PORTD|=(1<<PD3);
Serial.begin(9600);
EICRA=(0<<ISC11)|(0<<ISC10);
EIMSK=(1<<INT1);
}

void loop() { 
  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
    RPM=0;}  //считаем что RPM 0
Serial.println(RPM);   //вывод в порт
  delay(50);  //задержка для стабильности
  cli();                         // запрещаем прерывания  
  sei();
}
ISR(INT1_vect)
{
  RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
  lastflash=micros();  //запомнить время последнего оборота
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

В строке 21 первую цифру надо написать как 60.0 иначе имеем целочисленное деление. Вообще в прерывании делать такой длинный расчёт плохо. Длинный, потому что займет несколько сотен микросекунд. Очень долго множить и делить float. Всё это время micros() не будет работать.  

Все переменные используемые в перывании должны быть объявлены как volatile.

Зачем запрещать, а потом сразу разрешать прерывание (строки 16-17)?

Для стабильности чего задержка в строке 15?

Yer
Offline
Зарегистрирован: 12.02.2016

Спасибо за отзыв можете подсказать порядок разрешении и запрета прерывание. Как лучше считать импульсы внутри прерывании