Ich überlege mir das Uno R3 zu kaufen und möchte gerne wissen, ob ich ganz normal wie im Manual des uCs die Register in der Arduino IDE schreiben kann, sprich ich den uC wie in jeder IDE nach dem Manuel von AVR programmieren kann.
Ja. Man kann entweder fertige Libraries und Funktionen verwenden die die Interna des µCs kapseln, oder auch die Register direkt ansprechen. In der Praxis verwendet man meistens eine Kombination davon, je nachdem was man macht und wie performant das sein muss. Wenn etwas nicht super schnell sein muss, spricht nichts dagegen fertige Funktionen zu verwenden.
Bei manchen Sachen kommt man auch nicht drum herum die Register direkt zu verwenden wenn es vernünftig funktionieren soll. Und nicht alles ist in Libs implementiert.
Wenn du aber aus irgendeinem Grund komplett auf die höheren Sprachmittel verzichten willst, kannst du auch auf die Arduino Software verzichten und gleich rein mit Atmel Studio arbeiten.
AESIS:
Ich überlege mir das Uno R3 zu kaufen und möchte gerne wissen, ob ich ganz normal wie im Manual des uCs die Register in der Arduino IDE schreiben kann, sprich ich den uC wie in jeder IDE nach dem Manuel von AVR programmieren kann.
Ja.
Die Arduino-IDE compiliert AVR GCC Programme und alle Registerbezeichnungen des Controllers sind in der Software vordefiniert, sobald Du unter "Board" das richtige Arduino-Board eingestellt hast.
Programmierbeispiele funktionieren in der Arduino-IDE aber nur dann, wenn sie in C++-Syntax geschrieben sind.
In C-Syntax geschriebene Beispiele mußt Du ggf. auf C++-Syntax umschreiben.
Im allgemeinen sind die Unterschiede aber gering.
Klingt gut. Ich wollte die Arduino IDE verwenden, um mir den Initialisierungsteil zu sparen, um gleich loslegen zu können. Da ich zZ nur eine Hand voll ADCs, sowie PWMs und das Serielle Interface für mein selbst gebautes USV verwenden würde, sollten eine Handvoll Register und ein kleines Programm reichen.
Daher meine Frage bzgl. des direkten Schreibens der Register. ich hoffe also nun, dass in dem für den uC hinerlegten Header auch die Registerverweise gesetzt sind und ich somit mit den Registernamen arbeiten kann, ohne Speicheradresse verwenden zu müssen.
AESIS:
Klingt gut. Ich wollte die Arduino IDE verwenden, um mir den Initialisierungsteil zu sparen, um gleich loslegen zu können. Da ich zZ nur eine Hand voll ADCs, sowie PWMs und das Serielle Interface für mein selbst gebautes USV verwenden würde, sollten eine Handvoll Register und ein kleines Programm reichen.
Also Du möchtest im wesentlichen "Serial" verwenden, ohne groß selbst Code dafür schreiben zu müssen?
Und ansonsten hardwarenah programmieren?
Kann man machen, kein Problem.
Von den "Komfortfunktionen" der Arduino-Software kannst Du so viel oder so wenig verwenden wie Du möchtest.
AESIS:
Daher meine Frage bzgl. des direkten Schreibens der Register. ich hoffe also nun, dass in dem für den uC hinerlegten Header auch die Registerverweise gesetzt sind und ich somit mit den Registernamen arbeiten kann, ohne Speicheradresse verwenden zu müssen.
Klar, Du kannst die Registernamen direkt verwenden. Aber beachte: Bei der Arduino-Initialisierung mit setup und loop wird der gesamte Arduino-Unterbau aktiviert, d.h. außer "Serial" wird z.B. auch "Timer0" von Arduino standardmäßig bespaßt. Wenn Du jetzt z.B. daherkommst und Timer0 deaktivierst oder anders verwendest, dann laufen auf der anderen Seite wieder Komfortfunktionen wie delay oder millis auch nicht mehr.
Naja mit serieller Kommunikation hab ich keine Erfahrung, doch das muss realisiert werden, da ein USV, was seinen Zustand nicht an die Clients melden kann, etwas beschränkt ist.
Ein Programm für die Clients muss ich dann auch noch schreiben....
Timer0 ist also schon belegt... hm...
Ich glaub der uC hat nur 2 und ich brauch einen fürs PWM. Da kann ich nur hoffen, dass ich sonst keinen mehr brauche, sonst muss ich mir selber einen auf Kosten von Rechenleistung bauen.
Der UNO hat drei Timer. Jeder Timer kann 2 PWM Eingänge Ausgänge machen. Auf Timer0 geht auch gleichzeitig PWM. Das macht auch die IDE. Für millis() und delay() wird lediglich zusätzlich der Overflow Interrupt ausgewertet.
Ah ja ich hab den 16 Bit Timer ganz außer Acht gelassen. Schön dann bin ich mal gespannt, wann das gute Stück bei mir eintrifft.
Es hieß weiter oben, dass es zBsp fertige Libs für Serial gibt. Wo findet man die Libs? In der Download Sektion mir nichts ins Auge gefallen.
Kann man sich über die Verwendung der Libs irgendwo belesen? Ich hab Derartiges noch nie gemacht/verwendet.
Viele Dank.
AESIS:
Kann man sich über die Verwendung der Libs irgendwo belesen? Ich hab Derartiges noch nie gemacht/verwendet.
Serial ist keine externe Library, sondern in die Arduino-Software integriert.
Die Referenz ist im Playground:
http://arduino.cc/de/Reference/Serial
Vorsicht: Zu den "Serial" Funktionen gehören einige der unsinnigsten Funktionen, die zur Arduino-Software gehören und im Prinzip nur den Controller blockieren (parseInt und Consorten). Die Wichtigsten Funktionen sind;
Serial.begin ==> Initialisieren der Schnittstelle
Serial.available ==> Prüfen ob Zeichen im seriellen Eingangspuffer sind
Serial.read ==> ein Zeichen aus dem seriellen Eingangspuffer auslesen
Serial.print, Serial.println, Serial.write ==> Ausgabefunktionen für die Serielle Schnittstelle
Dazu ggf. noch
Serial.end ==> Schließen der seriellen Schnittstelle
Serial.flush ==> Warten, bis alle Zeichen im seriellen Ausgangspuffer gesendet sind
Alle anderen Serial Funktionen sind ziemlich unbrauchbarer Schrott, den man von wenigen Sonderfällen abgesehen, im Allgemeinen nicht nützlich einsetzen kann.
Ich hab jetzt erst gesehen, dass es ja ein Ethernet Shield gibt. Die Umsetzung eines Windows/Unix Programms für die serielle Schnittstelle scheint nicht ohne zu sein und da ich wohl mehrere Verbraucher am USV haben werde, bietet sich wohl TCP/IP eher an, auch wenn hier in der Umsetzung eines Programms für Windows und Unix massig Aufwand drin steckt.
Scheinbar gibt es auch bereits Libs mit Funktionen zur Einfachen Umsetzung eines Servers, oder Clients. ![]()
Kommt darauf an mit was du programmierst. Mit C# z.B. ist der Zugriff auf die serielle Schnittstelle geradezu trivial. Aber auch andere Sprache wie Java oder Python haben da entsprechende Mittel.
Ob Ethernet besser ist hängt er von der Datenmenge und der benötigten Kabellänge ab. Serial ist halt sehr langsam.
Ethernet ist natürlich etwas komplizierter. Aber auf dieser Ebene auch nicht schwer. Hier sind minimale TCP Clients in C# (für Konsolenanwendungen!):
Das ist letztlich auch nicht viel anders als Serial
Ich kann leider nur C und C++ und auf Hardware habe ich noch nie was programmiert.
Ich hab mir ein USV gebaut, was so weit auch funktioniert, doch möchte ich es jetzt ein wenig intelligent gestalten, sodass es deb Clients über Ethernet mitteilt, dass der Akku zu Neige geht und diese sich abschalten/herunterfahren sollen.
Somit braucht es auf der Clientseite "nur" einen Server, der auf einen gewissen Port lauscht und die Daten interpretiert.
Das Arduino Board muss die Nachricht schicken können. Mehr brauche ich zZ gar nicht. Was ich so bei google über die Socket-Programmierung gefunden habe erschlägt mich erst einmal, da es meiner Meinung nach auch immer zu wneig kommentiert ist, sodass ich nicht nachvollziehen kann, was überall abläuft.
Muss das unbedingt auf Unix/Linux laufen oder reicht auch Windows?
Du bist unter Umständen besser beraten eine andere Sprache zu verwenden als dich mit der OS API herumzuschlagen. Wie man es macht musst du so oder so lernen, und einige Sprachen verwenden die gleiche Syntax wie C/C++, haben aber Libraries (entweder dabei oder von anderen Anbietern) die das alles für dich kapseln. Der Lern-Aufwand hält sich also eventuell in Grenzen.
Man kann aber auch in anderen Sprachen als C/C++ Cross-Platform programmieren. Java und Python z.B. (gibt sicher noch mehr, aber so genau kenne ich mich da nicht aus). Sogar in einem gewissem Rahmen besser als in C/C++ wo man das Programm neu kompilieren muss. Java z.B. läuft in einer Virtual Machine. Der Byte-Code ist also der gleiche. Die Libraries müssen allerdings jeweils für die Platform passen. Da wird es dann wieder komplizierter.
Und wenn es nur auf dem PC sein muss und du C++ verwenden willst, gibt es Visual C++ mit .NET. Das hat die gleiche Klassenbibliothek wie C#
Naja C# werde ich mir zur Not auch noch ein wenig aneignen können, doch auf Linux muss dann leider auch ein Programm her, da meine Firewall auf IPFire setzt. Eigentlich habe ich nur für die FW das USV entwickelt, da das Netz bei mir recht instabil ist und Strom weg bisher nicht so gut gekommen ist.
Getestet hätte ich den Spaß zunächst unter Windows, da fast alle meine Arbeitsrechner unter Windows laufen. Deine Links schauen schon mal gut/einfach aus, doch wer weiß, ob's das schon war. Ich werde mich weiter damit beschäftigen, wenn nächste Woche das Board + Shield angekommen ist.
Bin gerade darüber gestolpert:
Die meisten Teile von .NET/C# sind damit plattform-unabhängig. Damit geht das auch auf Linux. Man kann Programme auf dem PC schreiben und solange man nichts verwendet was nicht in Mono implementiert ist, laufen sie auch in anderen Umgebungen. Geht sowohl mit Visual Studio, als auch Mono-spezifischen IDEs, wobei man mit letzterem etwas sicherer ist, dass es auch 100% kompatibel ist.
Und was man so liest ist TCP/IP auch cross-Plattform kompatibel. Sowohl mit den TcpClient/TcpServer Wrapper Klassen als auch auf Socket Ebene darunter.