Was mache ich fasch??

Beschäftige mich seit einigen Tagen mit dem Arduino (IDE 1.0.5 r2)
Aber ich hab immer wieder Timingprobleme, vor allem ist mir aufgefallen das manche funktionen extrem viele Taktzyklen brauchen.
hier ein Beispiel vom Ausgang Toggeln:

digitalWrite(2,HIGH);
digitalWrite(2,LOW);

braucht 3945 ns / 64 Takte

PORTD ^= (1<<2);
PORTD ^= (1<<2);

braucht 190 ns / 3 Takte
das ist über 20fach schneller!

Was mache ich fasch?

Gemessen mit einem Logikanalyser bei 200MHz samplingfrequenz, siehe Anhang.
Mein Arduino ATmega328P @ 16MHz / 5V

Du machst nichts falsch. Die Arduino IDE ist auf einfache Verwendung ausgelegt. Nicht auf Performance! Das sieht man auch an zig anderen Stellen.
Die Arduino Pins sind nicht mit den Prozessor Pins identisch. Die Zeit geht da drauf um die Pin-Nummern auf die Prozessor Bezeichnungen umzusetzen.

Wenn die Pins beim Kompilieren bekannt sind gibt es digitalWriteFast als Alternative:
https://code.google.com/p/digitalwritefast/

Siehe auch hier:
http://www.billporter.info/2010/08/18/ready-set-oscillate-the-fastest-way-to-change-arduino-pins/

Danke für deinen Tip!
ich sag nur:
O! M! G!

ich mein ist ja sehr gut so das die IDE alles möglich checkt und alles richtig mappt. aber das is doch eine sache der kompelierung.
Dass das ganz dann zur laufzeit auch noch immer so aufgebläht sein muss dafür habe ich allerdings kein verständniss :frowning:

uje-uje... Arduino ist jetzt in meinem ansehen schwer gesunken!

Werd mal mit den macros arbeiten bzw. gleich ne eigene library schreiben um diese immer wieder zu erweitern.
Tja dann könnt ich allerdings gleich beim AVR Studio bleiben hmmm schade.

PS: wems interessiert: analogRead hab ich gemessen mit 115 us :astonished: 1840 Takte @ 16MHz

Arduino ist halt auf Anfänger und Hobby-Anwendung ausgerichtet. Nicht an Informatiker. Deshalb opfern viele Funktionen Performance und Speicher für Komfort. Oder Funktionen sind generell anders implementiert als es in Standard C üblich ist, was manchmal nervt. Für viele Anwendung reicht digitalWrite() aber auch aus. Um ein paar LEDs oder Relais langsam zu schalten braucht man keine Schaltzeiten im 100-ns Bereich. Man muss sich nur darüber im Klaren sein, wann man es statt dessen per Hand machen sollte. Da hapert es gerade bei Anfängern, da die Arduino Macher auch die Hintergründe bewusst verstecken.

Du kannst aber einfach die Arduino Sprachmittel mit reinem AVR C und Dingen wie direkter Port-Manipulation mixen. Je nach dem wann welche Version Vorteile bringt.

PS: wems interessiert: analogRead hab ich gemessen mit 115 us  smiley-eek 1840 Takte @ 16MHz

Liegt am festen Prescaler. Ist aber größtenteils in dem von Atmel empfohlenem Bereich für 10 Bit Auflösung was die Taktrate des ADCs betrifft. Sukkzessive Approximations ADCs sind nunmal langsam. Aber auch das kann man - eventuell auf Kosten der Genauigkeit - einfach verbessern:
http://www.microsmart.co.za/technical/2014/03/01/advanced-arduino-adc/

Für dauernde Messungen gibt es natürlich bessere Möglichkeiten wie freerunning mode und den conversion complete Interrupt. Da wird nach jeder Wandlung automatisch eine neue Messung gestartet und zwischen den Interrupts kann das Programm was anderes machen. Das kann man dann per Hand programmieren.

hi,

einfach bei wikipedia nachlesen, für wen arduino entwickelt wurde. programmierer stehen nicht dabei.

gruß stefan

P.S.: alle achtung, daß Du als zwolfjähriges mädchen (O! M! G!) schon so locker bits verschiebst. die meisten mädels in Deinem alter sind da noch nicht so weit...

stift:
uje-uje... Arduino ist jetzt in meinem ansehen schwer gesunken!

Werd mal mit den macros arbeiten bzw. gleich ne eigene library schreiben um diese immer wieder zu erweitern.
Tja dann könnt ich allerdings gleich beim AVR Studio bleiben hmmm schade.

