PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zu ansteuerung ausgabe auf LCD



TheNetwalker
08.07.2008, 14:12
So, nachdem ich nun ewig gesucht hab und nichts gefunden, hier meine Frage:

Hab an meinen Atmega8535 ein lcd-Display angeschlossen, welches auch einwandfrei funktioniert. Ich kann ausgaben auf dem Display machen.

Was auch einwandfrei funktioniert ist das Ansteuern eines Ausgangs nach betätigen eines Tasters der auf einem Eingang liegt. (Hinter dem Ausgang sitzt eine Schaltstufe für ein Relais).

Will ich nun aber beides zugleich machen, sprich ich betätige den Taster und als effect darauf soll der Ausgang geschalten werden, sowie eine Ausgabe auf dem LCD erscheinen, hängt sich der Ausgang auf und geht nicht wieder in ruhe sobald ich den Taster loslasse.

Ich stellte fest dass das Programm so lange funktioniert, bis die erste anweisung an das Display geschieht. Sprich wie unten zu sehen der Cls Befehl. Lass ich ihn weg hängt sich der Ausgang nicht auf.

Hier der Code:


$regfile = "m8535.dat" 'ATMega8535
$crystal = 8000000

Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.4 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.2 , Rs = Portd.1
Config Lcdbus = 4


Config Pinc.0 = Output
Config Pinc.1 = Input
Portc.1 = 1

Do
Cls
If Pinc.1 = 1 Then
Portc.0 = 0
Else
Portc.0 = 1
End If
Loop

Wie kann ich zu Steuerbefehlen Ausgaben auf dem LCD machen?

Ich danke schonmal...

StevieL
08.07.2008, 17:26
Hallo,

hast du schon mal versucht, die Schleife etwas langsamer zu machen? Versuche doch mal ein "Waitms 100" nach dem "Do" einzubauen. Ansonsten sollte es eigentlich funktionieren.

guenter1604
08.07.2008, 18:13
Hallo TheNetwalker,

das CLS ist das Problem.

Bei 8MHz dauert ein Takt 125ns. Deine Schleife dauert 2 Takte, macht 250ns. Laut Datenblatt eines LCD-Displays, das ich gerade neben mir liegen habe, dauert ein CLS ca. 1640ns. Daraus folgt, daß du den Displaytreiber in der Zeit in der er voll im Stress ist noch 6,56mal mit CLS-Befehlen befeuerst.

1. Wenn der Prozessor nichts weiteres zu tun hat, würde ich grundsätzlich langsamer Takten.

2. Den cls-Befehl in einer Schleife einzusetzen ist auch nicht optimal. Besser wäre es den alten Wert zu überschreiben (das geht auch schneller)

3. Wenn cls, dann Gedenkpause einlegen ;-)

Günter

TheNetwalker
08.07.2008, 20:48
Ja, das klingt alles sehr logisch und funktioniert auch :) Ich sag mal "danke" =D>

ach, wenn ich den Takt des Controllers runterschrauben möchte, reicht dann lediglich eine niedrigere angeabe im Quellcode oder muss ich auch den passenden Quarz dran haben?

guenter1604
08.07.2008, 21:01
Hallo,

Quarz muß schon sein!

Das verringert aber den CO² Ausstoß der Schaltung beträchtlich

z.B.

ATMega8

bei 100kHz = 0,4 mA
bei 16MHz = 20mA

Sauerbruch
08.07.2008, 22:28
Das verringert aber den CO² Ausstoß der Schaltung beträchtlich
bei 100kHz = 0,4 mA
bei 16MHz = 20mA

Bei allem Engagement für dieses wichtige Thema (CO2) sollte man aber die Größenordnungen nicht aus dem Auge verlieren: Eine etwa gleich große Menge an CO2 kann man dadurch wieder einsparen, dass man jede Stunde einen einzigen Atemzug ausfallen lässt O:)


@TheNetwalker:
Viel wichtiger für Deine Frage nach niedrigen Taktfrequenzen ist die Tatsache, dass die Angabe im Quellcode ($Crystal = ...) nicht bestimmt, mit welcher Frequenz der Controller getaktet wird! Das kannst Du nur in den Fusebits einstellen (ebenso wie die Taktquelle). $Crystal sagt´s nur dem Programm, damit zeitabhängige Befehle (wie z.B. waitms) in der richtigen Geschwindigkeit laufen. Das geht natürlich gründlich schief, wenn die $Crystal-Angabe nicht der tatsächlichen Taktfrequenz entspricht!

Und ob ein Quarz nötig ist oder nicht, hängt einzig und alleine davon ab, ob Deine Anwendung auf exakte Zeitfunktionen angewiesen ist. Die eingebauten RC-Oszillatoren sind inzwischen aber auch schon sehr frequenzstabil.