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.
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?
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
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.
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
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.
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.
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)
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
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.
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.
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.
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.
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)
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
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.
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!
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.