Forum: Mikrocontroller und Digitale Elektronik PlatformIO Tutorial


von Dinera D. (dinera)


Lesenswert?

Hallo zusammen,

ich nutze nun seit einigen Monaten PlatformIO (Atom) zur AVR 
Programmierung. Ich bin etwas genervt von dem Arduino Framework. Es wird 
eine "main.cpp" Datei erstellt und der Compiler ist auf "avr_g++" 
gestellt. Bei jedem neuen Projekt muss man die Main umbenennen und den 
Compiler ändern. Zudem steht in der Main "setup" und "loop".
Nutzt jemand von euch PlatformIO für die AVR Programmierung und hat sich 
schon mit der Template Thematik auseinander gesetzt?

Evtl. könnte ich eine kleine Anleitung schreiben, wie man unter Linux 
eine Entwicklungsumgebung mit Atom und PlatformIO aufbaut. Gern würde 
ich hier auch auf Erfahrungen von eurer Seite zurück greifen. :)

Dinera

von The Mule (Gast)


Lesenswert?

Grundlegend hat PlatformIO nichts mit Arduino zu tun. Arduino hat auch 
nichts mit Atom zu tun.
Das Problem sollte nochmal sachlich geschildert werden.

von Timmo H. (masterfx)


Lesenswert?

Also wenn ich auf der PlatformIO Home-Seite ein neues Arduino Projekt 
erzeuge, bekomme ich eine main.cpp mit folgendem Inhalt:
1
#include <Arduino.h>
2
3
void setup() {
4
  // put your setup code here, to run once:
5
}
6
7
void loop() {
8
  // put your main code here, to run repeatedly:
9
}

von Drago S. (mratix)


Lesenswert?

Dinera D. schrieb:
> Ich bin etwas genervt von dem Arduino Framework.
dito :)

> Evtl. könnte ich eine kleine Anleitung schreiben, wie man unter Linux
> eine Entwicklungsumgebung mit Atom und PlatformIO aufbaut.
aber gerne, welcome

> Nutzt jemand von euch PlatformIO für die AVR Programmierung und hat sich
> schon mit der Template Thematik auseinander gesetzt?
Ich bin immer noch auf der Arduino IDE und merke dass ich an Grenzen 
stoße.

Templates würden mich generell interessieren. Gerade wenn man 
unterschiedliche devices hat, geht es schon z.B. mit dem Pinout oder 
angeschlossener Peripherie los.

Ein paar Experimente mit verschachtelten #ifdef habe ich gefahren. Geht 
auf jeden Fall in die richtige Richtung, nur ein zentrales Handling o.ä. 
fehlt mir. Auch die Möglichkeiten von Split/Merge/Include wären 
interessant.

Neuerding kommt der OTA include zum Einsatz. Diesen bräuchte ich quasi 
als Standard. Eine Kombination mit oben erwähnten wäre genial.

Jedenfalls, würde ich gerne mehr erfahren. Sei es auch nur der 
Einstieg/Umstieg auf was anderes.

: Bearbeitet durch User
von devzero (Gast)


Lesenswert?

Dinera D. schrieb:
> Ich bin etwas genervt von dem Arduino Framework. Es wird
> eine "main.cpp" Datei erstellt und der Compiler ist auf "avr_g++"
> gestellt.

Hae? Ja nun, Arduino ist nunmal C++. Wenn man es nicht mag, muss man es 
ja nicht benutzen.

von Christopher J. (christopher_j23)


Lesenswert?

Nimm doch einfach das "native blink" aus "examples" von "platform AVR":
https://docs.platformio.org/en/latest/platforms/atmelavr.html#examples

Das sieht dann so aus:
1
/**
2
 * Copyright (C) PlatformIO <contact@platformio.org>
3
 * See LICENSE for details.
4
 */
5
6
#include <avr/io.h>
7
#include <util/delay.h>
8
9
int main(void)
10
{
11
    // make the LED pin an output for PORTB5
12
    DDRB = 1 << 5;
13
14
    while (1)
15
    {
16
        _delay_ms(500);
17
18
        // toggle the LED
19
        PORTB ^= 1 << 5;
20
    }
21
22
    return 0;
23
}

von Dinera D. (dinera)


Lesenswert?

devzero schrieb:
> Hae? Ja nun, Arduino ist nunmal C++. Wenn man es nicht mag, muss man es
> ja nicht benutzen.

Ja und genau das ist mein Problem. Es werden z.B. Die Registernamen 
nicht in C++ erkannt, weil der Compiler "avr-g++" als Standard 
herangezogen wird.

