AttachInterrupt egy könyvtárban

Problémáim vannak az általam létrehozott könyvtárban az attachInvertrup hozzáadásával. Sokat kutattam, és észrevettem, hogy ez gyakori hiba, de nem nagyon értem a talált válaszokat.

A kérdéses hiba a következő:

sketch_nov04a.ino: In function "void setup()": sketch_nov04a:10: error: argument of type "void (Teste::)()" does not match "void (*)()" 

A könyvtáram a következő :

Teste.h

#ifndef TESTE_H #define TESTE_H #include <Arduino.h> class Teste { public: volatile long lastWindIRQ; volatile byte windClicks; void wspeedIRQ(); }; #endif 

Teste.cpp

#include "Teste.h" void Teste::wspeedIRQ() { if (millis() - this.lastWindIRQ > 10) { this.lastWindIRQ = millis(); this.windClicks++; } } 

megvalósításom

#include <Teste.h> Teste teste; void setup() { Serial.begin(9600); pinMode(2, INPUT); digitalWrite(2, HIGH); attachInterrupt(0, teste.wspeedIRQ, FALLING); } void loop() { Serial.println(teste.windClicks); delay(3000); } 

SZERKESZTÉS : Frissítette a hibát és kijavította az Ignacio által idézett problémát. = “answer”>

A probléma az, hogy a wspeedIRQ() egy tagfüggvény (vagyis a Teste osztály része) , de attachInterrupt() expe cts nem tag függvény (azaz statikus és / vagy egyáltalán nem része az osztálynak).

Ez nagyon fontos megkülönböztetés a C ++ – ban, mert befolyásolja, hogy a fordító hogyan hívja a függvényt a kulisszák mögé. Sajnos a tagfunkciót nem lehet közvetlenül használni a attachInterrupt() alkalmazással.

Különböző megoldások azonban lehetségesek. A legegyszerűbb egy burkoló függvényt írni, amely meghívja a tag függvényt. Például:

Teste teste; // This is a non-member function... void isr() { // ...which calls the member function: teste.wspeedIRQ(); } void setup() { //... // Setup interrupt to use a non-member function attachInterrupt(0, isr, FALLING); } 

Megjegyzendő, hogy a wspeedIRQ() megvalósítása amúgy sem fog fordítani jelenleg Ennek az az oka, hogy az this. érvénytelen. Ez egy mutató, tehát a helyes szintaxis a következő: this->.

( A gyakorlatban általában nem kell a this t használni a tagok adatainak eléréséhez. A C ++ automatikusan kitalálja, hacsak nincs névütközés.)

Válasz

Általában a digitalPinToInterrup (pin) használatával kell a tényleges digitális csapot lefordítani az adott megszakítási számra, nem pedig a pin kapcsoló összehasonlító attachInturrupt (,,) 2,3-as tűre korlátozva egy arduino uno … vagy ha több pénzt költenél jól … itt a lista.

Board Digital Pins Usable For Interrupts Uno, Nano, Mini, other 328-based 2, 3 Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 Micro, Leonardo, other 32u4-based 0, 1, 2, 3, 7 Zero all digital pins, except 4 MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 Due all digital pins all digital pins (Only pins 2, 5, 7, 8, 10, 11, 12, 13 work with CHANGE 

delay () nem nyert “t munka b / c értékeket” nem tér vissza millis () értékből (ne kérdezd miért) https://www.arduino.cc/en/Reference/AttachInterrupt elmagyarázza, hogyan kell használni az inturruptokat, például hadd mondjam el a begginint g

A megszakítások hasznosak ahhoz, hogy a mikrovezérlő programokban a dolgok automatikusan történjenek, és segíthetnek az időzítési problémák megoldásában. A megszakítás használatának jó feladatai közé tartozhat a forgókódoló olvasása vagy a felhasználói bemenet figyelése … bla bla

Pete nem említette, hogy mi volt a megszakító szolgáltatás rutin … és ezek a speciális funkciók egyedi korlátai vannak más funkcióknak, mint például a c ++ -nak, nincs …. a c-stringektől a struktúrákon át a túlterhelésen át az f-struktúrákon át a t-sablonokig. Az ISR-ek a lehető legrövidebbek, és nem adhatnak vissza semmit! ha az olcsó és nem akar többet költenek 5 dollárnál többet egy arduinóra, akkor a vázlat segítségével több isr is használható, ezeket prioritásként állíthatja be

de a nem tagfüggvényeinek ingatagnak és globálisnak kell lenniük … és a millis () a megszakításokra támaszkodik a számláláshoz, így soha nem fog növekedni egy ISR-en belül. Mivel a delay () megszakításokat igényel, így nem fog működni, ha egy ISR belsejében hívják meg. A micros () kezdetben működik, de 1-2 ms után rendellenesen fog viselkedni. delayMicroseconds () nem használ számlálót, ezért a szokásos módon fog működni. és …. globális változókat használnak az adatok továbbítására egy ISR és a fő program között. Annak érdekében, hogy az ISR és a fő program között megosztott változók megfelelően frissüljenek, nyilvánítsa őket ingatagnak.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük