Forum: Compiler & IDEs Arduino IDE -> Atmel Studio Projekt importieren


von john (Gast)


Lesenswert?

Hallo,

ich habe mal eine Frage zur Arduino IDE:

Und zwar möchte ich ein vorhandenes Atmel Studio Projekt in Arduino IDE 
importieren.

Im Internet war nichts darüber zu finden (nur von Arduino zu Studio)


Also habe ich es einfach mal ausprobiert:
- main.cpp kopiert und entsprechend bei setup() und Loop() eingefügt
- #include's eingefügt
- entsprechende .h und .cpp datein in den arduino ordner kopiert.


Auf compilieren gedrückt (für Arduino Pro Mini).....


Und es wurde ohne Fehler compiliert.
Schön....Aber wo ist der Haken? Ich finde das ging jetzt zu einfach?
Oder ist das wirklich so einfach?


Ich kann leider die funktion nicht testen weil die Hardware noch 
garnicht fertig ist.

Kann ich jetzt in dem Code einfach Arduino funktionen nutzen? 
(vorrausgesetzt das keine Pins doppelt genutzt werden usw.)

Ich habe noch nier mit Atmel Studio oder Atmegas gearbeitet, nur eben 
mit der Arduino IDE.

von john (Gast)


Lesenswert?

Der Haken ist wohl folgender:


Das Programm läuft nicht. Selbst die LED's  können nicht aktiviert 
werden. Auch nicht mit den Arduino funktionen.

Lustiger nebeneffekt. Wenn die Main.cpp aus dem Arduino Ordner gelöscht 
wird (Wird ja nicht benötigt, steht ja alles im .ino file), kann das 
projekt nicht mehr in Arduino IDE kompiliert werden.


Aber eigentlich sollte das doch möglich sein?

von Michael U. (amiga)


Lesenswert?

Hallo,

