Forum: Mikrocontroller und Digitale Elektronik Textausgabe GLCD


von Thomas (Gast)


Lesenswert?

Servus!
Die Ansteuerung des Grafikdisplays geht einwandfrei. Ich habe in einem
externen EEPROM (Controller hat keines) den Zeichensatz für das Display
abgelegt. Ich kann auch einzeln Buchstaben anzeigen - das ist gar kein
Problem.

Jetzt möchte ich eine Funktion schreiben, dass ich Texte ausgeben kann.
Hier habe ich aber das Problem, dass ich nebenher noch andere
"zeitkritische Dinge" mit dem Controller machen muss. Also möchte ich
ihn nicht in einer Schleife festhängen lassen, bis er die Zeichen
ausgelesen hat und anschließend noch warten, bis er diese auch auf das
Display gespielt hat. Das TWI und das SPI laufen mit Interrupts. Also
eigentlich kein Problem.

Wenn ich jetzt aber z.B. zwei mal etwas schreiben lasse:
write_lcd("Test");
cursor_lcd(2,33);
write_lcd("Test2");

Dann geht er ja bereits zu cursor_lcd weiter, obwohl er mit dem ersten
Schribvorgang noch nicht fertig ist.

Irgendwie stehe ich grade auf dem Schlauch, wie ich das richtig lösen
kann.

Grüße Thomas

von Olaf M. (Gast)


Lesenswert?

Hallo Thomi,

das ist aber frech von dem bösen, bösen Controller.
Wenn er wieder mal sowas macht, mußt Du ihn unbedingt bestrafen.
Laß Dir das keineswegs gefallen!
Mein Vorschlag, wenn er wieder mal einfach weitergeht, dann schick
ihn auf der Stelle zu write_lcd("Test"); zurück.
Wenn er einfach nicht verstehen will, was Du von ihm willst, kannst
Du ihn auch foltern, indem Du ihm für 5 Minuten die Spannung nimmst.

Das mit diesen ungehörigen Controllern kommt mir immer öfter zu Ohren!
Man soll es nicht glauben.

Olaf

von @Olaf (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

Hm - danke für die tolle Antwort!
Wenn dich die Frage nervt, dann überles sie doch einfach. Zwingt dich
doch keiner dazu - zu antworten!

Für alle anderen. Ich wäre für eine kleine Idee, wie sowas gemacht wird
sehr dankbar.

Ich bin inzwischen selbst auf eine Lösung gekommen. Ich kann ja das
Warten doch in einer Schleife machen. Die wichtigen zeitkritischen
Funktionen kann ich dann über den Timerinterrupt machen.

Danke! thomas

von Philipp S. (philipp)


Lesenswert?

Laß Dich nicht irritieren ... manche Leute haben einen eigenartigen
Humor ... (-;

Es gibt -- wie so oft -- mehrere Möglichkeiten, die je nach
Anwendungsfall besser oder schlechter geeignet sein können. Ich kenne
die "Vorgeschichte" nicht, aber vermute, daß Du ein I2C-EEPROM und
einen Graphik-Controller über SPI hast und beide Interfaces
hardwaremäßig im Controller. Was ich nicht weiß: hat Dein Controller
unterschiedliche Interruptprioritäten und wie kritisch sind die
Antwortzeiten für die zeitkritischen Funktionen.

Die vier Kombinationen:

1. Ohne Interrupts: I2C-Zugriff und SPI-Übertragung haben ein
konstantes Timing. Anstelle einer Warteschleife könnte man die
zeitkritischen Routinen aufrufen lassen, ggf. in Häppchen korrekter
Länge aufgeteilt. Das muß gut geplant sein, ist nicht immer hilfreich
und ist fast nie der sinnvollste Weg.

2. Displayansteuerung mit Warteschleifen, Realtimefunktionen mit
Interrupts: so hast Du es wohl jetzt gemacht und so ist es in der Regel
ausreichend. Wenn es aber z.B. auf Energieeffizienz ankommt, will man
den Controller lieber mal schlafen legen, anstatt ihn in Schleifen
zählen zu lassen.

3. Displayansteuerung mit Interrupts, Realtimefunktionen im main.
Klingt vielleicht seltsam, ist aber oft der einfachste Weg, wenn es
einen Haufen Dinge gibt, die "jede Runde" abgearbeitet werden müssen.
Die Displaysachen werden dabei in einen Puffer geschrieben, die
verschiedenen Interrupts geben einander das Staffelholz in die Hand:
wenn Bitmaps aus dem EEPROM gelesen werden, wird ein Interrupt auf das
Ende des Ladevorgangs gesetzt, das die Bitmap dann ans Display
überträgt und wieder die andere aufruft, solange der Puffer noch nicht
leer ist. Ist eigentlich einfacher als es klingt.

4. Beides mit Interrupt. Geht natürlich nur, wenn es entweder
Interruptprioritäten gibt oder die Displayinterruptroutinen so kurz
sind, daß die Echtzeit nicht gefährdet wird. Bei komplexen Aufgaben
wird man mit einer solchen Lösung später den wenigsten Ärger haben.

Soweit meine Erfahrung!

von Thomas (Gast)


Lesenswert?

Hallo Philipp!

Vielen Dank für deine super - ausführliche Antwort.

Du hast Recht. Es handelt sich um einen Grafik-Controller über SPI und
ein I2C EEPROM. Beide Interfaces sind im Controller hardware
integriert.

Ich glaube, dass die zweite Lösung in meinem Fall am Besten ist. Die
Displayroutinen sind absolut zeitunkritisch (wie auch der Zugriff auf
das EEPROM). Die zeitkritischeren Dinge werde ich dann über die
Interrupts erledigen lassen. Sollten die Interrupts des TWI oder des
SPI die zeitkritischen stören, habe ich bei dem Controller auch die
Möglichkeit, Interruptprioritäten zu vergeben.

Vielen Dank nochmals für deine Antwort!
Liebe Grüße
Thomas

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.