Forum: Mikrocontroller und Digitale Elektronik Unterschiedliche Loop Geschwindigkeiten mit einem 0.96 OLED Display


von Sandro N. (nick2245)


Angehängte Dateien:

Lesenswert?

Hallo Community,

Ich habe eine Verständnisfrage zu einem Sketch. Ich benutze einen 
Arduino Nano und ein 0.96“ OLED Display das über IIC angeschlossen ist. 
Ich habe aus einem Beispiel Sketch die Teile raus gesucht, die für mich 
relevant sind und den Rest weggelassen.
Sinn dieses Programmes sollte sein, eine Art Geschwindigkeitstest 
durchzuführen, wie lange der Sketch braucht um 100 Loop Durchläufe zu 
schaffen. Dabei wird auf dem Display etwas angezeigt und danach der 
Zähler um eins erhöht. Jetzt beginnt die Loop Funktion von vorne. Wenn 
der Zähler die 100 erreicht hat, wird die Zeit in Millisekunden 
angezeigt.
Nun musste ich feststellen, dass es einen Unterschied macht wo im Sketch 
der Befehl
x++; steht.

Ich habe mich für zwei Möglichkeiten endschieden.

Möglichkeit 1) x++; steht direkt in der void draw() Methode. Dann 
braucht mein Nano 536ms bis die 100 Loop Durchläufe erreicht sind.

Möglichkeit 2) wäre das x++; in den Loop Teil zu schreiben. Dann brauch 
der Nano allerdings 4054ms bis er 100 Loopdurchläufe erreicht hat.

Von meiner Logik her, hätte ich gedacht es spielt keine Rolle wo im 
Sketch die 1 addiert wird. Aber es scheint so, als würde ich hier was 
nicht richtig verstanden haben.

Meine Frage ist also: kann mir jemand mit einfachen Worten erklären 
warum das so ist?

Hier also der Sketch. Zählt der jetzt eigentlich noch unter kurz oder 
hätte ich den als Dateianhang senden müssen ?

#include "U8glib.h"
U8GLIB_SSD1306_128X64 
u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);   //U8glib, 
Fast I2C / TWI 100 Neuzeichnungen in 570ms

int x = 0;
int z = 0;

void draw(){
u8g.setFont(u8g_font_6x13);             // U8glib, Schriftart festlegen
u8g.drawStr( 0, 10, "Hello World");     // U8glib, Text ausgeben
u8g.setPrintPos(18,30);                 // U8glib, Position für Zahl 
festlegen
u8g.print(x);                           // U8glib, Zahl an Position 
schreiben
x++;                                    // nach jedem Loopdurchlauf x+1 
<- Möglichkeit 1 (536ms bis 100 Loop Durchläufe erreicht sind
if(x==100){z = millis();}               // wenn 100 Loops erreicht sind 
speiche die Zeit in z
u8g.setPrintPos(18,50);                 // schreibe an dieser Position
u8g.print(z);                           // den Wert von z
}

void setup(){}

void loop(){
//x++;                                                   // <- 
Möglicheit 2 (4054ms bis 100 Loop Durchläufe erreichtsind)
u8g.firstPage(); do {draw();} while (u8g.nextPage());    // U8glib, Ruft 
die zeichnen Methode auf
}

von leo (Gast)


Lesenswert?

Sandro N. schrieb:
> do {draw();} ...

Die Anzahl der draw-Aufrufe ist ungleich groesser als die 
loop-Durchlaeufe.

leo

von Johann J. (johannjohanson)


Lesenswert?

https://www.youtube.com/watch?v=33sOIHPwpfQ

Schau Dir mal an, was die Funktionen
1
u8g.firstPage();

und
1
u8g.nextPage();

so machen. Und nutze bitte eine gescheite Formatierung - Dein Code ist 
vollkommen unleserlich.

von Johann J. (johannjohanson)


Lesenswert?

leo schrieb:
> Die Anzahl der draw-Aufrufe ist ungleich groesser als die
> loop-Durchlaeufe.

Dann erkläre ihm doch mal, warum das so ist.

von Stefan F. (Gast)


Lesenswert?

Johann J. schrieb:
> Dann erkläre ihm doch mal, warum das so ist.

Hat er doch schon mit "loop-Durchläufe". Dieser Wink mit dem Zaunpfahl 
sollte genügen.

von Johann J. (johannjohanson)


Lesenswert?

Stefanus F. schrieb:
> Dieser Wink mit dem Zaunpfahl
> sollte genügen.

Na ja - er sollte halt begreifen, was die ug8-Lib und ihre Funktionen so 
tun ...

von Stefan F. (Gast)


Lesenswert?

Johann J. schrieb:
> Stefanus F. schrieb:
>> Dieser Wink mit dem Zaunpfahl
>> sollte genügen.
>
> Na ja - er sollte halt begreifen, was die ug8-Lib und ihre Funktionen so
> tun ...

Das "Problem" ist aber von dieser Library völlig unabhängig. Es geht 
darum, ob die Variable x innerhalb oder außerhalb der 
wiederholschleife erhöht wird. Wenn man wiederholt erhöht, dann 
kommt da natürlich ein andere Ergebnis bei raus.

von Johann J. (johannjohanson)


Lesenswert?

Stefanus F. schrieb:
> Es geht
> darum, ob die Variable x innerhalb oder außerhalb der
> wiederholschleife erhöht wird. Wenn man wiederholt erhöht, dann
> kommt da natürlich ein andere Ergebnis bei raus.

Nö - es geht darum, dass in der Wiederholschleife das komplette Bild an 
das Display übergeben wird - und erst danach ein neuer Bildaufbau 
erfolgt. Die Änderungen ( Draw(..) ) wirken sich nur auf den noch nicht 
übertragenen Teil des Bildes aus - das ist im Video schön zu sehen.

Deswegen sollte man eine Vorstellung von den Funktionen haben, welche 
man nutzt.

von Eric B. (beric)


Lesenswert?

Der Kommentar vom "LDP" hier [1] beschreibt ganz gut wozu dieses 
firstPage/nextPage-loop-Gedöns gut ist (Englisch!):

[1] 
http://henrysbench.capnfatz.com/henrys-bench/u8glib-graphics-library-user-guide/u8glib-arduino-oled-tutorial-2-playing-with-the-picture-loop/

von Johann J. (johannjohanson)


Lesenswert?

Eric B. schrieb:
> beschreibt ganz gut wozu dieses
> firstPage/nextPage-loop-Gedöns gut ist

yep.

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.