Forum: Mikrocontroller und Digitale Elektronik Arduino Library bauen


von LeiderNichtVerfügbar A. (Firma: Keine) (strgfn)


Lesenswert?

Hey Leute,

ich versuche derzeit einen digitalen filter aufzubauen und bin dabei auf 
folgende nützliche Webseite gestoßen:

http://t-filter.engineerjs.com/

In dieser kann einstellen welche Funktion der digitale Filter welchen 
man aufbauen möchte haben soll und das Programm gibt dir die 
Entsprechenden Filterkoeffizienten + Sourcecode.

Der Code den man bekommt sieht wie folgt aus:

-------------------SampleFilter.c--------------

1
#include "SampleFilter.h"
2
3
static int filter_taps[SAMPLEFILTER_TAP_NUM] = {
4
  1570,
5
  600,
6
  627,
7
  600,
8
  1570
9
};
10
11
void SampleFilter_init(SampleFilter* f) {
12
  int i;
13
  for(i = 0; i < SAMPLEFILTER_TAP_NUM; ++i)
14
    f->history[i] = 0;
15
  f->last_index = 0;
16
}
17
18
void SampleFilter_put(SampleFilter* f, int input) {
19
  f->history[f->last_index++] = input;
20
  if(f->last_index == SAMPLEFILTER_TAP_NUM)
21
    f->last_index = 0;
22
}
23
24
int SampleFilter_get(SampleFilter* f) {
25
  long long acc = 0;
26
  int index = f->last_index, i;
27
  for(i = 0; i < SAMPLEFILTER_TAP_NUM; ++i) {
28
    index = index != 0 ? index-1 : SAMPLEFILTER_TAP_NUM-1;
29
    acc += (long long)f->history[index] * filter_taps[i];
30
  };
31
  return acc >> 16;
32
}


und:
----------------------SampleFilter.h-----------------
1
#ifndef SAMPLEFILTER_H_
2
#define SAMPLEFILTER_H_
3
4
/*
5
6
FIR filter designed with
7
 http://t-filter.appspot.com
8
9
sampling frequency: 1000 Hz
10
11
fixed point precision: 16 bits
12
13
* 0 Hz - 5 Hz
14
  gain = 1
15
  desired ripple = 5 dB
16
  actual ripple = n/a
17
18
* 100 Hz - 500 Hz
19
  gain = 0
20
  desired attenuation = -40 dB
21
  actual attenuation = n/a
22
23
*/
24
25
#define SAMPLEFILTER_TAP_NUM 5
26
27
typedef struct {
28
  int history[SAMPLEFILTER_TAP_NUM];
29
  unsigned int last_index;
30
} SampleFilter;
31
32
void SampleFilter_init(SampleFilter* f);
33
void SampleFilter_put(SampleFilter* f, int input);
34
int SampleFilter_get(SampleFilter* f);
35
36
#endif



ich muss zugeben, wie dieser Filter (habe einfach schnelle ein par werte 
genommen also nicht auf die Koeffizienten achten) funktioniert weiß ich 
noch nicht, aber leider auch nicht wie ich diesen in meinen Code 
(programmiere ein Arduino) einbauen kann.

Wenn ich das richtig verstanden habe sind das doch die beiden Dateien 
die ich für eine library brauche oder? Muss ich hier also eine eigene 
Library erstellen?

Aber wie baue ich eine solche auf? einfach ein daraus eine .cpp und eine 
.h "text" erstelle und ein #include Arduino.h einfüge?

Hab hier leider noch nicht sehr viel Ahnung und hoffe jemand kann sein 
Wissen hier mit mir teilen...

LG

von Michael U. (amiga)


Lesenswert?

Hallo,

Mach Deinem Sketch auf.
Geh rechts auf die Tab-Auswahl -> neuer Tab
SampleFilter.h
Inhalt für die .h reinkopieren.

- neuer Tab
SampleFilter.ino
Inhalt für die .c reinkopieren.

Die .h in Deinen Sketch includen und benutzen...

Wenn die .ino lieber .c heißen soll:
So bennenen und die .h um die C++-Abfrage ergänzen:

#ifdef __cplusplus
extern "C"{
#endif

der Inhalt der .h Datei

#ifdef __cplusplus
}
#endif

Wenn die .c .ino heißt kümmert sich die IDE offenbar da selber.

Die Dateien sind in Deinem Projektordner und werden dann beim Öffnen 
Deines Sketches automatisch in den Tabs mitgeladen und angezeigt und 
mitcompiliert.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von LeiderNichtVerfügbar A. (Firma: Keine) (strgfn)


Lesenswert?

Das bedeutet wenn ich diese beiden Dateien einfach hineinkopiere und die 
.c in .ino umbenenne kann ich die drei methoden

void SampleFilter_init(SampleFilter* f);
void SampleFilter_put(SampleFilter* f, int input);
int SampleFilter_get(SampleFilter* f);

einfach in meinem scetch verwenden?

Bringt die erste Methode in der ich den Code erweitere einen Vorteil?

Danke im Voraus für die große Hilfe

von Michael U. (amiga)


Lesenswert?

Hallo,

ja, probier es doch einfach...

