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
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.
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)
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
gibt es da nicht auch eine Mindestzeit für das Aktivieren der Enable-Leitung?
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.
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.
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
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).
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.
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)?
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
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.