Arduino UNO net 3 kartus greitesnis pin nuskaitymas

Jeigu pažiūretume į Arduino.h karkaso vidurius pamatytume, jog kiekviena kartą kvieciant funkciją digitalRead – kviečiamos 3 funkcijos. Tai galima optimizuot jas iškėlus i klasės konstruktorių. Pavizdys žemiau:

class GPIO {
  private:
    uint8_t timer;
    uint8_t bit;
    uint8_t port;
    uint8_t pin;
    uint8_t reg;

  public:
    GPIO(uint8_t _pin, uint8_t dir) {
      pin = _pin;
      pinMode(pin, dir);
      uint8_t timer = digitalPinToTimer(pin);
      uint8_t bit = digitalPinToBitMask(pin);
      uint8_t port = digitalPinToPort(pin);
    }

    bool read() {
      if (*portInputRegister(port) & bit) return HIGH;
      return LOW;
    }
};

Klasė naudojama šitaip:

// globalus kintamasis pin13 rodantis į pin 13 mode INPUT_PULLUP
GPIO pin13(13, INPUT_PULLUP);

ir galiausiai void loop:

Serial.println(pin13.read());

Related Posts