Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« on: April 21, 2011, 02:02:23 am » |
Guten Morgen die zweite, ich baue gerade eine Schrittmotorsteuerung und habe hier ein LCD in Betrieb. Das Display wird alle 200ms aktualisiert. Wenn ich nun den Motor drehen lasse, bekomme ich ca jede Sekunge ein Stocken. ausklammern der Display-Funktion hilft, aber dann wird das Display natürlich nicht angesteuert. Kann es sein das der I2C-bus so langsam ist? Ich verwende keine Delays, alles wird über if(currentTime-lastTime>delay){} realisiert. Hier irgendwelche Tips?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
BZ (I)
Online
Brattain Member
Karma: 160
Posts: 15593
+39 349 2158303
|
 |
« Reply #1 on: April 21, 2011, 03:25:33 am » |
Hallo derHerrKohler Machen wir einen Tausch: Code von Dir gegen Tips von uns. Du fängst an.  Grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
NRW
Offline
Sr. Member
Karma: 1
Posts: 373
|
 |
« Reply #2 on: April 21, 2011, 05:44:24 am » |
Hallo derHerrKohler Machen wir einen Tausch: Code von Dir gegen Tips von uns. Du fängst an.  Grüße Uwe Nice!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #3 on: April 21, 2011, 10:13:03 am » |
Hab witzigerweise ein ähnliches Problem gerade heute im mikrocontroller.net Forum entdeckt. Da wurde festgestellt, dass die Displaysteuerung per I2C zu aufwendig (und deswegen langsam) für den kleinen Kerl ist  Lösung: einen Prozessor für die Schrittmotoren, ein Prozessor für die Displaysteuerung - und die beiden per I2C quatschen lassen.
|
|
|
|
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #4 on: April 21, 2011, 11:10:43 am » |
Hm das wäre richtig doof. Ich poste hier mal meinen Code, vielleicht kann man's ja doch noch retten ;-) #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2);
void setup() { // die Pinbelegung habe ich hier raus genommen ...
}
void loop() { ct = micros(); // current Time if (mode!=0) // if the stepper is active { runStepper(); // call the routine to drive } anzeige(); }
void runStepper(){ if (ct - lastSTEP > stepperSpeed){ // stepperSpeed kommt vom POTI digitalWrite(step_pin,HIGH); // make a step delayMicroseconds(stepperSpeed); // wait for some time digitalWrite(step_pin,LOW); // end of the step lastSTEP = ct; }
}
void anzeige(){ if (ct - lastRESET > 200000){ // currentTime - lastResetOfLCD > DELAY
switch (LCDmode){ case 0: slideLCD(); break; case 3: a = "Position:"; b = stepperPosition; c = "Time:"; d = "mm/s"; break; case 4: a = "Position:"; b = stepperPosition; c = "T:"; d = "0:00:00"; break; }
if (a!=lastA || b!=lastB || c!=lastC || d!=lastD){ lcd.clear(); }
lcd.setCursor(0, 0); lcd.print(a); int posB = 16 - b.length(); lcd.setCursor(posB, 0); lcd.print(b); lcd.setCursor(0, 1); lcd.print(c); int posD = 16 - d.length(); lcd.setCursor(posD, 1); lcd.print(d); lastA = a; lastB = b; lastC = c; lastD = d; lastRESET = ct; } }
Der Code ist hier stark verkürzt, nicht an den fehlenden Variablenzuweisungen stören bitte... ich dachte mir: Mach mal nur die wichtigen Sachen rein!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #5 on: April 21, 2011, 12:17:14 pm » |
also am Code fällt mir jetzt nichts spezielles auf. Vielleicht holst du noch etwas geschwindigkeit heraus, wenn du das, was angezeigt werden soll in einen String schreibst und ihn über einen einzelnen "print" ausgibst... aber sonst sehe ich da wenig Potential. Was passiert, wenn du das delay (die 200ms) raufsetzt? Immer noch jede sekunde ein stocken oder länger / kürzer?
edit: Ich seh gerade, du clearst jedesmal das komplette Display, wenn sich etwas ändert. Da könnte man evtl auch noch ansetzen, indem man nur die zu ändernden Positionen anfährt...
|
|
|
|
« Last Edit: April 21, 2011, 12:19:51 pm by Marcus W »
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #6 on: April 21, 2011, 12:46:22 pm » |
Beim erhöhen des Delays taucht das Problem in längeren anständen auf. gibt es eine schöne Möglichkeit, Strings so zu verketten um nur 2 Prints (je Zeile einen) zu verwenden? Mir fällt da gerade kein weg ein.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #7 on: April 21, 2011, 01:30:39 pm » |
String1 + String 2  sprich : string a = "hallo Welt "; string b = " dies "; string c = " ist ein Test." double d = 27 /4.5; print (a + b + c + d); Ausgabe: "Hallo Welt dies ist ein Test.6"; EDIT: für die Rechtsausrichtung kannst du die posLänge als schleife in den String Leerzeichen machen; string leer = ""; for (int i =0; i<posX;i++) leer+= " "; Nochmal EDIT: Du kannst es mit Autolinebreak auch in eine Zeile machen, da dank der eingefügten Leerzeichen eh kein platz mehr in der Zeile ist. Dann brauchst du nur einmal print();.
|
|
|
|
« Last Edit: April 21, 2011, 01:41:10 pm by Marcus W »
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #8 on: April 23, 2011, 02:51:27 am » |
Danke Marcus,
das ist ein toller Ansatz! Wie kann ich den Autolinebreak aktivieren? Mein Display macht das nicht...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #9 on: April 23, 2011, 03:06:07 am » |
hmm... keine ahnung. normalerweise macht er das automatisch, allerdings nur wenn ich nur eine Zeile schreibe, wenn ich allerdings den Cursor händisch veränder, setzt er mir den fehlenden Text unter den Cursor.
|
|
|
|
« Last Edit: April 23, 2011, 03:12:19 am by Marcus W »
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #10 on: April 23, 2011, 10:17:07 am » |
Hi Marcus, bei mir schreibt das Display alles in eine Zeile. Aber das macht nichts, denn ich habe meinen Code jetzt einfach soweit verändert, das während der Fahrt nichts mehr verändert wird. Außerdem habe ich die Zeilen zusammengefügt und habe nun nur noch 2 Printbefehle und somit auch kein LCD.clear() mehr. Fühlt sich so auch besser an, irgendwie... Danke für deinen Wegweiser!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #11 on: April 23, 2011, 03:02:55 pm » |
Ja... bei mir momentan irgentwie auch. Ich glaub bei ner alten Version der IDE war ne andere Version der Lib dabei - die hatte den Zeilenumbruch noch  Aber ich würde an deiner stelle nicht komplett auf refresh verzichten während der Bewegung - sieht doch besser aus, wenn da Action auf dem Display ist - ich glaube dein Stocken rührte von dem clearen her. Versuch mal die ganze Geschichte mit 2 prints, ohne clear und alle 200ms. Ich glaube das sollte hinhauen...
|
|
|
|
|
Logged
|
|
|
|
|
Traunstein, Germany
Offline
Full Member
Karma: 0
Posts: 111
|
 |
« Reply #12 on: April 23, 2011, 03:21:54 pm » |
Habe ich ausprobiert, funktioniert leider nicht. Sobald ich das Display wärend der Fahrt aktiviere, ist das stocken da - selbst ohne LCD.clear(). Die Abstände zwischen dem Stocken kann ich dafür bequem über mein delay einstellen...
|
|
|
|
|
Logged
|
|
|
|
|
Offline
God Member
Karma: 8
Posts: 618
42
|
 |
« Reply #13 on: April 23, 2011, 04:32:47 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
|