Ich versuche nun seit 3 Wochen ein Framework zu basteln, das mir beim 
Laden eines neuen Projekts den Compiler "avr-gcc" und eine "main.c" 
erstellt.

Ich bin leider kein Programmier-Crack, sonst wäre ich wahrscheinlich 
schon lange fertig.

Mich nervt einfach der Workaround, dass ich jedes neue Projekt erst 
einmal anpassen muss, dass ich überhaupt ein Programm kompilieren kann.

von Bernd K. (prof7bit)


Lesenswert?

Dinera D. schrieb:
> Ich versuche nun seit 3 Wochen ein Framework zu basteln, das mir beim
> Laden eines neuen Projekts den Compiler "avr-gcc" und eine "main.c"
> erstellt.

WTF? Wie oft am Tag erstellst Du ein neues Projekt? Mach Dir doch ein 
leeres Projekt das so konfiguriert ist wie Du es gerne magst und kopier 
das wenn Du es brauchst!?

Und warum nimmst Du überhaupt eine Arduino IDE wenn Du gar kein Arduino 
willst?

: Bearbeitet durch User
von Ray M. (ray_m)


Lesenswert?

Dinera D. schrieb:
> devzero schrieb:
>> Hae? Ja nun, Arduino ist nunmal C++. Wenn man es nicht mag, muss man es
>> ja nicht benutzen.
>
> Ja und genau das ist mein Problem. Es werden z.B. Die Registernamen
> nicht in C++ erkannt, weil der Compiler "avr-g++" als Standard
> herangezogen wird.
>
> Ich versuche nun seit 3 Wochen ein Framework zu basteln, das mir beim
> Laden eines neuen Projekts den Compiler "avr-gcc" und eine "main.c"
> erstellt.
>
> Ich bin leider kein Programmier-Crack, sonst wäre ich wahrscheinlich
> schon lange fertig.
>
> Mich nervt einfach der Workaround, dass ich jedes neue Projekt erst
> einmal anpassen muss, dass ich überhaupt ein Programm kompilieren kann.

Warum du auf einem AVR C und nicht C++ machen willst erschliest sich mir
nicht, ist aber bestimmt Geschmachssache.
Aber wenn schon Urzeit dann bitte richtig, mit vi und asm ;) ;) ;)

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Lesenswert?

Dinera D. schrieb:
> Ich versuche nun seit 3 Wochen ein Framework zu basteln, das mir beim
> Laden eines neuen Projekts den Compiler "avr-gcc" und eine "main.c"
> erstellt.

Hast du es denn mal mit dem von mir verlinkten "native blink" Beispiel 
versucht? Das dürfte ziemlich genau das machen, nach was du suchst.

von Veit D. (devil-elec)


Lesenswert?

Ich verstehe dein Gemecker auch nicht. Warum verwendest du das Arduino
Framework wenn es dich nervt? Dann nimm es doch nicht. Wenn du Probleme
mit den Registernamen hast, dann liegt das eher an dir. Es fehlen
sicherlich paar includes. Wenn man kein Framework wie zum Bsp. Arduino
verwendet, dann muss man sich um alles selbst kümmern. Man kann dann
aber nicht die Schuld einen anderen in Schuhe schieben. Klappt einfach
nicht. Und wenn du main.cpp bekommst statt main.c dann wirst du wohl
schon bei der Projekterstellung etwas falsch auswählen. Wenn man in
platformIO bei der Projekterstellung nicht zwischen C und C++ und
anderen auswählen kann, was ich nicht so recht glauben mag, ja dann wäre
platformIO sowieso Mist.

von Stefan F. (Gast)


Lesenswert?

Dinera D. schrieb:
> Ich versuche nun seit 3 Wochen ein Framework zu basteln, das mir beim
> Laden eines neuen Projekts den Compiler "avr-gcc" und eine "main.c"
> erstellt.

Dazu braucht man kein Framework, sondern eine Kopiervorlage. Sieh mal: 
http://stefanfrings.de/avr_hello_world/index.html
Mit dieser Vorlage kannst du sowohl C als auch C++ nutzen - auch 
gemischt im selben Projekt.

> Mich nervt einfach der Workaround, dass ich jedes neue Projekt erst
> einmal anpassen muss, dass ich überhaupt ein Programm kompilieren kann.

Und darum ersetzt du das durch einen Projekt-Generator, der ebenso viele 
Konfigurationsparameter benötigt? Da bringt doch keinen echten Vorteil!

von Timmo H. (masterfx)


Lesenswert?