Wenn Du Deine Pins schneller setzen möchtest und die Pins sind im Programm Konstanten, dann kannst Du Dir auch irgendwo im Internet Makros für digitalReadFast und digitalWriteFast raussuchen und verwenden.

Die Arduino-Funktionen sind schon so das schnellstmögliche, und zwar für Pins, die erst zur Laufzeit des Programms feststehen. Also wenn der Pin beispielsweise eine Variable ist, die zur Laufzeit ausgerechnet wird und danach soll der Pin gesetzt werden. Das ist in vielen Programmen zwar gar nicht notwendig, aber aus Gründen der Einfachheit gibt es in der Arduino-Software nur diese eine langsame Funktion, die an einer variablen Pin-Nummer funktioniert.

Ich glaube, von "digitalReadFast" und "digitalWriteFast" gibt es sogar Versionen, bei denen das Makro prüft, ob die übergebene Pin-Nummer eine Konstante oder eine Variable ist: Ist es eine Konstante, wird der Pin viel schneller gesetzt, und ist es eine Variable, dann wird das langsame digitalRead/digitalWrite aufgerufen.

Im übrigen ist es Dir unbenommen, auch in der Arduino-Software die Ports direkt über die Register des Atmega zu setzen.

jurs:
Ich glaube, von "digitalReadFast" und "digitalWriteFast" gibt es sogar Versionen, bei denen das Makro prüft, ob die übergebene Pin-Nummer eine Konstante oder eine Variable ist: Ist es eine Konstante, wird der Pin viel schneller gesetzt, und ist es eine Variable, dann wird das langsame digitalRead/digitalWrite aufgerufen.

Die Version die ich oben verlinkt habe macht das:

It can speed things up when the pin number is known at compile time, so that digitalWrite(9,HIGH); is speeded up. On the other hand a loop with digitalWrite(i,HIGH); or a called function with the pin number as a passed argument will not be faster.

Ich verstehe Deine Klagen nicht.
Arduino ist für Studenten eines Universitätskurses für interaktives Design entwickelt worden und erst dann hat sich Arduino verbreitet und wird großteils von Elektronikbastlern, die nicht 2 Monate das Datenblatt des Kontrollers studieren, verwendet.
Du bist frei den nackten Controller zu verwenden und diesen sehr hardwahrenah ohne Arduinobibliotheken zu programmieren aber erlaube den anderen eine Entwicklungsumgebung zu verwenden die kein tiefgründigen Hardwareinterna-Wissen haben.

Viele Grüße Uwe

@uwefeld:
das war auch der grund warum ich zu arduino 'gewechselt' bin um nicht andauernd ins datenblatt zu schaun müssen.
Wollte mich auch mehr auf meinen programmablauf konzentrieren können als dauernd rigistermanipulation zu konstruieren.
Aber leider kann ich mich beim Arduino wiederum auch nicht auf das wesentliche konzentrieren weil ich viel zu oft mit seinen einschränkungen konfrontiert werde.

Und gerade dann wenn user etwas herum programmieren sollen ohne hardwarekentnisse, sollte der interpreter erst recht ressourcenschonend sein. Das 20-fache zu verbraten für einen Pin zu schalten ist (sorry) lächerlich.

Aber ja du hast recht. Das System ist nichts für Programmierer. Werde es denn noch weiter für mini-anwendungen verwenden.

Von welchem Interpreter sprichst Du?
Es ist in jeder Hochsprache so, daß zeitkritische Programmteile Hardwarenah
in Assembler geschrieben werden.

Die Aufgabe eines professionellen Programmierers ist es ja gerade zu wissen ws die einzelnen Funktionen bewirken und in welchen Fällen man sie besser nicht verwendet sondern andere Wege geht. Die Alternativen Wege sind bei Arduino ja auch dokumentiert und frei verfügbar.

Grüße Uwe

uje-uje... Arduino ist jetzt in meinem ansehen schwer gesunken!

Selbst mit digitalWrite könntest du eine Led - PWM - Ausgabe schreiben, die nicht flackert, und gleichzeitig mit digitalRead Taster-Betätigungen auswerten :wink:
So ein Controller hat üblicherweise so gut wie nichts zu tun, und sollte nur schnell genug reagieren.
Die 16 MHz des Arduino sind überreichlich für die meisten Anwendungen.

Für andere Anforderungen kannst du avr-gcc direkt verwenden, das hast du ja selbst gemerkt.
Und bei ganz anderen Anforderungen sitzt du mit einem atmega328p eh auf dem falschen Pferd.

Viel schlimmer an der IDE finde ich das Pseudo-Syntax-Highlighting nach keywords.txt
Warum wird eine lokale Variable in einer anderen Farbe dargestellt, je nachdem ob ich sie state, status oder Status nenne ?