Forum: Mikrocontroller und Digitale Elektronik Direkte Signalgenerierung unter C++


von Rudi (Gast)


Lesenswert?

Bisher habe ich kaum Microcontrollerprojekte in C++ gesehen - deshalb 
wollte ich einfach mal diese Sprache für ein kleines AVR-Projekt 
ausprobieren.

Das habe ich dann mit einer Erarbeitung der direkten digitalen Synthese 
(DDS) für mich verbunden. Ich habe das Resultat in Form einer 
Ausarbeitung zusammengefaßt - vielleicht hilft es dem einen oder 
anderen.

Mein Fazit: C++ kann sich durchaus lohnen. Allein der objektbasierende 
Ansatz verhilft dazu, daß die Daten und die darauf arbeitenden Methoden 
"zusammengepackt" sind, womit zum einen keine explizite Übergabe von 
Adressen mehr nötig sind und zum anderen Fehlerquellen bei der 
Verwendung reduziert werden.
Übersichtlicher wird der Quellcode dadurch auf jeden Fall.

Für die DDS kann sich auch die volle Objektorientierung lohnen, indem 
das Funktionsprinzip und die Schnittstelle der DDS in einer Basisklasse 
implementiert wird, von der dann abgeleitete Klassen für die 
verschiedenen Signalformen (Sinus, Rechteck, Dreieck) abgeleitet werden.

http://www.knoerig.de/AVR-CPP.html#SinGen

von Daniel T. (Gast)


Lesenswert?

Hallo Rudi,

danke für deinen Beitrag. Ich hätte da noch ein paar Fragen...

1. Mit welchem Tool kann man diesen Code übersetzen?
2. Vermischt du in der main.c nicht c mit c++? Soweit ich weiß können 
dabei "unfindbare" Fehler auftreten.
3. Was steht in der main.cpp drin? Ist dies das gleiche Programm wie in 
der main.c nur in assembler?

von Rudi (Gast)


Lesenswert?

Ups... Es ist die main.c. Ich habe das Makefile von diesem Forum hier 
leicht angepaßt, aber es nicht so ganz hinbekommen daß er .cpp-Dateien 
verarbeitet.

Deshalb habe ich nach einigem Grummeln die Sache bei der main.c 
belassen....

Kann man bestimmt schöner hinbekommen, aber in Sachen Makefiles kenne 
ich mich nur grundlegend aus.

von Klaus W. (mfgkw)


Lesenswert?

Woran ist es gescheitert?
Hat make dir dauernd den Quelltext gelöscht?

von Rudi (Gast)


Lesenswert?

Yep. So prinzipiell habe ich ja verstanden wie das Makefile arbeitet, 
aber so genau kenne ich mich mit den generischen Anweisungen nicht 
aus...
Jedenfalls habe ich das Handtuch geworfen, bin bei der main.c geblieben 
und habe mich der eigentlichen Aufgabe gewidmet.

von Sven P. (Gast)


Lesenswert?

Der Vektor mit der Sinustabelle ist auch noch doppelt definiert.

Aber irgendwie is das jetzt kein soooo überzeugender Einsatz von C++, um 
ehrlich zu sein :-/

von Rudi (Gast)


Lesenswert?

Das geht auch auf die schlechte Adaption des Makefiles zurück - geplant 
war, aus dem Klassenobjekt ein "abgeschlossenes" Modul zu bauen.
Entnervt habe ich dann den Sinus-Vektor in die Deklaration übernommen.

Ich gebe offen zu - das Makefile hätte ich selbst noch einmal schreiben 
sollen!

von Klaus W. (mfgkw)


Lesenswert?

Den Ärger hatte ich nämlich auch mal mit einem
Makefile aus dem Forum, als ich mit C++ arbeiten wollte.
Das Problem ist, daß ein Listing erzeugt werden soll, und
der Name dafür nur für *.c sinnvoll erzeugt wird.

In der Originalversion steht eine Zeile in der Art:
1
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
Mit dem $(<:.c=.lst) wird vom Dateinamen das .c am Ende weggenommen
und durch .lst ersetzt; der so erzeugte Name wird dann später
für das Listing benutzt.
Bei einer *.cpp wird nichts ersetzt, weil sie nicht auf .c endet,
und der Name des Listingfiles wird wundersamerweise identisch
mit dem des Quelltextes. Damit wird dann beim Kompilieren der
Quelltext zerstört :-(

Meine Korrektur sieht so aus:
1
CFLAGS += -Wa,-adhlns=$<.lst
Dabei wird dann nichts mehr ersetzt, sondern einfach .lst
angehängt. Zu a.c und b.cpp werden also die Listings a.c.lst und
b.cpp.lst erzeugt.

Vielleicht könnte man ja mal die Vorlage in der Art korrigieren?

von Klaus W. (mfgkw)


Lesenswert?

Sven P. schrieb:
> Aber irgendwie is das jetzt kein soooo überzeugender Einsatz von C++, um
> ehrlich zu sein :-/


Aber für C auch nicht überzeugender :-)

von Rudi (Gast)


Lesenswert?

@Klaus Wachtler: Werde ich demnächst unbedingt ausprobieren!
Der Makefile-Spezialist bin ich leider nicht....

Mea culpa - lastet der Programmiersprache nicht meine Übereiltheit mit 
der Doppeldeklaration an!

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.