Друзья, изучаю прерывания. Делаю простейшую программку, которая подсчитывает число нажатий на кнопку с записью значения в EEPROM. При нажатии на кнопку выводится нужное значение, но через короткое время плюсуется еще одно нажатие,т.е. одно нажатие фиксисируется, как 2. Плата МЕГА. Помогите, плиз, всю голову сломал, наверняка какая-то мелочь. Да и в сериал не выводится ничего почему-то. Код (C++): #define BUTTON_PIN 21 #include <SPI.h> // расширенная библиотека для работы с SD-картой #include <SdFat.h> // библиотека для работы с дисплеем #include <UTFT.h> // библиотека для вывода изображений на дисплей с SD-карты #include <UTFT_SdRaw.h> //подключаем заголовочный файл библиотеки EEPROM #include <EEPROM.h> #include <SimpleTimer.h> // пин ChipSelect к которому подключена SD-карта #define SD_CHIP_SELECT 53 // создаём объект работы с SD-картой SdFat sd; // создаём объект класса UTFT // и передаём идентификатор модели дисплея и номера управляющих пинов UTFT myGLCD(CTE32HR, 38, 39, 40, 41); // объявления встроенного шрифта extern uint8_t ArialNumFontPlus[]; // создаём объект для работы и вывода изображений на дисплей UTFT_SdRaw myFiles(&myGLCD); //счетчик int counter = 0; SimpleTimer timer; void setup() { pinMode(BUTTON_PIN,INPUT); //Инициализируем последовательный порт на 9600бит/сек: Serial.begin(9600); // инициализируем дисплей с вертикальной ориентацией myGLCD.InitLCD(); // очищаем экран myGLCD.clrScr(); // выбираем большой шрифт myGLCD.setFont(ArialNumFontPlus); // ждём успешной инициализации SD-карты while (!sd.begin(SD_CHIP_SELECT)) { // устанавливаем красный цвет «чернил» для печати и рисования myGLCD.setColor(VGA_RED); // печатаем строку в указанной строке позиции myGLCD.print("SD Card failed!", CENTER, 100); delay(1000); } // устанавливаем зелёный цвет для печати и рисования myGLCD.setColor(0,51,153); // печатаем строку в указанной строке позиции myGLCD.print("111111111", CENTER, 100); // ждём 1 секунду delay(1000); } void loop() { timer.run(); //тут будет программа attachInterrupt(2, like_count, RISING); } void like_count() { static unsigned long millis_prev;//дребезг if(millis()-100 > millis_prev); counter=EEPROM.read(0);//Читаем из памяти значение counter++; myFiles.load(0,0, 480, 320, "pic3.raw"); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.printNumI(counter, CENTER, 170);//выводим значение на экран EEPROM.write(0, counter); Serial.write(counter); }
attachInterrupt Уберите в setup. Эта строка ничего не делает. if(millis()-100> millis_prev); Этому не место в обработчике прерывания. Слишком тяжелые процедуры. Много времени занимают counter=EEPROM.read(0);//Читаем из памяти значение counter++; myFiles.load(0,0, 480, 320, "pic3.raw"); myGLCD.setBackColor(VGA_TRANSPARENT); myGLCD.printNumI(counter, CENTER, 170);//выводим значение на экран EEPROM.write(0, counter); Serial.write(counter);
Согласен, ну мне бы сначала понять почему так получается вместо одеого - два с этими нажатиями и прерываниями
Да. Только выставлять признак, что прерывание случилось. Даже дребезг не получится подавить в прерывании, потому как если кнопка сработает, то прерывания до следующего нажатия больше не будет и метод подавления не сработает.
Да действительно, все верно так оно и случилось. RC-фильтр и триггер сделали свое дело. Поставил их и никаких двойных-тройных срабатываний. Тему можно закрывать. Куда тут плюсик ставить в карму