Stößt man bei der Arduino-Programmiersprache an die Grenzen?

Hallo!

Wir programmieren in der Schule seit einiger Zeit Arduino (Uno) - natürlich alles einfache und unkomplizierte Programme - ich bin davon ziemlich begeistert.
Ich möchte mir jetzt einen Arduino kaufen (Arduino MEGA 2560). Die Frage ist jetzt: Seid ihr schonmal mit der Arduino-Programmiersprache an eure Grenzen gestoßen, also dass etwas, das eigentlich Hardware-seitig möglich wäre, nicht umsetzbar war?
Ich programmiere sonst PHP, da bin ich es nicht gewohnt, an die Grenzen zu stoßen und als ich dann anfing mit ROBO Pro (Fischertechnik "Programmiersprache") kompliziertere Sachen zu machen und eben genau dies passierte, ärgerte mich das extrem. Seitdem programmiere ich nicht mehr Fischertechnik-Roboter.
Wie ist das bei Arduino?

Viele Grüße, lux

programmier seit 3-4 tagen mit arduino und was mich persönlich aufregt ist das es kein multitasking gibt und falls mal ein sensor etc. zeit braucht um das ergebnis zu liefern ist das in der void loop schleife praktisch wie ein delay! und somit werden dann andere befehle erst später ausgeführt oder reagieren für eine bestimmte zeit leider nicht :frowning:

Das ist aber keine Beschränkung der "Arduino-Programmiersprache" sondern des Prozessors an sich. :wink:

OK, also nur das fehlende Multitasking? Gibt es da keinen Workaround?
Die Programmiersprache hat sonst alles, also Schleifen etc.?

@lux
Der Arduino wird in ganz normalem C/C++ programmiert. Da stöst Du eher mit der Hardware an Grenzen.

@AndiIsl
Es gibt für Arduino ein paar Bibliotheken welche ein quasi Multitasking implementieren.
Einfach: MSTimer2 (MsTimer2 and FlexiTimer2 Arduino Libraries, Run a Function At Regular Intervals)
Komplex: qL state machine (Modern Arduino Programming with QP Frameworks and QM Modeling Tool)
Es gibt noch weitere, persönlich kenn ich aber nur die beiden.

OK, also als Fazit: "Nein, mann stößt nicht an die Grenzen."?

EDIT: Ah, ich habe gerade gesehen, man könnte das doch auch mit millis() und einem if umsetzen, oder? Dann hätte man schonmal keine Software-Delays mehr. Und sonst müsste man halt Sensorwerte jedes Mal abfragen, bis sie verfügbar sind. Geht das?

Ich stoße gelegentlich an die Grenzen der Hardware, oft an die Grenzen meines eigenen Programmiervermögens, aber bisher noch nicht an die der IDE. :smiley:

Ich stoße oft gegen Bettkante oder Schrankkante, zählt das auch?

Ne, im Ernst: Ich glaube das liegt eher entweder in der Hardware oder in der unwissenheit

@MueThoS:
Guter Witz, musste lachen...

OK, danke an alle für eure Hilfe! Dann werde ich mir auf jeden Fall mal einen Arduino zulegen...

C an sich ist eine der leistungsstärksten Programmiersprachen. Falls notwendig kannst Du auch Teile in Assembler (maschinensprache) einfügen.
Eine Grenze an die man schnell stößt ist das RAM. Wenn man viele Variablen (Arrays) braucht oder Webserver anlegt dann sind 2kByte RAM des ATmega328 schnell mal knapp. Da kann man zu einem Arduino MEGA ausweichen und eventuell ein zusätzliches RAM anhängen.

Lux wieso hast Du dieses Topic blockiert?

Viele Grüße Uwe

Wie gesagt, ich möchte mir ja auch ein MEGA zulegen. Gerade deshalb.

Das Multitasking geht? Das sieht erstmal ziemlich kompliziert aus, wie verhält sich das in der Praxis?

Ups, keine Ahnung, das habe ich irgendwie aus Versehen blockiert...

lux:
Das Multitasking geht? Das sieht erstmal ziemlich kompliziert aus, wie verhält sich das in der Praxis?

Die Unterstützung von Multitasking ist sicherlich gegeben. Prinzipiell wird so etwas ja durch das Betriebssystem zur Verfügung gestellt. Und so etwas hat der Arduino ja nicht.

Wenn man die Multitasking-Fähigkeiten benötigt, muss man entweder die von MaFu angesprochenen Bibilotheken verwenden oder etwas selbst programmieren. Was aber je nach Aufgabestellung durchaus möglich ist. Z.B. kann man mit Interrupts arbeiten, und dadurch eine Art Multitasking nachbilden:

Man kann durch bestimmte Ereignisse (Änderung von Eingangssignalen, Eintreffen von Zeichen über die serielle Schnittstelle, Erreichen von Zählerständen im Controller, Ablauf von Zeitgebern, usw.) den normalen Ablauf des Programms in der Endlostschleife in der Funktion loop() unterbrechen und den zum Ereignis passenden Programmcode ausführen (quasi anderer Task). Stichwort: ISR/Interrupt Service Routine. Wenn der Code dann abgeabeitet ist, wird wieder in loop() zurückgesprungen und dort weiter gemacht. Wobei natürlich gewisse Randbedingungen zu berücksichtigen sind.

Um das Ganze zu verstehen, sollte/muss man allerdings ein wenig suchen und lesen. Aber da hilft Tante Google sicherlich, etwas zu finden (Stichwort: AVR, ISR, interrupt, programming): hat gerade versuchsweise 67500 Ergebnisse geliefert. Aber auch bei Linux oder Windows muss man sich ja erst einmal schlau machen, wenn man Multitasking verstehen will.

Aber das muss man sich ja nicht von heute auf morgen aneignen. Macht auf jeden Fall Spaß, sich damit zu befassen. Finde ich.

Gruß
Wolfgang

OK, cool, dann steht dem Kauf nichts mehr im Weg.
Danke an alle!

Hallo zusammen,

es sei noch hinzugefügt, dass man ein Arduino nicht mit einer .NET-Programmiersprache o.Ä. vergleichen kann. Dort kann man auch nicht parallel Arbeiten, wenn man nur einen Prozessor hat. Aber Hardware und Betriebssystem schieben die Prozesse in eine Queue und arbeiten diese nacheinander ab. Das geschieht aber nicht am Stück (Sonst würde ja z.B. immer nur ein Programm zu Ende laden) sondern immer nur eine bestimme Anzahl von Rechenoperationen.

Und ungefähr so sollte man auch die Programmierung im Loop() strukturieren. Also primär einzelne Schritte definieren und z.B. Ausstiegspunkte schaffen.
In einem Projekt habe ich eine Ethernet-Schnittstelle und eine LED Matrix. Nun steuere ich per Webinterface die verschiedenen Grafiken auf der Matrix. Lade ich die Steuerungsseite, kann die Matrix nicht leuchten, spielt die Matrix eine längere Abfolge, kann ich sie nicht steuern oder abbrechen.
Also alles brav Schrittweise im Loop aufgebaut, dass quasi fast auf Schleifen verzichtet werden kann, wo undefinierbar lange Operationen stattfinden.

Eine persönliche Begrenzung sehe ich in der Speicherkapazität und im RAM. Jedoch habe ich eine Atmega328 Chip und der MEGA bietet doch deutlich mehr.