2012-01-27 17 views
5

Tengo un pequeño error con mi último código de proyecto Arduino que usa el TimerOne library para mostrar números en una pantalla de 4 dígitos y 7 segmentos. Utilizo una interrupción para hacer que el microprocesador pase constantemente entre cada dígito, ya que están esencialmente conectados entre sí.No hay error de función coincidente al usar attachInterrupt

Tengo el código funcionando perfectamente si lo guardo todo en el archivo PDE principal, pero pensé que sería mejor aislar la pantalla en su propia clase.

Mi compilador está teniendo problemas con la segunda línea del código siguiente en el PDE:

Timer1.initialize(500); 
Timer1.attachInterrupt(digitDisplay.flashDigit,500); 

El segundo arg en attachInterrupt debería ser opcional, me han tratado con y sin esto! De todos modos me sale el siguiente error:

DigitDisplayTest.cpp: In function 'void setup()': 
DigitDisplayTest:29: error: no matching function for call to  'TimerOne::attachInterrupt(<unresolved overloaded function type>)' 
C:\Program Files (x86)\arduino-0022\arduino-0022\libraries\Timer1/TimerOne.h:62: note: candidates are: void TimerOne::attachInterrupt(void (*)(), long int) 

Dentro DigitDisplay (de los cuales digitDisplay es un ejemplo), defino flashDigit de la siguiente manera:

class DigitDisplay 
{ 
    private: 
    /*...*/ 
    public: 
    /*...*/ 
    void flashDigit(); 
} 

void DigitDisplay::flashDigit() 
{ 
    wipeDisplay(); 
    for (int i = 0; i < _digitCount ; i++) 
    { 
    if (i == _digit) digitalWrite(_digitPins[i], HIGH); 
    else digitalWrite(_digitPins[i], LOW); 
    } 
    displayNumber(_digits[_digit]); 
    _digit++ ; 
    _digit %= _digitCount; 
} 

Si requiere más código por favor hágamelo saber, pero estoy estoy bastante seguro de que no hay nada de malo con las gubbings del método flashDigit() - ciertamente funcionó antes de ponerlo dentro de su propia clase.

Obviamente pueden evitar este error mediante la adición de

void Interrupt() 
{ 
    digitDisplay.flashDigit(); 
} 

a la PDE principal y adjuntar esa función, pero eso es sólo un trabajo alrededor, sería bueno si pudiera llamar directamente.

veo el error es que ver con hacer un puntero de función (de los cuales uno no existe, por tanto, el error), pero los punteros no son mi punto fuerte, así que realmente podría hacer con una mano la clasificación esto.

+0

Su segundo ejemplo utiliza 'digitDisplay.flashDigit()' que es diferente a 'digitDisplay .flashDigit'. ¿Has intentado esto todavía? – gary

+0

Sí lo hice, no resuelve el problema, pero gracias de todos modos;) – SmallJoeMan

Respuesta

3

Estás muy cerca. El problema es una función miembro (flashDigit()) no es lo mismo que una función (función void()). Una función miembro es ptr a una función que podría cambiar en el tiempo de ejecución, a diferencia de una función que se conoce en tiempo de compilación. (de ahí el mensaje de error sobre el tipo de función sin resolver). Hay dos "soluciones alternativas". La primera función de sobre que señalas. Y segundo, si la función no necesita aprovechar los valores exclusivos de miembro de una instancia de la clase, la función miembro podría declararse estática.

static void flashDigit();

This is described in more detail in section 33.1-33.3 of the Cline's C++ FAQ

+0

Muchas gracias, eso es muy útil. – SmallJoeMan

1

tenía este mismo problema con la biblioteca de Arduino TWI y especificando la función de devolución de llamada. así que creé una función de envoltura estática que llama a los objetos de clase.

En mi archivo .h que tengo:

#ifndef Classname 
#define Classname 
class Classname { 
    pubic: 
    void receiveEvent(int numBytes); 
    static void receiveEvent_wrapper(int numBytes); 
}; 
#endif 

y en mi.cpp que tengo:

#include "Classname.h" 
void* pt2Object; 

void Classname::receiveEvent_wrapper (int numBytes){ 
    // explicitly cast to a pointer to Classname 
    Classname* mySelf = (Classname*) pt2Object; 

    // call member 
    mySelf->receiveEvent(numBytes); 
} 

ahora llaman a la función de contenedor en lugar

detalles y explicación completa aquí: http://www.newty.de/fpt/callback.html#static

Cuestiones relacionadas