Dinera D. schrieb:
> Ja und genau das ist mein Problem. Es werden z.B. Die Registernamen
> nicht in C++ erkannt, weil der Compiler "avr-g++" als Standard
> herangezogen wird.
Das kann ich so nicht bestätigen. Also du kannst natürlich wie 
Christopher schon sagte ein native AVR Projekt machen, dann hast du 
deine Main wieder, aber auch wenn du das Arduino Framework benutzt hast 
du wie gehabt Zugriff auf alle Register wie man es kennt.
Das hier kompiliert fehlerlos durch
1
#include <Arduino.h>
2
3
void setup() {
4
  DDRB = 1 << 5;
5
6
    while (1)
7
    {
8
        _delay_ms(500);
9
10
        // toggle the LED
11
        PORTB ^= 1 << 5;
12
    }
13
14
    return;
15
}
16
17
void loop() {
18
  // put your main code here, to run repeatedly:
19
}

von Dinera D. (dinera)


Lesenswert?

Christopher J. schrieb:
> Hast du es denn mal mit dem von mir verlinkten "native blink" Beispiel
> versucht? Das dürfte ziemlich genau das machen, nach was du suchst.

Der "native blink" funktioniert. Mir geht es um die Timer und genau 
diese Register erkennt es bei mir nicht, obwohl ich die IC spezifischen 
Header eingebaut habe.

Bernd K. schrieb:
> WTF? Wie oft am Tag erstellst Du ein neues Projekt? Mach Dir doch ein
> leeres Projekt das so konfiguriert ist wie Du es gerne magst und kopier
> das wenn Du es brauchst!?
>
> Und warum nimmst Du überhaupt eine Arduino IDE wenn Du gar kein Arduino
> willst


Veit D. schrieb:
> Ich verstehe dein Gemecker auch nicht. Warum verwendest du das Arduino
> Framework wenn es dich nervt?


Wenn ich jeden Tag mehrere Projekte erstellen würde, dann ist das kein 
Problem, aber wenn ich nur jeden Monat eins erstelle, dann vergesse ich 
gerne mal die eine oder andere Einstellung und es funktioniert nicht. 
(Ich weis ich bin ein Schussel, jedoch versuche ich mich zu bessern ;) )

Ich habe mit der Arduino IDE angefangen, aber wenn man nicht nur einen 
Texteditor haben möchte, sondern auch eine Code-Vervollständigung, dann 
ist das eben nicht so prikelnd.
Ich möchte einen Editor nutzen, den ich sehr mag und auch schon kenne 
(Atom). Ich bin bei der Suche auf PlatformIO gestoßen und bin auch 
zufriden, bis auch den Fakt, dass bei der Erstellung eines neuen 
Projektes (zumindest für den ATtiny13A und ATtiny2313) nur das Framework 
"Arduino" möglich ist.

Deshalb habe ich mir gedacht, es wäre cool, wenn man ein Framework hat, 
welches den Compiler "avr-gcc" setzt und direkt eine "main.c" (evtl. 
gleich mit "#include <avr/io.h>") ohne eine "setup()"- und 
"loop()"-Funktion.

Veit D. schrieb:
> Klappt einfach
> nicht. Und wenn du main.cpp bekommst statt main.c dann wirst du wohl
> schon bei der Projekterstellung etwas falsch auswählen. Wenn man in
> platformIO bei der Projekterstellung nicht zwischen C und C++ und
> anderen auswählen kann, was ich nicht so recht glauben mag, ja dann wäre
> platformIO sowieso Mist.

Danke für den Beitrag!
Wenn man unter Linux AVR Programmierung betreiben möchte ist das leider 
nicht so einfach. Atmel Studio ist nur in einer alten Version unter Wine 
nutzbar und jeder der Wine schon einmal benutz hat wird wissen, dass ein 
Ansprechen der HW nicht immer einfach ist. Da du dich auskennst, kannst 
du mir auch gern einen Tipp geben, wie ich meine ICs besser 
programmieren kann.


Timmo H. schrieb:
> Also du kannst natürlich wie
> Christopher schon sagte ein native AVR Projekt machen, dann hast du
> deine Main wieder, aber auch wenn du das Arduino Framework benutzt hast
> du wie gehabt Zugriff auf alle Register wie man es kennt.

so einen ähnliche Workaround habe ich bereits. Für mich fühlt sich das 
aber an wie von hinten durch die Brust ins Auge.


Da frage ich vielleicht anders:
Kann ich ein PlatformIO Projekt erstellen, ohne das "Arduino"-Framework 
und mit C-Compiler?

von Stefan F. (Gast)


Lesenswert?

