Ich bin Arduino-Anfänger und nutze eine Aufgabe zum lernen, anders geht es nicht.
Mein Wunsch ist, einen Schritmotor mit 2 Taster(oder Joystick),
vor und zurück zufahren. Ein weiterer Taster soll nacheinander die Wahl von drei
Geschwindigkeitstufen ermöglichen: Schnell, langsam, Einzelschritt.
Soweit würde ich das ja noch hinbekommen. Wichtig ist allerdings, das ein LCD die aktuelle
Position des Schrittmotors anzeigt und ein weiterer Taster das Resetten der jeweiligen
Position zulässt.
Problem ist einfach, wenn ich in der Motoransteuerungsschleife die Ausgabe an das LCD
mit einbaue, der Motor nicht mehr "rund" läuft.
Ja.... ich habe bereits gesucht und Hinweise gefunden, das das I2C Protokoll hier wohl die Bremse ist.
SPI wäre wohl eine Option mit der ich null Erfahrung habe. Viele angebotene SPI Displays sind in der
Regel sehr 'grafisch' was ich eigentlich nicht brauche. mir reicht ein 16x2,
mehr soll es auch nicht sein. Erstmal.
Hätte ich weniger Probleme, wenn ich wie damals das LCD über HD44780 anschließe?
Was mir an Deinen Ausführungen nicht gefällt: MotoransteuerungsSCHLEIFE.
Also während der Motor in dieser Schleife drin steckt, passiert eh nichts Anderes - da braucht's dann auch keine großartige Anzeige auf dem LCD - Du kannst eh NICHTS daran ändern - oder fragst Du in der Schleife auch noch die Taster ab?
Also: Schleife weg - nutze loop() als Schleife (ist's eh schon).
Du musst 'nur' herausfinden, was Du 'in diesem Durchlauf' machen willst - unterm Strich ist Das dann ein endlicher Automat(eine Schrittkette/eine State-Maschine.
Dazu hat combie Mal was zusammen getragen.
Wenn Du Dein Sketch zeigen würdest, könnten wir Da ggf. auch das Eine oder Andere ausbessern.
LCD-Befehle brauchen Zeit.
lcd.setCursor(0, 0); wird direkt mit anderen Koordinaten überschrieben - also unnötig.
Auch ist lcd.clear() eine sehr zeitintensive Möglichkeit, die drei zeichen vom Display runter zu bekommen - das DaBla des Display (oder eines HD44780) zeigt die typischen Wartezeiten, bis das Display damit fertig ist.
Je nachdem, wie die Lib gestrickt ist, WARTET Die, damit folgende Befehle nicht an einem 'blockiertem Display abprallen'.
Warum englische Kommentare, wenn's doch für Hilfe den deutschen Zweig bevorzugst?
Im englischsprachigem Bereich dürftest Du eine höhere Anzahl potentieller Helfer ansprechen.
MfG
Edit @Uwe
Wenn Du den HD44780 aber 'zu Fuß' ansprichst - also z.B. 4-bit - bist Du nicht an den Takt von I²C gebunden - musst aber halt auch auf ALLES selber achten.
Klar, auch hier musst Du Dich an die Wartezeiten halten - kannst Die aber - millis() sei Dank - aber auch ohne delay() abfrühstücken.
Das Interface funktioniert mit 1MHz. In einem Register gibt es ein BUSY Flag, das ausgewertet werden müßte um zu warten damit man wieder Daten schicken kann. Da man sich aber beim Interface meist die R/W Leitung spart, und darum das Display nicht lesen kann, muß man das Timing auf der sicheren Seite halten und darum langsamer übertragen.
Ich hab jetzt anstatt des I2C Displays mal eins mit HD44780 angeschlossen,
leider hatte der Motor dann immernoch einen unruhigen Lauf.
Ich habe dann den code bis auf das nötigste ausgedünnt, also nur Motorbewegung
ohne Positionsanzeige auf Display, dann läuft der Motor wie ich es mir vorstelle.
Ich welche Richtung muss ich nun suchen um dort irgendwie die Positionsanzeige
auf das Display zu bekommen? Muss der Motor komplett anders angesteuert werden ?
Du kannst den LCD-Aufruf auch aufsplitten.
Da Du den Takt mit übergibst, geht Das.
So sendest Du nur so viele Bits (bzw. Nibbles), wie Du Zeit hast.
Weiter macht Es keinen Sinn, die Anzeige viel öfter als 2x die Sekunden zu aktualisieren.
Ob Das die Lib bietet, also das Aufteilen der einzelnen Bytes, ist eher fraglich.
Für Fragen, wie so ein LCD intern tickt, gibt'sSprut.de.
Du könntest für die Ansteuerung des Steppers die MobaTools verwenden. Die erzeugen die Stepimpulse im Hintergrund per ISR und lassen sich vom I2C nicht stören.
Die Anzeige weniger oft zu aktualisieren bringt's auch nicht wirklich. Dann 'stolpert' der Stepper nur seltener . Es ist prinzipiell problematisch, die Stepimpulse im loop zu erzeugen, wenn dort Aufrufe enthalten sind, die rel. lang dauern - zumindest länger als die Zeit zwischen 2 Stepimpulsen.
N.B. Die MobaTools kannst Du über den Bibliotheksverwalter der IDE installieren