SPI in einer Bibliothek nutzen [gelöst]

Hi Leute,

ich versuche gerade eine Bibliothek zu schreiben.

Datenstruktur:
"../arduino-1.0.3/libraries/AD7730/AD7730.h"
"../arduino-1.0.3/libraries/AD7730/AD7730.cpp"
"../arduino-1.0.3/libraries/AD7730/keywords.txt"

AD7730.h:

/*
  AD7730.h - Library for Analog Devices AD7730
*/

#ifndef AD7730_h
#define AD7730_h


class AD7730
{
  public:
    void init();													// Initialisierung laut Definitionen
    //void init(int SYNC,int POL,int RST,int STBY,int CSS,int RDY);
  private:
    void setPINs(void);
    int _AD7730_NCS;
    int _AD7730_NSYNC;
    int _AD7730_POL;
    int _AD7730_NRST;
    int _AD7730_NSTBY;
    int _AD7730_NRDY;
};

/*
Pinmap AD7730
             #########################
SCK------01-###SCLK             DGND###-24------GND
XTAL1----02-###MCLK IN          DVDD###-23------5VD
XTAL1----03-###MCLK OUT          DIN###-22-----MOSI
A0-------04-###POL              DOUT###-21-----MISO
A1-------05-###/SYNC/          /RDY/###-20-------A2
RST------06-###/RESET/          /CS/###-19-------A3
NC-------07-###VBIAS       /STANDBY/###-18------5VD
GND------08-###AGND            /ACX/###-17-------NC
5VD------09-###AVDD              ACX###-16-------NC
Vref/2---10-###AIN1(+)     REF IN(-)###-15------GND
DMS------11-###AIN1(-)     REF IN(+)###-14-----Vref
NC-------12-###AIN2(+)/D1 AIN2(-)/D2###-13-------NC
             #########################
*/

//###########   AD7730 Definitionen   ######################

#define    AD7730_PIN_NSTANDBY   0  //VCC
#define    AD7730_PIN_NRESET     0  //Reset uC
#define    AD7730_PIN_NCS       A3
#define    AD7730_PIN_NRDY      A2
#define    AD7730_PIN_NSYNC     A1
#define    AD7730_PIN_POL       A0
#endif

AD7730.cpp:

/*
  AD7730.cpp - Library for Analog Devices AD7730
*/
#include <SPI.h>
#include <Arduino.h>
#include "AD7730.h"

void AD7730::init()
{ _AD7730_NCS  =AD7730_PIN_NCS;
  _AD7730_NSYNC=AD7730_PIN_NSYNC;
  _AD7730_POL  =AD7730_PIN_POL;
  _AD7730_NRST =AD7730_PIN_NRESET;
  _AD7730_NSTBY=AD7730_PIN_NSTANDBY;
  _AD7730_NRDY =AD7730_PIN_NRDY;
  setPINs();  
  //SPI 
 SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST); 
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.begin();

}
/*void AD7730::init(int SYNC,int POL,int RST,int STBY,int CSS,int RDY)
{
}
*/
void AD7730::setPINs(void){
  if (_AD7730_NSTBY){
  pinMode(_AD7730_NSTBY     , OUTPUT);
  digitalWrite(_AD7730_NSTBY,   HIGH);
  }
  if (_AD7730_NRST){
  pinMode(_AD7730_NRST       , OUTPUT);
  digitalWrite(_AD7730_NRST  ,   HIGH);
  }
  if (_AD7730_NCS){
  pinMode(_AD7730_NCS       , OUTPUT);
  digitalWrite(_AD7730_NCS  ,   HIGH);
  }
  if (_AD7730_POL){
  pinMode(_AD7730_POL       , OUTPUT);
  digitalWrite(_AD7730_POL ,   HIGH);
  }
  if (_AD7730_NSYNC){
  pinMode(_AD7730_NSYNC     , OUTPUT);
  digitalWrite(_AD7730_NSYNC,   HIGH);
  }
  pinMode(_AD7730_NRDY      ,  INPUT);
}

wie gesagt, bin dabei...

dann rufe ich es in einem sketch auf:

#include <AD7730.h>
AD7730 ADC;

void setup(){
  ADC.init();
}

....

Problem ist das ich in der init Funktion schon fehler bekomme: 'SPI' was not declared in this scope

was mache ich falsch?!

Bevor diese interessante Frage verloren geht:
Ich weiss es auch nicht ...

In meiner SPI.h (in arduino-1.0.3\libraries\SPI ) steht

** **extern SPIClass SPI;** **

Damit sollte das Objekt SPI deklariert sein.

Allerdings steht bei mir in SPI.h auch

[b][i]static [/i][/b]void setDataMode(uint8_t);

in deiner AD7730::init Routine könntest du also

    SPIClass::setDataMode(SPI_MODE0);

schreiben. Verändert das irgendwas ? Rutscht der Fehler eine Zeile weiter ... ?

Was passiert in der Arduino IDE, wenn du #include <SPI.h> ganz am Anfang deines sketch einfügst ?

Nachtrag:
und was ändert sich, wenn du deine eigene library nicht in arduino-1.0.3\libraries sondern im libraries Ordner deiner sketches ( empfohlen, damit sie nicht beim nächsten Upgrade weg ist )
oder zum Testen erstmal in zusammen mit deinem Test in einen gemeinsamen Ordner packst, und in deinem Test

#include "AD7730.h"  // Anführungszeichen statt spitzer Klammern

schreibst ?

Hallo!

Füg mal in der cpp folgendes ein:
AD7730::AD7730 () {}

und in der .h unter public:
AD7730();

Gruß
Reinhard

Ps.: vielleicht löst folgender Forumsbeitrag das Problem:

Das hat mit der Art und Weise zu tun, wie die IDE eruiert, was zum Sketch gehört, also auch compiliert und gelinkt werden muss. Wenn Du im Sketch am Anfang kein

#include "SPI.h"

einfügst, weiss die IDE nicht, dass sie diese Bibliothek auch compilieren muss, damit das ganze Programm am Schluss gelinkt werden kann.

In meiner SPI.h (in arduino-1.0.3\libraries\SPI ) steht

extern SPIClass SPI;

Damit sollte das Objekt SPI deklariert sein.

Allerdings steht bei mir in SPI.h auch
static void setDataMode(uint8_t);

in deiner AD7730::init Routine könntest du also
SPIClass::setDataMode(SPI_MODE0);
schreiben. Verändert das irgendwas ? Rutscht der Fehler eine Zeile weiter ... ?

so wie ich es verstanden hab bedeutet das extern in der header datei nur das es wo anders deklariert wird, was es in der SPI.cpp dann wird, da wird die Klasse SPIclass als Objekt SPI instanziiert.

am Konstruktor und destruktor lag es nicht, da hatte ich es vorher drinn.
und bei dem anderen Forumsbeitrag war die Klasse nicht instanziert, was bei mir ja der Fall war.

ABER

#include <SPI.h>

im Sketch hat es behoben, hatte es auch mal in dem Header probiert, aber das macht keinen Unterschied.

Hi Pumukel,

hast Du die Lib fertig bekommen? Ich wäre sehr daran interessiert da ich die gleiche Hardware für mein Projekt nutze. Hättest Du interesse die Lib zu veröffentlichen?

Vielen Dank
ToM