www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitkritische LCD-Ausgabe


Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ich möchte gerne 5 LCD-Displays (insg. 10 LCD-Controller also 10 
Enable-Ausgänge am Controller, die Displays sind ansonsten parallel 
geschaltet) mit einem AtMega2560 Ansteuern. Nun habe ich mich gefragt, 
wie lange es dauert, bis alle 10 Controller ihre Daten bekommen haben. 
Bei einem Display meine ich, dass es schon an die 100-200ms gehen könnte 
(geschätzt) aber ich kenne leider keine genauen Werte.

Nun überlege ich, ob es schneller ist, einem anderen Controller die 
Daten zu schicken, damit der 2560 zwischenzeitlich zeitkritische 
Aufgaben erledigen kann.

kleine Rechnung (ohne Overheads):
1 byte = 8 bit = 1 Zeichen
1 Displaycontroller = 80 Zeichen = 80*8=640 bit
10 Displaycontroller = 640*10=6400bit

wäre eine Übertragung von 19200kbit/s möglich, würde das schon 330ms + 
Overheads dauern...und dementsprechend hätte ich vermutet, dass eine 
parallele Displayansteuerung wohl noch länger brauchen würde....

Der uC soll neben der Ansteuerung der 5 Displays die Motoransteuerung 
eines Fahrzeugs übernehmen, sodass es keine großen Latenzen geben darf.


Ich hoffe Ihr Versteht mein Problem und könnt mir weiterhelfen ;-)

M.f.G. Mats Marcus

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jedes HD44780 Display braucht zwar 50µs pro Zeichen, das lässt sich aber 
locker interleaven. Also ein Zeichen ans Display, dann kommt das nächste 
Display dran (bzw. das nächste E). Ergibt 80x50µs = 4ms alle zusammen. 
So schnell kann keiner gucken.

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
O.o so schnell kam mir das gar nicht vor :D
aber 40ms für alle Zeichen dürfte ausreichen, ansonsten schreibe ich 
immer nur eine Zeile oder einen HD44780, berechne was neues, dann kommt 
die nächste Zeile oder so, das würde ja auch noch gehen, wenn 40ms zu 
lang wären.

Interleaven => "Anhalten nach ein Paar zeichen und später weiter 
übertragen"?


Woher hast du hei Zeit zur übertragung eines Zeichens? (Datenball vll 
ich Idiot schnellmalebensuchen)

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

am einfachsten ist es wohl, wenn du die Motor-Ansteuerung per 
Hardware-PWM machst. Dann kannst du in der Software herumwerken, wie du 
möchtest.

Ansonsten wäre die Ansteuerung auch in Software in einem Timerinterrupt 
zu lösen, wobei du aber dann mit der PWM-Frequenz in den hörbaren 
Bereich kommst (der Motor wird brummen).

Befehle dauern bei den Displays recht lange, dafür kannst du Daten, also 
zB Text recht flott takten, näheres entnehme man dem Datenblatt.

Mal aus Interesse: Wozu 5 Displays á 4x40?

Gruß
David

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibt es da nicht auch eine Mindestzeit für das Aktivieren der 
Enable-Leitung?

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mats Marcus wrote:

> aber 40ms für alle Zeichen dürfte ausreichen,

Nicht 40ms. 4ms. 50µs für 10 Zeichen, pro Controller eines. Wenn's 
brennt. Aber zeilenweise wird das natürlich nichts.

> Woher hast du hei Zeit zur übertragung eines Zeichens? (Datenball vll
> ich Idiot schnellmalebensuchen)

Ebendort. Wobei ich oft keine Ready-Abfrage mache und folglich den 
R/W-Pin einspare. Sondern schlicht so lange warte, bis die vorgegebene 
Maximalzeit durch ist.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David Madl wrote:

> gibt es da nicht auch eine Mindestzeit für das Aktivieren der
> Enable-Leitung?

Aber ja doch. 500ns unten 500ns oben. Wer mit 6502 angefangen hat kennt 
dieses Timing im Schlaf, denn von 6800/6500 stammt dieses Interface.

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, es werden sehr viele Daten ausgegeben: Das Gefährt wird ca. 6 
Energiequellen Nutzen, Akkus laden und entladen können, 3 Motoren habe 
und viel, viel Mehr. Die Daten wollen alle auch schön ausgegeben werden 
und selbst mit 5  4x40er Displays passt mit 2 Daten je Zeile schon nicht 
alles drauf, sodass die Displays immer verschiedene Informationen 
anzeigen müssen und nicht immer die gleichen Variablen Ausspucken 
werden... Und es wirkt halt auch nicht schlecht ;-)