Ich schätze dass du für den ATtiny13 nur Arduino als Framework wählen 
kannst, weil alle anderen Frameworks in diesen kleinen Mikrocontroller 
nicht rein passen. Selbst bei Arduino hast du auf diesem kleinen 
Mikrocontroller erhebliche Einschränkungen. Deswegen wird dort meistens 
eher der ATtiny45 verwendet.

> Kann ich ein PlatformIO Projekt erstellen, ohne
> das "Arduino"-Framework und mit C-Compiler?

Keine Ahnung, offensichtlich nicht, sonst stände das wohl dort: 
https://docs.platformio.org/en/latest/boards/atmelavr/attiny13.html

von Dinera D. (dinera)


Lesenswert?

Stefanus F. schrieb:
> Ich schätze dass du für den ATtiny13 nur Arduino als Framework wählen
> kannst, weil alle anderen Frameworks in diesen kleinen Mikrocontroller
> nicht rein passen. Selbst bei Arduino hast du auf diesem kleinen
> Mikrocontroller erhebliche Einschränkungen. Deswegen wird dort meistens
> eher der ATtiny45 verwendet.

Stefanus, Danke!
Ich glaube wir kommen meinem Problem schon näher^^

Ich benötige nicht den Overhead des Arduino Frameworks, jedoch ist die 
Funktionserweiterung von Atom durch PlatfomrIO elegant.

Ein PlatformIO-Framework, was eigentlich kein direktes Framework wäre, 
sondern "nur" Compiler, Sizer und Uploader bereitstellt (Tinycore, 
Megacore, etc. müssten natürlich auch mit dabei sein).

Naja. Ich werde mich damit abfinden, dass ich den Workaround anwenden 
muss.

von Stefan F. (Gast)


Lesenswert?

Dinera D. schrieb:
> Ein PlatformIO-Framework, was eigentlich kein direktes Framework wäre

Das ist aber nicht der Sinn von PlatformIO. PlatformIO ist wohl das 
falsche Produkt für dich.

Was du dann wohl eher haben willst, nennen wir hier liebevoll "bare 
metal" Programmierung.

Hier hast du eine Kopiervorlage dazu: 
http://stefanfrings.de/avr_hello_world/index.html (im Grunde genommen 
brauchst du nur das Makefile) (ich weiss, das habe ich dir weiter oben 
schon empfohlen)

Hier steht, wie du eine moderne IDE als besseren Textditor verwendest: 
http://stefanfrings.de/avr_tools/index.html#ide

Und hier hast du ein ganzes Buch zur "bare metal" Programmierung und 
Anwendung des ATtiny13: 
http://stefanfrings.de/mikrocontroller_buch2/index.html

von Veit D. (devil-elec)


Lesenswert?

Hallo,

naja, dass hat sich leider am Anfang gelesen wie sinnfreies Gemecker auf 
Arduino, obwohl das nichts damit zu tun hat. Darauf musste ein 
Missverständnis folgen. Erledigt, Haken ran.

Anderer Vorschlag. CodeBlocks. Mit dem allgemeinen Problem die richtige 
IDE für sich zufinden bist du nicht der Einzigste. Das machen alle 
durch.  :-)

von Timmo H. (masterfx)


Lesenswert?

Dinera D. schrieb:
> Kann ich ein PlatformIO Projekt erstellen, ohne das "Arduino"-Framework
> und mit C-Compiler?
Ja kannst du. Allerdings nicht über New Project, sondern Platforms => 
Atmel AVR => Examples => Native Blink => Import

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Lesenswert?

Timmo H. schrieb:
> Dinera D. schrieb:
>> Kann ich ein PlatformIO Projekt erstellen, ohne das "Arduino"-Framework
>> und mit C-Compiler?
> Ja kannst du. Allerdings nicht über New Project, sondern Platforms =>
> Atmel AVR => Examples => Native Blink => Import

So ist es und wenn du keinen Atmega328, sondern einen Attiny13A hast, 
dann musst du das entsprechend in deiner platformio.ini anpassen. Da 
kannst bzw. musst du dann auch noch entsprechende Zeilen für den Upload 
angeben. Beispiele und Doku findest du hier:
https://docs.platformio.org/en/latest/platforms/atmelavr.html

von Dinera D. (dinera)


Lesenswert?

Timmo H. schrieb:
> Ja kannst du. Allerdings nicht über New Project, sondern Platforms =>
> Atmel AVR => Examples => Native Blink => Import

Das funktioniert, aber das ist noch umständlicher, als die main 
umzubenennen und den avr-gcc compiler einzustellen. Trotzdem Danke, den 
Weg kannte ich noch nicht.

