Счетчик на прерываниях
- Войдите на сайт для отправки комментариев
Втр, 27/09/2022 - 19:37
Здравствуйте.
Есть проблема не могу понять, -почему после остановки прерывания и в последующем возобновлении, прибавляет один инкремент. Это проявляется как на паузе, так и на сбросе. Может кто подскажет.
#include "button_key.h" #include "SevSegShift.h" #define interruptPin 2 #define START 1 #define RESET 10 #define SHIFT_PIN_SHCP 6 #define SHIFT_PIN_STCP 5 #define SHIFT_PIN_DS 4 SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP, 1, true); //******************************************************************************** btn Btn5;//создадим обьекты кнопок "RESET" btn Btn6;//создадим обьекты кнопок "START" int distance; bool flagStart; volatile int counter ; // переменная-счётчик void setup() { //Serial.begin(9600); byte numDigits = 4; byte digitPins[] = {A3, A2, A1, A0}; byte segmentPins[] = {0, 1, 2, 3, 4, 5, 6, 7};//a,b,c,d,e,f,g,dp bool resistorsOnSegments = true; // «false» означает, что резисторы находятся на цифровых контактах. byte hardwareConfig = N_TRANSISTORS; // См. README.md для вариантов bool updateWithDelays = false; // Рекомендуется значение по умолчанию «false». bool leadingZeros = false; // Используйте «true», если вы хотите сохранить ведущие нули bool disableDecPoint = false; // Используйте «true», если ваша десятичная точка не существует или не связана sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint); sevseg.setBrightness(200); //+++++++++++++++++++++++++++++++++++++++++++ pinMode(RESET, INPUT_PULLUP); pinMode(START, INPUT_PULLUP); pinMode(interruptPin, INPUT_PULLUP); //EICRA &= ~(1 << ISC00); //Сбрасываем ISC00 EICRA = (1 << ISC01); // Устанавливаем ISC01 - отслеживаем FALLING на INT0 } ISR(INT0_vect) { //if (millis() - last_time >= 10 ) { counter++; //счетчик // last_time = millis();enc = // } } void loop() { int BtnReset = Btn5.key(RESET); //опрос кнопки ресет int BtnStart = Btn6.key(START); //опрос кнопки старт if (BtnStart == SHORT && flagStart == false) { //Старт EIMSK = (1 << INT0); // разрешаем прерывания flagStart = true; // поднимаем флаг } else if (BtnStart == SHORT && flagStart == true) { //Пауза EIMSK = (0 << INT0); // запрещаем прерывания flagStart = false; // сбрасываем флаг } if (BtnReset == SHORT) { //сброс EIMSK = (0 << INT0); // запрещаем прерывания distance = 0; // обнуляем переменную counter = 0; // обнуляем счетчик flagStart = false; // сбрасываем флаг } else if (flagStart == true) {// иначе если поднят флаг distance = counter; // из счетчика отправить достигнутом } sevseg.setNumberF(distance); // вывод "достигнутое" sevseg.refreshDisplay(); }
Может дребезг контактов плохо обрабатывается? Сэмулируй кнопку.
Может дребезг контактов плохо обрабатывается? Сэмулируй кнопку.
Да нет. Суть в чем. Когда например в режиме "Пауза", а индуктивный датчик не работает, то и нет приращения этой единицы.
А если в режиме "Пауза" или "Сброс", и при этом работает датчик, то только накинет единицу не более!
Тоесть проблема не в дребезге, там индуктивный датчик через оптрон!
Перед разрешением прерываний надо сбрасывать флаг прерывания.
Перед разрешением прерываний надо сбрасывать флаг прерывания.
Да все четко.
Всем спасибо, и мира нам.