Einen Vorteil habe ich beim Einbau der C++-Abrage nicht bemerkt, bei 
einigen C/C++-Programmierern mögen sich bei der .ino-Geschichte die 
Fußnägel aufrollen ;) Ich habe das eher per Zufall entdeckt. Der 
Preprozessor der Arduino-Geschichte hat da offenbar ein paat Abfragen 
eingebaut, die durchaus praktisch und nützlich sind.

Gruß aus Berlin
Michael

von Markus L. (rollerblade)


Lesenswert?

Michael U. schrieb:
> Die Dateien sind in Deinem Projektordner und werden dann beim Öffnen
> Deines Sketches automatisch in den Tabs mitgeladen und angezeigt und
> mitcompiliert.
Na ja, Library geht anders. Eine Library ist bereits compiliert und wird 
beim Linken angegeben. Zu einer Library gehört immer min. ein Header, 
der die öffentlichen Symbole deklariert, die die Library enthält: ihr 
API.

So wie Du das beschrieben hast, wird von der "Library" immer alles mit 
in den Sketch compiliert, unabhängig davon, ob es überhaupt verwendet 
wird. Das bläht den Sketch unnötig auf.

Kann die Arduino-IDE überhaupt Libraries?

von knollo (Gast)


Lesenswert?

Markus L. schrieb:
> Kann die Arduino-IDE überhaupt Libraries?

Ja, kann sie. Die sind allerdings tatsächlich im Quellcode vorhanden, 
und nicht fertig kompiliert.

von Michael U. (amiga)


Lesenswert?

Halllo,

Markus L. schrieb:
> Na ja, Library geht anders. Eine Library ist bereits compiliert und wird
> beim Linken angegeben. Zu einer Library gehört immer min. ein Header,
> der die öffentlichen Symbole deklariert, die die Library enthält: ihr
> API.

wir sind aber immernoch beim AVR...
Wieviele compilierte Libs (nicht nur deren Source zum selber 
compilieren) findest Du dazu so im Netz?

Gruß aus Berlin
Michael

von Markus L. (rollerblade)


Lesenswert?

Michael U. schrieb:
> Wieviele compilierte Libs (nicht nur deren Source zum selber
> compilieren) findest Du dazu so im Netz?
Es geht ja darum, selbst eine Library zu erstellen. Mit der Zeit kann 
sich ja so einiges an Wiederverwertbarem ansammeln. Das dann alles immer 
wieder neu zu compilieren und nicht dem Linker entscheiden zu lassen, 
nur das verwendete auch tatsächlich dazu zu linken, finde ich recht 
ungeschickt. Auch angesichts der begrenzten Resourcen eines µC.

von Michael U. (amiga)


Lesenswert?

Hallo,

die Entscheidung, aus der Sache eine lib zu bauen bleibt ihm ohnehin, 
Beschreibungen dazu liegen im Netz.

Bist Du Dir sicher, das daß Arduino-Umfeld das Linkerscript entsprecehnd 
modifiziert und wirklich nur Teile einbindet und kann die Kombi mit dem 
GGC das in diesem Umfeld auch leisten?

Mein Hinweis zum Vorgehen bezog sich erstmal darauf, den Kram in Gang zu 
bringen. Erst mühsam eine Lib bauen und dann feststellen, daß man es 
eigentlich garnicht gebrauchen und nutzen kann, ist auch nicht so 
motivierend.

Gruß aus Berlin
Michael

von Markus L. (rollerblade)


Lesenswert?

Hi,

daher ja mein Frage dannach, ob die Arduino-IDE Libraries überhaupt 
unterstützt.
Die IDE macht ja grundsätzlich C++ und setzt noch was drauf (Sketch mit 
seinen Automatismen), verfügt also über einen C++ Compiler. In C++ ist 
es sehr üblich, gegen Libraries und deren API zu programmieren, die beim 
Linken angegeben werden.

Eine Sammlung von Quelldateien stellt keine Library im Sinne eines C++ 
Compilers und seinem Linker dar.

Grüße, Markus

von W.A. (Gast)


Lesenswert?

Markus L. schrieb:
> Die IDE macht ja grundsätzlich C++ und setzt noch was drauf (Sketch mit
> seinen Automatismen), verfügt also über einen C++ Compiler.

Die IDE ruft IMHO den AVR-GCC auf.

von Markus L. (rollerblade)


Lesenswert?

Hi,

gerade recherchiert:
Mit dem Atmel Studio baut sich eine Static Library so: 
http://www.atmel.com/webdoc/atmelstudio/atmelstudio.Project.StaticLibrary.html

Mit der Arduino IDE geht das on-the-fly und es braucht keine eigens 
erstellte Static Library für die eigenen wiederverwendbaren 
Funktionen/Klassen:
.c/.cpp -> .o -> static library -> Link zum Main Sketch:
"Only the parts of the library needed for your sketch are included in 
the final .hex file, reducing the size of most sketches.", siehe 
https://www.arduino.cc/en/Hacking/BuildProcess .

Ich frag mich gerade, wie's dahingehend in Eclipse CDT + Arduino Plugin 
aussieht.

Grüße, Markus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.