Der/Die PWM werden via Hardware realisiert, ich dachte jetzt eher an 
Interrupts (zur Geschwindigkeitsberechnung, ABS, BKV, TC usw.), Bremsen 
usw. also sicherheitstechnische Sachen

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nett ;)

nun, Interrupts stören dich beim Ansteuern des Displays ja nicht. Wenn 
der Interrupt vor dem Enable-Puls kommt, dann wartet das Display eben 
länger auf seine Daten, wenn der Interrupt nach dem Enable-Puls kommt, 
stört es das Display ja auch nicht, da die gültigen Daten bereits 
anliegen.

Ich hätte bei dem Aufwand lieber ein UART per Kabel vom Gefährt zum PC 
verlegt :)
Oder wenns aus der Entwicklungsphase raus ist, eine Funkübertragung, 
wobei die dann natürlich etwas aufwändig ist (außer man nimmt sich so 
ein Funkmodul der 50 €-Klasse).

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau genommen sind es sogar nur 37-43µs pro Zeichen/Kommando, je nach 
Chip. Clear/Home baucht länger, aber das braucht man auch nicht so oft.

Autor: Mats Marcus (elektrofreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
an ein UART hab ich auch schon gedacht (da man ja auch den Buffer nutzen 
kann und so Zeit sparen kann).Allerdings müsste die 
Übertragungsgeschwindigkeit schon um die 200kbit/s+ liegen, damit es 
Sinn macht im performanter Hinsicht (dazu muss man sich noch Gedanken 
zum Protokoll machen)...desshalb wäre eig. eine direkte Ansteuerung der 
Displays nicht viel schlechter...

achso: es wird gar kein PC verwendet, nur uC und LCD ;-)

noch eine kleine Frage: ist 8 bit schneller als 4 bit Ansteuerung (oder 
wann verwendet man 8 bit)?

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Markus,

das Display ansteuern würde ich immer mit einem eigenen
kleinen Atmel machen, als SPI-Slave mit einfachen Befehlen
(z.B. POS Zeile,Spalte  TEXT "Hallo" etc.).

Als Haupt-uC einen neueren Atmel mit einer RS232 als SPI-Master.
Da gibt es dann auch einen Zwischenspeicher mit Leererkennung, d.h.
es sind tatsächlich Takt/2 als Bitrate möglich.
Ohne Overhead bei 20 MHz eine 40 Zeichenzeile in 32 us Übertragen.
Den Rest macht dann der Save.
Es können dann auch einfach weitere Displayeinheiten angeschlossen 
werden.

Gruß Hans

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast also 10 Displays an einem Bus.

Wenn man nur ein Display beschreibt, dann muss mann zwischen den Zeichen 
eininge µs (ca. 50) warten (Gähn, träge)

Aber, wenn man alle 10 Displays nach einander beschreibt (in jedes 
Display nur ein einziges Zeichen), dann sind doch innerhalb von null 
komma nix 10 Displays um ein Zeichen weiter und dann warten ca. 50µs bis 
die Displays das auch gemacht haben und das zweite (nächste) Zeichen in 
jedes einzelne Display geschrieben werden darf ...

Und wo ist da das Geschwindigkeitsproblem?

In der Programmierung muss nur eine Logik drin sein, die anhand von 10 
Display Buffer jedem Display sein Zeichen ausspuckt...

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder man nimmt ein schönes grafisches 128x64 oder 240x128 Display :-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dass man 10 Displays quasi parallel beschreiben kann (also je nur ein 
Zeichen in alle LCDs), wurde ja schon genannt. Jetzt kommt es darauf an, 
wie Du die auszugebenden Daten organisierst.

Ich empfehle einen (großen) "Bildschirmspeicher", in dem jedes LCD einen 
bestimmten Platz belegt. Besonders einfach wird es, wenn alle LCDs die 
gleiche Zeilenlänge haben.

Ein Locate-Macro sorgt dafür, dass in den gewünschten Bereich 
geschrieben wird, die Schreibroutine sollte Fließtext und einige 
Steuerzeichen (Zeilenumbruch, Locate, CLS (Überschreiben mit 32), ...) 
unterstützen.

Die LCD-Update-Routine wird vom Timer angeschubst und schickt aus dem 
Bildschirmspeicher je ein Zeichen an jedes LCD. Es verwaltet dazu nur 
den Pointer für das erste LCD und incrementiert (innerhalb einer Runde) 
den Lesepointer blockweise (LCD-bereichsweise). Am Zeilenende wird dann 
das LCD neu positioniert, dabei können gleich die Zeilen entwirrt 
werden. Der Bildschirmspeicher (im AVR) kann also fortlaufend 
organisiert sein.

Alternativ kannst Du mal über ein GLCD 320x240 mit Benedikts Ansteuerung 
im Mega8 nachdenken, das wird vermutlich einfacher und billiger.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.