PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Display schneller ansteuern? Wie?



Robs0412
23.05.2007, 10:25
Hallo,

eine Frage zu BASCOM und Displays.
Ich nutze einen ATmega88 mit 8 MHz, Display über 4-Bit Ansteuerung

Ich muss eine Motordrehzahl auswerten und diese auf einem Display ausgeben. Des Weiteren berechne ich Parameter, die für eine Einspritzanlage zur Verfügung stehen müssen. Soweit funktioniert alles gut.

Mein Problem:

Die Übertragung von z.B. 4 Zeichen (Drehzahl) dauert mit der BASCOM Routinen „Lcd ...“ laut Simulation fast 5 ms, sowie die Positionierung des Coursers (“Locate x,y”) fast 1ms.
Dies ist zu lang für meine Aufgaben. Ich habe oft zwischen zwei „Drehzahlimpulsen“, zwischen denen ja auch noch die Berechnungen gemacht werden müssen, nur 5 ms Zeit.

Gibt es eine Möglichkeit, das ganze schneller zu übertragen (außer 8-Bit) oder ist die Übertragungsgeschwindigkeit vom Display vorgegeben? Kann man vielleicht geschickt „manuell“ programmieren (Assembler)?

Für Ideen bin ich dankbar!

Viele Grüße

Robert

chr-mt
23.05.2007, 11:51
Hi,
Hast du die LCD LCD4lib ausprobiert ?
Die sollte vielleicht schneller sein.
Kann aber sein, daß dafür die Pins an einem Port liegen müssen, weiß ich aber nicht, da ich die noch nicht verwendet habe.


An sonsten, im Notfall, aber äußerst unsauber:
Crystal auf 4000000 stellen, eventuell auch auf 2000000 stellen
Bascom berechnet dann die Zeiten anders (kürzer)
Eventuelle Waits etc sind dann aber auch kürzer und müssten angepasst werden.
Auch die Baudraten ändern sich dann jeweils, also alles was mit Zeiten zu tun hat.

Gruß
Christopher

Robs0412
23.05.2007, 16:45
habe kurz mal in der help drüber gelesen. Da gibts ja auch die LCD4Busy. Habe aber nicht verstanden, wie genau das Display jetzt an den µC angeschlossen werden muss? An einen Port?

Hat jemand ein Beispiel...?

Danke!

Robert

chrigri
23.05.2007, 18:34
Hi Robs0412...

Habe eine 4-Bit Ansteurung in C. Wenn du dich dafür interessierst meld dich.
Habe fast keine Wartezeiten. Bei wichtigen Operationen check ich kurz das Buys-Bit und fertig.

lg Cri

Dnerb
23.05.2007, 21:01
Also entweder Du machst Dir die Mühe und setzt den Cursor mit ein paar Codezeilen Assembler quasi von Hand und schickst auch die Daten per Assembler ans Display, oder Du überlegst Dir, ob Du wirklich 200(!) mal in der Sekunde das Display Refreshen willst...

Ich würde da eher mal den Display Refresh etwas gemütlicher gestallten, denn so schnell gucken kann kein Mensch!

Robs0412
23.05.2007, 21:11
@Dnerb:
hast ja recht, werde Display weniger oft aktuallisieren (ist auch augenschonender), aber es muss dennoch so schnell wie möglich fertig werden, da es sich sonst mit anderen Berechnungen und Ausführungen, die Prio haben, in die Quere kommt. Wie gesagt es dauert eben zu lange.

Würde es also mal mit der lcd4busy probieren wollen. Komme jetzt aber mit der Definition der Pins nicht klar. Bisher waren die so belegt:

DB4 – DB7 liegen auf C2 – C5
E ist B5
RS ist B4

Für RW wäre jetzt zum Beispiel noch B3 frei (bzw. lege RS auf B3 und RW auf B4, der Reihenfolge wegen)

In der Anleitung steht zu lcd4busy (Seite 741):

Const _lcdport =Porta
Const _lcdddr =Ddra
Const _lcdin =Pina
Const _lcd_e = 1
Const _lcd_rw = 2
Const _lcd_rs = 3

Soweit ich verstehe, gilt dieses Beispiel ja nur für diesen 8515.

Was bedeuten aber genau die einzelnen Zeilen und wie definier ich hier meine belegten Pins (ATmega88)?

Ach so, habe nur eine BASCOM Demo, kann ich die lcd4busy.LBX dennoch nutzen?

Und passiert eigentlich, wenn Daten zum Display gesendet werden und ein Interrupt kommt? Dieser wird sicherlich erst abgearbeitet und dann? Werden dann die Daten zum Display erneut gesendet oder einfach dort weiter gemacht wo pausiert wurde? Kann das ein Textdisplay stören?

Vielen Dank!

Robert

Dnerb
23.05.2007, 23:10
Hi Robert,

wegen der lib, keine Ahnung.

Wegen dem Interrupt: probier es aus, denke nicht das viel passieren wird. Die LCD Text Displays sind beim Timing recht unkritisch wenns mal etwas länger dauert.

Gruß Dnerb

zumgwadrad
24.05.2007, 12:38
Hi,
so wie ich die LCD4Busy verstehe müssen alle deine Pins an einen Port
SO z.B. PORTA
RS auf PA1
RW auf PA2
E auf PA3
DB 1-4 auf PA4-7

Robs0412
24.05.2007, 22:31
und da ist das Problem!

