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

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

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

 

01unsigned long lastflash;
02int RPM;
03void setup() {
04DDRD &=~(1<<PD3);
05PORTD|=(1<<PD3);
06Serial.begin(9600);
07EICRA=(0<<ISC11)|(0<<ISC10);
08EIMSK=(1<<INT1);
09}
10 
11void loop() {
12  if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
13    RPM=0;}  //считаем что RPM 0
14Serial.println(RPM);   //вывод в порт
15  delay(50);  //задержка для стабильности
16  cli();                         // запрещаем прерывания 
17  sei();
18}
19ISR(INT1_vect)
20{
21  RPM=60/((float)(micros()-lastflash)/1000000);  //расчет
22  lastflash=micros();  //запомнить время последнего оборота
23}

 

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

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

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

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

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

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

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