Minulla on vaikeuksia lisätä attachIninterruptia luomassani kirjastossa. Tutkin paljon ja huomasin, että tämä on yleinen virhe, mutta eivät ymmärrä löytämiäni vastauksia.
Kyseinen virhe on tämä:
sketch_nov04a.ino: In function "void setup()": sketch_nov04a:10: error: argument of type "void (Teste::)()" does not match "void (*)()"
Kirjastoni on seuraava :
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++; } }
toteutukseni
#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); }
MUOKKAA : Päivitetty virhe ja korjattu Ignacion mainitsema ongelma
Vastaus
Ongelmana on, että wspeedIRQ()
on jäsenfunktio (eli se on osa Teste
-luokkaa) , mutta attachInterrupt()
expe cts ei-jäsenfunktio (ts. staattinen ja / tai ei lainkaan osa luokkaa).
Tämä on erittäin tärkeä ero C ++: ssa, koska se vaikuttaa siihen, kuinka kääntäjä kutsuu funktiota kulissien takana. Valitettavasti ei ole mitään tapaa käyttää jäsenfunktiota suoraan attachInterrupt()
kanssa.
Erilaiset kiertotavat ovat kuitenkin mahdollisia. Yksinkertaisin on kirjoittaa käärintofunktio, joka kutsuu jäsenfunktion. Esimerkki:
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); }
Lisähuomautuksena wspeedIRQ()
-toteutustasi ei käännetä tällä hetkellä joka tapauksessa Syy on, että this.
on virheellinen. Se on osoitin, joten oikea syntakse on this->
.
( Käytännössä sinun ei yleensä tarvitse käyttää this
jäsentietojen käyttämiseen. C ++ selvittää sen automaattisesti, ellei nimiristiriitoja ole.)
Vastaa
Normaalisti sinun tulisi käyttää digitalPinToInterrupt (pin) kääntääksesi todellisen digitaalisen nastan tiettyyn keskeytysnumeroon, ei nastakytkimen vertailu attachInturrupt (,,), joka on rajoitettu nastalle 2,3 arduino unossa … tai jos käytät enemmän rahaa hyvin … tässä luettelossa.
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 () ei ”t work b / c -arvoja ei voitu” palata millisistä () (älä kysy miksi) https://www.arduino.cc/en/Reference/AttachInterrupt selittää kuinka käyttää inturrupteja kuten anna minun lausua begginiini g
Keskeytykset ovat hyödyllisiä, jotta asiat tapahtuvat automaattisesti mikro-ohjainohjelmissa, ja ne voivat auttaa ratkaisemaan ajoitusongelmia. Hyviin tehtäviin keskeytyksen käyttämiseen voi kuulua kiertokooderin lukeminen tai käyttäjän syötteen tarkkailu …. blah blah
mitä pete ei maininnut, mitä keskeytyspalvelurutiinit olivat … ja kuinka nämä erityistoiminnot on ainutlaatuisia rajoituksia, muut toiminnot, kuten c ++: ssa, eivät …. c-merkkijonoista struktuureihin ylikuormittamiseen f-struktuureihin t-malleihin. ISR: t ovat mahdollisimman lyhyitä eikä niiden pitäisi palauttaa mitään! Jos halpa etkä halua käyttää yli 5 dollaria arduinoon, voit käyttää luonnosta useiden isr: ien käyttöön, voit asettaa ne prioriteettiksi
mutta muiden kuin jäsenfunktiojesi tulisi olla epävakaita ja globaaleja … ja millis () luottaa keskeytyksiin laskettaessa, joten se ei koskaan kasva ISR: n sisällä. Koska delay () edellyttää keskeytyksiä toimimaan, se ei toimi, jos sitä kutsutaan ISR: n sisään. micros () toimii alun perin, mutta alkaa toimia epätasaisesti 1-2 ms kuluttua. delayMicroseconds () ei käytä laskuria, joten se toimii normaalisti. ja …. globaaleja muuttujia käytetään siirtämään tietoja ISR: n ja pääohjelman välillä. Varmista, että ISR: n ja pääohjelman välillä jaetut muuttujat päivitetään oikein, julistamalla ne haihtuviksi.