Habe ja nun einen mega88 in einem myAVR Board. An dem gehen nur 6 (von 7) nutzbare Anschlüsse eines Ports raus. Port A gibt es ja bei einem 88er gar nicht (nur B/C/D) und von denen habe ich auch keinen komplett frei, da ADCs, Interrupts oder Compareeinheit auf verschiedensten Ports liegen ...

@chrigri:
kannst du mal ein Beispiel in C posten (mit busy flag abfrage). Kenn mich damit zwar nicht aus, evtl. versteh ich aber den sinn ...

Nen "fertigen" Assembler-Schnipsel hat nicht zufällig jemand zum Ausprobieren?

Grüße

Robert

Robs0412
25.05.2007, 20:17
und wie könnte ich es "zu Fuß" in BASCOM anstellen. Also wie bisher das Display über BASCOM initialisieren, dann aber die PINs mit Basic-Code so schalten, dass was brauchbares aufm Display steht.

Wie ist aber da die Reinfolge der Ansteuerung der Pins am Display? Habe zwar Datenblätter verschiedener Displays, kann mir aber leider daraus nicht entnehmen, wie sowas genau funktioniert (bin zu sehr Laie)

Grüße

Robert

fsid
29.05.2007, 08:55
Versuche mal den Internal Osc. auf 8MHz über Fusebits einzustellen. Wenn du schneller sein willst, nehme einen Externen Oszillator mit 16MHz. Dein µProfessor schafft dann halt schneller. Oder versuchs mit Bus-system. das geht auch ganz gut. Und ich habe keine RW-Leitung.

chr-mt
29.05.2007, 11:38
Hi,
ein schnellerer Quarz hilft da gar nix.
Bascom berechnet die Zeiten ja aus der angegebenen Quarzfrequenz.
10 ms sind in Bascom immer 10 ms, egal was für ein Quarz drin werkelt.

Vorrausgesetzt, man lügt seinen Controller nicht an, wie ich weiter oben beschrieben habe.
Wenn man allerdings bösartigerweise nur die halbe Quarzfrequenz angibt, halbieren sich auch alle Zeiten!
Die Wartezeiten für's Display verkürzen sich so ebenfalls.
Das Display wird also etw doppelt so schnell angesteuert.

Blöd' ist halt, daß man alle anderen Wartezeiten im Programm umschreiben muß, damit das wieder passt.

Gruß
Christopher

fsid
29.05.2007, 11:51
ja, das ist mir schon klar, dass in bascom 10ms auch 10ms sind, aber die befehle werden schneller abgearbeitet, verstehst was ich mein? es gibt schon einen unterschied ob du jetzt mit 8MHz oder 16Mhz (wenn du einen externen oszillator nimmst) arbeitest. Die zyklendauer ist einfach kürzer. Die befehle werden 2 mal so schnell abgearbeitet.

Das mit dem Übertakten ist zwar möglich, aber ob das gesund ist?!?

chr-mt
29.05.2007, 12:06
Hi,
Bascom hat anscheinend recht lange Wartezeiten für die Displays drin, um sicherzustellen, daß das Display nicht beim schreiben noch busy ist.
Diese Wartezeiten lassen sich mit genanntem Trick verkürzen.
Alle von mir getesteten Displays liefen so noch einwandfrei, nur eben schneller.
Klar wird der Programmablauf mit doppelter Frequenz auch schneller, aber die Wartezeiten für's Display bleiben anscheinend gleich, da die wohl durch die Angabe der Quarzfrequenz berechnet werden.


Gruß
Christopher

Robs0412
29.05.2007, 20:02
Hallo,

habe es hinbekommen und kann jetzt meine Daten "manuell" per "Port-Umschaltungen" aufs Display senden, klappt wunderbar schnell (auch ohne Busyflag abfrage).

Jetzt noch eine Frage, damits ganz top wird:

Wie wird "manuell" das Display initialisiert? (Ohne Config LCD / initlcd) Gibt es da einen bestimmten Ablauf, der eingehalten werden muss?
In den wikis steht dazu leider nichts ...

Damit kann ich dann noch ein wenig mehr Speicher sparen.

Hier mal ein Beispiel der "manuellen Übertagung:


$regfile = "m88def.dat"
$crystal = 8000000

Ddrb.3 = 1

Portb.3 = 0

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.5 , Rs = Portb.4

Initlcd

Cursor Off Noblink

Cls

Locate 1 , 1


Hauptprogramm:


Do

Locate 1 , 1

Lcd "Hallo"

Wait 2

'------------ Zahl 3-------------------------

Portb.5 = 1 'E auf high

Portb.4 = 1 'RS auf high, um Daten zu senden

Portc = &B00001000 'C2-C5 übertragen Bits 4-7

Portb.5 = 0 'E auf low um Daten zu lesen

Portb.5 = 1 'E wieder high

Portb.5 = 1 'E wieder high

Portc = &B00011000 'C2-C5 übertragen Bits 0-3

Portb.5 = 0 'auf low um Daten zu lesen

Portb.5 = 1 'E wieder high


Wait 2


'------Clear-----------------

Portb.5 = 1 'E auf high

Portb.4 = 0 'RS auf low, um Befehl zu senden

Portc = &B00000000 'C2-C5 übertragen Bits 4-7
Portb.5 = 0 'E auf low um Daten zu lesen

Portb.5 = 1 'E wieder high

Portc = &B00000100 'C2-C5 übertragen Bits 0-3 (Bit0 ist 1 für Clear Display)

Portb.5 = 0 'auf low um Daten zu lesen

Portb.5 = 1 'E wieder high

Wait 2

Loop

End

Grüße

Robert