Помогите разобраться с прерыванием

Тема в разделе "Arduino & Shields", создана пользователем Dim_, 23 фев 2017.

  1. Dim_

    Dim_ Нуб

    Друзья, изучаю прерывания. Делаю простейшую программку, которая подсчитывает число нажатий на кнопку с записью значения в 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);
    }
     
  2. mcureenab

    mcureenab Гуру

    Код (C++):
    pinMode(BUTTON_PIN,INPUT_PULLUP);
    Только что тема про кнопки обсуждалась
     
  3. Dim_

    Dim_ Нуб

    Не помогает. Изначально у меня так и было. Да, забыл добавить кнопка поддтянута внешним резистором
     
  4. mcureenab

    mcureenab Гуру

    Триггер шмидта попробуйте или RC фильтр или все вместе.
     
    Dim_ нравится это.
  5. mcureenab

    mcureenab Гуру

    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);
     
  6. ostrov

    ostrov Гуру

    И EEPROM угробите быстро. Хотя бы put используйте.
     
  7. Dim_

    Dim_ Нуб

    А что мне в обработчике оставить? Инкремент только?
     
  8. Dim_

    Dim_ Нуб

    Согласен, ну мне бы сначала понять почему так получается вместо одеого - два с этими нажатиями и прерываниями
     
  9. mcureenab

    mcureenab Гуру

    Да. Только выставлять признак, что прерывание случилось.
    Даже дребезг не получится подавить в прерывании, потому как если кнопка сработает, то прерывания до следующего нажатия больше не будет и метод подавления не сработает.
     
  10. Dim_

    Dim_ Нуб

    Хм...может действительно в этом дело. Спасибо! Будем пробовать.
     
  11. Dim_

    Dim_ Нуб

    Да действительно, все верно так оно и случилось. RC-фильтр и триггер сделали свое дело. Поставил их и никаких двойных-тройных срабатываний. Тему можно закрывать. Куда тут плюсик ставить в карму
     
  12. ostrov

    ostrov Гуру

    Плюсик тут называется "Мне нравится".
     
  13. Dim_

    Dim_ Нуб

    ОК. Буду знать