Christopher J. schrieb:
> So ist es und wenn du keinen Atmega328, sondern einen Attiny13A hast,
> dann musst du das entsprechend in deiner platformio.ini anpassen. Da
> kannst bzw. musst du dann auch noch entsprechende Zeilen für den Upload
> angeben. Beispiele und Doku findest du hier:

Das ist bekannt. Ich habe bereits erfolgreich ICs geflashed.

Veit D. schrieb:
> Anderer Vorschlag. CodeBlocks. Mit dem allgemeinen Problem die richtige
> IDE für sich zufinden bist du nicht der Einzigste. Das machen alle
> durch.  :-)

Eigentlich habe ich meine IDE schon gefunden und war ziemlich Glücklich, 
dass ich mit Atom auch Mikrocontroller programmieren kann. Zumindest 
bedingt nach langem einrichten. ;)

Deshalb wollte ich auch in der Community fragen, ob es bereits ein gutes 
Tutorial für Platformio unter linux gibt.

Ich werde mich in den nächsten Wochen mal ran setzten und einen kleine 
Crashkurs zusammenschreiben, dass der nächste Mikrocontroller-Neuling 
nich die gleiche Odysee durchmachen muss.

von Bernd K. (prof7bit)


Lesenswert?

Dinera D. schrieb:
> aber wenn ich nur jeden Monat eins erstelle, dann vergesse ich
> gerne mal die eine oder andere Einstellung und es funktioniert nicht.

Daher der Vorschlag mit der Kopiervorlage.

Ich selbst mach das exakt genau so. Ich benutze zwar ne andere IDE (noch 
dazu eine die noch viel komplexer und zickiger ist) aber das Prinzip ist 
das selbe: Ich hab ein leeres Projekt das nur ne LED blinkt zum Beweis 
daß es funktioniert, das hat etliche vom Default der IDE abweichende 
Konfigurationen, es hat ein handgeklöppeltes Makefile, einen eigenen 
Startupcode, ein paar zusätzliche eigene Header und Code mit Sachen die 
ich immer brauche oder immer so mache, eine Ordnerstruktur wie sie mir 
genehm ist und noch ein paar andere Sachen die ich in jedem Projekt 
haben will und das ist dann meine ganz persönliche Vorlage für alle 
Projekte mit diesem Prozessor. Für die paar anderen Prozessoren die ich 
auch noch benutze hab ich ähnliche Vorlagen. Für nen neuen Prozessor 
alle paar Jahre bau ich mir schnell eine Vorlage basierend auf einer 
bereits existierenden.

Wenn ich ein neues Projekt anfangen will dann klone ich einfach dieses 
Repository, geb ihm nen neuen Namen und nen neuen Origin und kann dann 
sofort loslegen auf Basis eines komplett nach meinen Vorlieben fix und 
fertig konfigurierten und organisierten und lauffähigen Minimalprojekts. 
Ich könnte später sogar nachträgliche Verbesserungen an meiner Vorlage 
ohne viel Rumgefummel in existierende Projekte oder in andere Vorlagen 
reinmergen weil sie alle die selbe Wurzel haben.

: Bearbeitet durch User
von Dinera D. (dinera)


Lesenswert?

Bernd K. schrieb:
> Daher der Vorschlag mit der Kopiervorlage.

Das werde ich mal probieren. Ich denke am Anfang wird das nervig sein, 
aber wenn die erste Vorlage steht, sollte das ja funktionieren. Besten 
Dank!

von Dinera D. (dinera)


Lesenswert?

Ein kleines Update:

Ich habe jetzt aus Spaß PlatformIO (Atom und VSC) unter Windows 
installiert und getestet.
Beides funktioniert tadellos. Ich vermute ich habe bei meiner 
Linux-Insatallation was verbastelt. Es könnte aber auch allgemein an 
Linux i n Kombination mit Atom und PlatformOi sein. Ich werde die Tage 
auch noch VSC unter Linux probieren. (Leider ist bei mir die Zeit bei 
mir im Moment etwas knapp. Vorbereitung aufs Studium, Katzenbabys, 
Umzug)

Ich habe aber die leise Vermutung, dass VSC besser funktioniert als Atom 
:/

Gibt es von eurre Seite Erfahrungswerte mit VSC unter Linux?

von Christopher J. (christopher_j23)


Lesenswert?

Dinera D. schrieb:
> Gibt es von eurre Seite Erfahrungswerte mit VSC unter Linux?

Funktioniert bei mir absolut tadellos und ist mein Standardeditor für 
Go, Python und Rust.

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.