AttachInterrupt i et bibliotek (Norsk)

Jeg har problemer med å legge til attachInterrupt i et bibliotek som jeg lager. Jeg undersøkte mye, og la merke til at dette er en vanlig feil, men forstår ikke helt svarene jeg fant.

Feilen det er snakk om er denne:

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

Biblioteket mitt er som følger :

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++; } } 

min implementering

#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); } 

EDIT : Oppdaterte feilen og korrigerte problemet sitert av Ignacio

Svar

Problemet er at wspeedIRQ() er en medlemsfunksjon (dvs. det er en del av klassen Teste) , men attachInterrupt() expe cts en ikke-medlemsfunksjon (dvs. en funksjon som er statisk og / eller ikke en del av en klasse i det hele tatt).

Dette er et veldig viktig skille i C ++ fordi det påvirker hvordan kompilatoren kaller funksjonen bak kulissene. Det er dessverre ingen måte å bruke en medlemsfunksjon direkte med attachInterrupt().

Ulike løsninger er imidlertid mulig. Det enkleste er å skrive en innpakningsfunksjon som kaller medlemsfunksjonen. For eksempel:

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); } 

Som en sidemerknad vil implementeringen av wspeedIRQ() ikke kompilere for øyeblikket uansett Årsaken er at this. er ugyldig. Det er en peker slik at riktig syntaks er this->.

( I praksis trenger du vanligvis ikke å bruke this for å få tilgang til medlemsdata. C ++ beregner det automatisk, med mindre det er en navnekonflikt.)

Svar

Normalt bør du bruke digitalPinToInterrupt (pin) for å oversette den faktiske digitale pin til det spesifikke interruptnummeret, ikke pin switch sammenligning attachInturrupt (,,) som er begrenset til pin 2,3 på en arduino uno … eller hvis du bruker mer penger godt … her «en liste.

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 () vant «t arbeid b / c-verdier vant» t retur fra millis () (ikke spør hvorfor) https://www.arduino.cc/en/Reference/AttachInterrupt forklarer hvordan du bruker forstyrrelser som la meg resitere begynnelsen g

Avbrudd er nyttige for å få ting til å skje automatisk i mikrokontrollerprogrammer, og kan bidra til å løse timingproblemer. Gode oppgaver for å bruke et avbrudd kan omfatte lesing av en roterende koder, eller overvåking av brukerinngang …. bla bla

hva pete ikke nevnte er hva Interrupt Service Routines var … og hvordan disse spesialfunksjonene har unike begrensninger andre funksjoner som i c ++ ikke …. fra c-strenger til structts til overbelastning til f-structs til t-templates. ISR er så korte som mulig og skal ikke returnere noe! Hvis din billige og ikke vil bruke mer enn $ 5 for en arduino, kan du bruke skisse for å bruke flere isr, kan du sette dem opp som prioritet

men ikke-medlemsfunksjonene dine skal være ustabile og globale … og millis () er avhengig av avbrudd for å telle, så det vil aldri øke i en ISR. Siden forsinkelse () krever avbrudd for å fungere, vil det ikke fungere hvis det kalles i en ISR. micros () fungerer i utgangspunktet, men vil begynne å oppføre seg uberegnelig etter 1-2 ms. delayMicroseconds () bruker ikke noen teller, så den fungerer som normalt. og … globale variabler brukes til å overføre data mellom en ISR og hovedprogrammet. For å sikre at variabler som deles mellom en ISR og hovedprogrammet oppdateres riktig, må du erklære dem som ustabile.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *