Keresés

Hirdetés

Új hozzászólás Aktív témák

  • Aryes

    nagyúr

    válasz Imy #13579 üzenetére

    Ez a példa félig működik csak jól, mert ugyan minden változásra reagál, de a számlálást ugyanúgy a loopban végzi. A számlálást be kell tenni az isr-be, akkor jó lesz.
    Próbáld ezt:

    volatile boolean TurnDetected;
    volatile boolean up;
    volatile long virtualPosition=0;

    const int PinCLK=2; // Used for generating interrupts using CLK signal
    const int PinDT=3; // Used for reading DT signal
    const int PinSW=4; // Used for the push button switch

    void isr () { // Interrupt service routine is executed when any CHANGE transition is detected on CLK
    volatile boolean CLK = digitalRead(PinCLK);
    volatile boolean DT = digitalRead(PinDT);
    up=((!CLK && DT)||(CLK && !DT));
    if (up)
    virtualPosition++;
    else
    virtualPosition--;
    TurnDetected = true;
    }

    void setup () {
    pinMode(PinCLK,INPUT);
    pinMode(PinDT,INPUT);
    pinMode(PinSW,INPUT);
    attachInterrupt (0,isr,CHANGE); // interrupt 0 is always connected to pin 2 on Arduino UNO
    Serial.begin (9600);
    Serial.println("Start");
    }

    void loop () {

    if (!digitalRead(PinSW)) { // check if pushbutton is pressed
    virtualPosition=0; // if YES, then reset counter to ZERO
    Serial.print ("Reset = "); // Using the word RESET instead of COUNT here to find out a buggy encoder
    Serial.println (virtualPosition);
    }

    if (TurnDetected) { // do this only if rotation was detected
    TurnDetected = false; // do NOT repeat IF loop until new rotation detected
    Serial.print ("Count = ");
    Serial.println (virtualPosition);
    }
    }

    [ Szerkesztve ]

  • gyapo11

    őstag

    válasz Imy #13579 üzenetére

    Az interrupt megszakítást jelent, a futó programot elhagyja, és az interrupt kiszolgáló függvényt kezdi el futtatni.
    A példámban van egy loop() és van egy blink(). Azt tudjuk, hogy a loop() állandóan fut, ha a végére ér, akkor kezdi elölről. Na most a 2-es pint lehúzzuk testre. Ekkor a loopból kiugrik (megjegyzi, hogy hol tartott), és végrehajtja a blink() függvényt, amit hozzárendeltünk az interrupthoz. Ez a függvény ellentétesre váltja a led állapotát leíró változót, és a vezérlés visszatér oda, ahonnan az interrupt kirántotta, vagyis a loop()-ba. Röviden ennyi a lényeg. Érdemes még figyelni a prellre és az irq letiltására, ha bonyolultabb a függvény és több idő lehet a végrehajtása mint két interrupt közötti idő.

    menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

Új hozzászólás Aktív témák