mach einen neuen leeren Sketch in der IDE auf.
Lösche den Inhalt (setup() und loop() und kopieren den Inhalt Deiner 
main rein.
Speichere den Sketch. Schließe die IDE und kopieren alle anderen Dateien 
die zum Projekt hehören in den Sketchordner. Dann starte die IDE, mach 
den Sketch auf und compiliere und schau Dir an, wo er mault (erweiterte 
Ausgaben beim Compilieren in den Einstellungen einschalten).

Die ArduinoIDE compiliert das dann ohne Einbindung der Arduino-Sachen, 
es muß also ein prinzipiell komplett lauffähiges Projekt sein und die 
main muß als Sketchname.ino im Ordner Skezchname im Sketchbook liegen.
Mit plain c klappt bei kleinen Projekten bei mir meist ohne sonderliche 
Nacharbeit, mit C++ habe ich es noch nicht genutzt.
Wenn beim C++  reine C-Sachen dabei sind, darfst Du vermutlich die .h 
noch mit
1
#ifdef __cplusplus
2
extern "C" {
3
#endif
4
5
C-Headerfile-Inhalt
6
7
#ifdef __cplusplus
8
}
9
#endif
sonst kann er die Verweise nicht auflösen.

Gruß aus Berlin
Michael

von john (Gast)


Lesenswert?

Hallo Michael,

das werde ich mal ausprobieren.
Lässt es sich denn trotzdem einrichten die Arduino funktionen und Libs 
zu nutzen?

Den reinen C/C++ Code kann ich auch im Atmel Studio nutzen.
Es ging mir darum das Projekt mit den einfachen Arduino Hilfsmitteln zu 
erweitern.

von Michael U. (amiga)


Lesenswert?

Hallo,

john schrieb:
> Hallo Michael,
>
> das werde ich mal ausprobieren.
> Lässt es sich denn trotzdem einrichten die Arduino funktionen und Libs
> zu nutzen?

Kannst Du kombinieren, ich habe nur mal alte C-Routinen für 
RFM-Funkmodule von mir in ein Arduino Projekt eingebaut, ging für mich 
recht problemlos.
Komplexe Kombinationen habe ich da noch nicht gebaut, mein Bekannter hat 
mal das BT-Audio Beipiel aus den IDK-Demosourcen vom ESP32 in die IDE 
gepackt, so 2 Stunden später lief der Compiler fehlerfrei durch. Das lag 
aber mehr daran, daß das der Demo-Source schon nichtmehr zum aktuellen 
IDK passte.

Zumindest hatten wir dann einen BT-Lautsprecher mit ESP32.

Gruß aus Berlin
Michael

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

john schrieb:
> Und zwar möchte ich ein vorhandenes Atmel Studio Projekt in Arduino IDE
> importieren.
Vergiss das, dafuer ist die Arduino IDE nicht ausgelegt. Die Arduino IDE 
ist nur ein schlechterer Texteditor, aber nichts was die Bezeichnung IDE 
verdient.
Natuerlich kannst du den Code von Hand kopieren. In der Atmel Studio 
Projektdatei steht aber noch viel mehr drin: Welcher Compiler, welche 
Compilerflags, Projektkonfigurationen, Dateipfade, etc.
Wenn du den Code kopierst geht all das verloren und moeglicherweise ist 
das Ergebnis der Arduino IDE etwas anders (wenn auch funktionsfaehig), 
als das von Atmel Studio, aufgrund unterschiedlicher Toolchains, 
Configs, etc.

von Joachim B. (jar)


Lesenswert?

john schrieb:
> Auf compilieren gedrückt (für Arduino Pro Mini).....
>
> Und es wurde ohne Fehler compiliert.
> Schön....Aber wo ist der Haken? Ich finde das ging jetzt zu einfach?
> Oder ist das wirklich so einfach?

im Studio gibt es eine Endlosschleife

while(1) oder for(;;) o.ä.

alles von dort in Arduino loop()

alles vor der Endlosschleife kommt in setup!

alle *.c oder *.cpp kommen in den Sketchordner des Arduinos "Projekt" 
als *.ino

alle #Include Header *.h, *.hpp sollten auch da landen.

alle genutzten LIBs sollten in dem Arduino library Ordner landen oder im 
Sketchordner.
Sketchordner und main PRG müssen den gleichen Namen tragen!

Das wird dann genug Arbeit,
ohne setup und loop gehts über Arduino auch mit dem gcc, weiss aber 
nicht aus der IDE über seriell oder nur über ISP als hex Übertragung.

: Bearbeitet durch User
von john (Gast)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> mach einen neuen leeren Sketch in der IDE auf.
> Lösche den Inhalt (setup() und loop() und kopieren den Inhalt Deiner
> main rein.
> Speichere den Sketch. Schließe die IDE und kopieren alle anderen Dateien
> die zum Projekt hehören in den Sketchordner. Dann starte die IDE, mach
> den Sketch auf und compiliere und schau Dir an, wo er mault (erweiterte
> Ausgaben beim Compilieren in den Einstellungen einschalten).
>
> Die ArduinoIDE compiliert das dann ohne Einbindung der Arduino-Sachen,
> es muß also ein prinzipiell komplett lauffähiges Projekt sein und die
> main muß als Sketchname.ino im Ordner Skezchname im Sketchbook liegen.
> Mit plain c klappt bei kleinen Projekten bei mir meist ohne sonderliche
> Nacharbeit, mit C++ habe ich es noch nicht genutzt.
> Wenn beim C++  reine C-Sachen dabei sind, darfst Du vermutlich die .h
> noch mit#ifdef __cplusplus
> extern "C" {
> #endif
>
> C-Headerfile-Inhalt
>
> #ifdef __cplusplus
> }
> #endif
> sonst kann er die Verweise nicht auflösen.
>
> Gruß aus Berlin
> Michael

Hallo Michael,

ich habe den Sketch so aufgesetzt wie von dir vorgeschlagen.

ohne die ifdefs in den Headern....war mir nich sicher ob c oder c++ ist


Jedenfalls kompilierte alles wie zuvor (die erweiterten ausgaben waren 
auch unauffällig)....Also alles wie vorher.
Aber diesesmal funktionierte das Programm, ich konnte sogar mit 
pinmode() und pinwrite() einen GPIO toggeln.
Soweit scheint es zu funktionieren. Der Endgültige Test steht noch aus.


Das ganze Projekt wird ein Logger mit RC Telemetrie. Für Jeti, HoTT und 
SPort Telemetrie gibt es fertige funktionierende Arduino Libs.
Leider nicht für Futaba SBUS.
Im Netz habe ich aber SBUS Code gefunden als Atmel Studio projekt. 
Angeblich lässt sich die UART mit Arduino nicht auf SBUS 
einstellen....Das muss ich jetzt testen ob das funktioniert.


Dann kann ich das ganze Projekt mit SD Karte, Config usw I2C fertig 
machen und per Define auswählen welchen Telemetrieprotokoll er verwenden 
soll.
Deswegen wollte ich die SBUS Telemetrie nicht mit dem Atmel Studio 
machen. Dann hätte ich den Code immer 2 mal pflegen müssen.


Ich werde berichten wie es ausgeht.
trotzdem schonmal vielen Dank an Michael

Gruß John (ebenfalls aus Berlin)

von Michael U. (amiga)


Lesenswert?

Hallo,

john schrieb:
> ich habe den Sketch so aufgesetzt wie von dir vorgeschlagen.
>
> ohne die ifdefs in den Headern....war mir nich sicher ob c oder c++ ist
>
> Jedenfalls kompilierte alles wie zuvor (die erweiterten ausgaben waren
> auch unauffällig)....Also alles wie vorher.
> Aber diesesmal funktionierte das Programm, ich konnte sogar mit
> pinmode() und pinwrite() einen GPIO toggeln.
> Soweit scheint es zu funktionieren. Der Endgültige Test steht noch aus.

freut mich, das es bis dahin geklappt hat.
Bisher hat mir die ArduinoIDE weit mehr positive als negative 
Überraschungen geboten.

Gruß aus Berlin
Michael

von john (Gast)


Lesenswert?

Nach langer Zeit nun das Ergebnis:


Die unter Arduino kompilierte Firmware aus Atmel Studio funktioniert 
ohne Einschränkungen.

Arduino Funktionen gehen auch. Getestet bisher nur mit GPIO toggeln.



Das einzige was nicht funktioniert: Ich muss weiterhin int main(void){} 
anstatt Setup() und Loop() verwenden, sonst gibts Fehlermeldungen im 
Kompiler.

Arduino: 1.8.5 (Windows 10), TD: 1.41, Board: "Arduino Pro or Pro Mini, 
ATmega328P (3.3V, 8 MHz)"

wiring.c.o (symbol from plugin): In function `delayMicroseconds':

(.text+0x0): multiple definition of `__vector_16'

C:\Users\eric\AppData\Local\Temp\arduino_build_438229\sketch\CC_esc.cpp. 
o  (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino Pro or Pro Mini.


Vermutlich wird irgendwo ein Interrupt von meinem Code und dem Arduino 
Code doppelt verwendet.
Warscheinlich bei DelayMicroseconds?

Interessanterweise verwende ich die CC_esc.cpp gar nicht mehr.


Ich bleibe aber dran.

von john (Gast)


Lesenswert?

Nachtrag:

Auch mit Setup() und Loop() funktioniert es.

Habe nochmal ein neues Projekt angelegt und die Header eingebunden.

Jetzt läuft es.

Vielen Dank nochmal an Michael.

von Timmo H. (masterfx)


Lesenswert?

Nimm PlatformIO!

von john (Gast)


Lesenswert?

Timmo H. schrieb:
> Nimm PlatformIO!

Aha!

von Timmo H. (masterfx)


Lesenswert?

john schrieb:
> Timmo H. schrieb:
>> Nimm PlatformIO!
>
> Aha!
Jup. Ich finds besser. Kannst du deine Arduino-Projekte direkt mit 
importieren und kannst neben AVR auch ESP8266, ESP32 und stm32f1 inkl. 
Arduino Framework bedienen (geht natürlich auch ohne Arduino oder 
FreeRTOS).
Zudem hat man dann eine einheitliche IDE für alle Controller und Git ist 
auch gleich mit drin.

von john (Gast)


Lesenswert?

Ja das klingt recht interessant.

Nur mein Problem (bisher) war das ich externen C Code (für atmel studio) 
in meine bereits vorhandenen Arduino projekte importieren wollte.

Wenn ich das jetzt alles nochmal in eine neue IDE importiere und teste 
werde ich ja nie fertig.

von Timmo H. (masterfx)


Lesenswert?

Der Code ist erstmal unabhängig von der IDE. Du kannst in Arduino 
genauso in den Registern rumfummeln wie gehabt (nur mit einem Timer muss 
man etwas aufpassen).
Arduino nimmt dir im Prinzip nur die main() weg und ersetzt sie durch 
main(){setup(); while(1){loop();}) und gibt dir dazu noch Funktionen die 
dir das Rumfummeln in den Registern und das Datenblatt zu lesen 
abnehmen. In der Regel alles gut implementiert, aber sowas wie 
Digitalwrite ist halt eine ganze Ecke langsamer als direkt in das 
Port-Register zu schreiben, da dort noch einiges mehr passiert.

Bei PlatformIO gibts halt dieses ominöse INO-File nicht mehr sondern 
eben ganz normal C(pp) und H files in dem anstatt main eben setup und 
loop drin ist. Und viele ehemals Arduino IDE-Projekte, steigen 
inzwischen vielfach auf PlatformIO um (zu sehen unter github durch die 
PlatformIO.ini). Selbst bei Marlin ist inzwischen das INO-File leer (nur 
noch Kommentare)

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

john schrieb:
> Nur mein Problem (bisher) war das ich externen C Code (für atmel studio)
> in meine bereits vorhandenen Arduino projekte importieren wollte.

Bei mir war und ist es ähnlich. Hobby, Einzelprojekte, teilweise Jahre 
alt, bunte Mischung von AVR-ASM (die ganz alten), C in Atmelstudio 4.x, 
Arduino.
Die werden manchmal doch noch angefasst, erweitert oder umgebaut.
Bis jetzt hat die ArduinoIDE da gewonnen, da die C-Sachen sich recht 
problemlos weiternutzen und mit Arduino-Geschichten erweitern ließen.

Jetzt passiert öfter ähnliches mit den ESP, Arduino-Projekt und 
Funktionen des ESP-SDK nutzen, die aus der Arduino Implemetierung (noch) 
nicht genutzt werden.
Der Aufwand, zusätzlich zur ArduinoIDE noch das ESP8266 SDK und das 
ESP32 IDK komplett zu installieren, stände da in keinem sinnvollen 
Zeitverhältnis.

> Wenn ich das jetzt alles nochmal in eine neue IDE importiere und teste
> werde ich ja nie fertig.

:-))

@ Timmo H. (masterfx): meinen Grund gegen PlatformIO kann ich Dir 
erklären:
Die ArduinoIDE installiere ich generell als Portable.
Gestern die 1.8.6, ZIP runtergeladen, entpackt, portable-Ordner angelegt 
und die IDE gestartet.
Die zusätzlichen Board-URLs (ESP8266/ESP32,Mighty, TinyAVR) eingetragen 
und die Erweiterungen installiert.
Ist die Gelegenheit, unnütze Sachen, mit denen man mal rungespielt hat, 
rauszuwerfen. Meine aktiven und in Nutzung befindlichen Sachen aus dem 
Sketchordner der alten in die neue kopiert und compiliert.
Die logischerweise fehlenden Bibliotheken aktuell installiert, so fliegt 
auch da der Kram von Experimenten mal raus.

Angepasst, was evtl. wegen neueer Lib-Versionen zu ändern war, geflucht 
und wenn jemand in einer Lib was geändert hat, was definitiv völlig 
sinnlos war (Adafruit_ST7735 z.B.).

Das dauert nicht sonderlich lange und ich muß es nicht sofort alles 
machen.
Wenn ich an einem alten Projekt was wirklich schnell korrigieren muß, 
kann ich es auch in der 1.6.9 oder 1.8.5 mit den jeweils alten ESP-SDK 
machen und dann das Projekt in Ruhe in die aktuelle packen und anpassen, 
wenn nötig.

Mit Atmel/AVR-Studo, PlattformIO usw. mehrere Version parallel 
betriebsbereit zu halten wäre dagegen eine Strafarbeit. Mehrere Vm wären 
zwar möglich, nur muß das auch eingerichtet und gepflegt werden und 
kollidiert evtl. mit anderen Änderungen an meinem genutztem 
Windowssystem.

Ein Bekannter von mir, der auch beruflich und in anderen Größenordnungen 
programmiert, ist bei seinen Hobby-Sachen mit AVR und ESP aus genau den 
gleichen Gründen bei der ArduinoIDE gelandet. Die Zeitersparnis und die 
Handhabung haben gewonnen.

Gruß aus Berlin
Michael

von Timmo H. (masterfx)


Lesenswert?

Michael U. schrieb:
> Die ArduinoIDE installiere ich generell als Portable.
> Gestern die 1.8.6, ZIP runtergeladen, entpackt, portable-Ordner angelegt
> und die IDE gestartet.
Vscode unterstützt auch portable.

von Joachim B. (jar)


Lesenswert?

Timmo H. schrieb:
> Du kannst in Arduino
> genauso in den Registern rumfummeln wie gehabt (nur mit einem Timer muss
> man etwas aufpassen).

ja ist mir auch aufgefallen wenn ich zwischen m328p und m1284p wechsel

ich habe einfach die Timer per #define ausgetauscht!

von john (Gast)


Lesenswert?

Timmo H. schrieb:
> Du kannst in Arduino
> genauso in den Registern rumfummeln wie gehabt (nur mit einem Timer muss
> man etwas aufpassen)

Ich hatte das nie probiert als ich dieses Thema gestartet habe. Deswegen 
wollte ich mich absichern bevor etwas ganzlich schief geht.

Aber, welcher Timer ist denn der kritische?
In meinem externen C Code sind kommentare das Timer 0 und Timer 2 
genutzt werden.
Leider kenne ich mich in den AVR Registern überhaupt nicht aus. Ich 
komme da eher aus der STM32 Ecke.
Deswegen nutze ich auch gerne Arduino um schnell und einfach eine 
funktionalität zu bekommen.

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.