2014-11-04 2 views
0

У меня возникли проблемы с добавлением attachInterrupt в библиотеку, которую я создаю. Я много исследовал, и я заметил, что это распространенная ошибка, но не совсем понимаю ответы, которые я нашел.AttachInterrupt в библиотеке

Ошибка в вопросе заключается в следующем:

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

Моя библиотека выглядит следующим образом:

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

моя реализация

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

Решение этой проблемы можно найти здесь ->https://arduino.stackexchange.com/a/4865/3837

+0

Необходимость изложить ответы, которые вы нашли, и то, что вы не понимаете. –

+0

Сколько у вас опыта написания библиотек? похоже, что у вас нет конструктора и вы не вызываете объект. Ошибка заключается в том, что «windClicks» в вашем коде не существует. Обычно у вас будет глобальная переменная, с которой вы могли бы манипулировать, передав указатель в вашу библиотеку. Затем вызовите метод внутри библиотеки из прерывания. – djUniversal

+0

@djUniversal Это не похоже, что OP намеревается использовать объект. Метод объявляется 'static'. (Возможно, компилятор будет жаловаться, если OP также не использует 'static' в определении.) В противном случае библиотека выглядит отлично. – UncleO

ответ

0

Есть две проблемы: ISR не может принимать какие-либо аргументы; и вы используете переменную, которая не была объявлена.

Нет гарантии, что это будет работать, но вы можете попробовать

#include <Teste.h> 

volatile long lastWindIRQ; 
volatile byte windClicks = 0; 

void myISR() 
{ 
    Teste::wspeedIRQ(&lastWindIRQ, &windClicks); 
} 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(2, INPUT); 
    digitalWrite(2, HIGH); 
    attachInterrupt(0, myISR, FALLING); 
} 

void loop() 
{ 
    Serial.println(windClicks); 
    delay(3000); 
} 
+0

Это все еще, вероятно, не работает. Его библиотеки должны быть переписаны. – djUniversal

Смежные вопросы