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.
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:
Wie kann ich zu Steuerbefehlen Ausgaben auf dem LCD machen?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
Ich danke schonmal...
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.
Gruß, Stefan
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
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?
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
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ässtDas verringert aber den CO² Ausstoß der Schaltung beträchtlich
bei 100kHz = 0,4 mA
bei 16MHz = 20mA
@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.
Lesezeichen