Hallo, ich bin neu hier und möchte um Unterstützung bitten bei folgendem Problem. Ich möchte folgenden Text auf einem LCD Display ausgeben " Temperatur xxx °C" (.db " Temperatur xxx °C",0)wobei die xen durch den aktuellen Messwert ersetzt werden sollen. Mit er initialisierung des Display und mit der Ausgabe des konstanten Textes habe ich keine Probleme das funktioniert aber wie bekomme ich den Variablen Messwert an die Stellen wo nun xxx steht? Ach ja, das ganze soll in AVR-Assembler passieren. Gruß Harry
Hallo du musst den Messwert in BCD zerlegen und dann an genau die Stelle wo deine "xxx" stehen an das Display schreiben. Bedenke dass man erst die 100er, dann die 10er und dann die 1er schreiben sollte wenn man den Adresscounter des Displays auf auto-inc lässt. Also: 1. Messwert -> BCD 2. Adresse im Display auf Position "xxx" setzen 3. BCD-Werte (100er, 10er, 1er) an das Display schicken 4. nur max. alle 200ms wiederholen (schneller kann man eh nicht ablesen) Siehe auch http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD#Eine_BCD_Zahl_ausgeben Gruß Steffen
Hallo Steffen, hat bis zur ersten Antwort ja nicht lange gedauert. Eigentlich ist es ja schon zu spät für diese Dinge. Als das mit dem zerlegen in BCD funtioniert auch, ich kann den Messwert auch auf dem Display ausgeben nur weiß ich halt nicht wie ich das mit dem konstanten Text kombinieren kann. Wenn ich den String in ZH,ZL lade und zeichenweise ausgebe, wie kann ich dann dem Assembler begreiflich machen, das ich anstelle der xxx den Wert angezeigt haben will. wenn du da einen Codeschnippsel hättest oder eine für mich begreifliche Erklärung wäre ich schon froh.
Dann musst du deine Konstante "Text" in das SRAM kopieren und an der Stelle von "xxx" schreibst du deinen Wert in BCD hin. Also " Temperatur " hat incl. Leerzeichen 12 Byte, dann kommt mit 3Byte dein Wert und dann noch dein "°C". Macht insgesammt 19 Byte incl. Leerzeichen und Abschluss "0". Du legst dir im SRAM die Speicherstelle TEMPERATUR an die 19 Byte reservieren soll.
1 | .dseg |
2 | TEMPERATUR: BYTE19 ; Temperaturstring im SRAM (Abschluss "0" nicht vergessen) |
Jetzt weist du doch dass ab dem 13.Byte der Wert steht. Das heißt: wenn du den Wert in BCD wandelst, dann schreibst du den gleich in den SRAM an die 13.,14. und 15. Stelle.
1 | st (TEMPERATUR+12), r16 ; WERT BCD 100er |
2 | st (TEMPERATUR+13), r16 ; WERT BCD 10er |
3 | st (TEMPERATUR+14), r16 ; WERT BCD 1er |
Diese Zeilen fügst du einfach in der BCD-Routine an ensprechender Stelle ein. Der Offset (TEMPERATUR+12) ist deswegen 12, da ja hier ab 0 gezählt wird. Also nicht verwirren lassen. Wie man einen String aus dem SRAM liest weißt du doch hoffentlich. Gruß Steffen
Genau das wollte ich wissen. Und dafür Quäle ich mich nun schon eine Woche. Mit den Displays habe ich noch wenig Erfahrung aber täglich wird es besser. Vielen Dank.
Warum möchtest du denn überhaupt jedesmal den Text "Temperatur °C" neu schreiben wenn sich die Temperatur ändert? Das musst du doch gar nicht! Den Text "Temperatur XXX °C" schreibst du einmal in das Display. Dann rufst du nur noch deine Routine auf die aus dem Wert die BCD's macht und sendest diese alle 200..500ms zum Display. Und zwar genau an die Position wo "XXX" steht. Ist das eine Option für dich? Gruß Steffen
Ach ja, stell mal dein ganzes Programm hier ein. Dann tappt man hier nicht mehr so im Dunkeln..
Steffen H. schrieb: > st (TEMPERATUR+12), r16 ; WERT BCD 100er > st (TEMPERATUR+13), r16 ; WERT BCD 10er > st (TEMPERATUR+14), r16 ; WERT BCD 1er Sowas sollte man sich garnicht erst angewöhnen. Woher soll die Zahlenausgabefunktion wissen, daß sie genau an Byte 12 schreiben soll? Das ist total unflexibel und fehlerträchtig. Definiere einen String so wie in C, d.h. ein Array mit einer 0 als Endekennzeichen. D.h. nicht das letzte Element ist 0, sondern das Ende des gerade eingeschriebenen String. Will man nun an diesen String etwas anfügen, zählt man den Pointer solange hoch, bis er auf die 0 zeigt. Und nun kann die Zahlenausgabefunktion ab da weiter schreiben und muß natürlich wieder eine 0 hinten anfügen. Daß das Array lang genug ist, liegt in Deiner Verantwortung. Peter
Genau, ich werde ja auch die Temperatur immer an eine andere Stelle schreiben. Schon klar Peter..
Hallo, rege Diskusionen. Aber Leute bekommt euch nicht in die Wolle. Es freut mich aber das ich hier anscheinend auf gleichgesinde getroffen bin. Aber nochmal, im großen und ganzen komme ich mit Assembler einigermaßen klar, aber die Sache mit den Displays habe ich erst angefangen und noch eine menge Fragen, Litaratur die was bringt gibst da ja nicht so viel. Steffen zu deiner Frage, natürlich muss nicht der Ganze Text da neu geschrieben werden mir würde das mit den xxx eigentlich reichen, ist auch weniger aufwand, aber wie?? Angenehmer wäre mir das schon,noch so eine Frage.
Jörg Schütz schrieb: > Steffen zu deiner Frage, natürlich muss nicht der Ganze Text da > neu geschrieben werden mir würde das mit den xxx eigentlich reichen, > ist auch weniger aufwand, aber wie?? Cursor positionieren. Hinschreiben. Fertig. Allerdings muss man darauf achten, dass die neue Zahlenausgabe die alte komplett überschreibt. Im allgemeinen möchte man nicht das Display komplett neu beschreiben. Erstens ist das unnützer Aufwand, zweitens includiert dies meistens ein 'Display löschen', was dann sehr schnell zum Flackern führt und drittens ist es gut, wenn am LCD dieselbe Information immer an derselben Stelle steht. Nichts ist so nervend wie eine Zahl, die ständig die Position wechselt. Ganz speziell gilt das beim Übergang von zb 2-stellig auf 1-stellig. Der Deziamlpunkt (selbst wenn es nur ein gedachter Dezimalpunkt ist) sollte immer an derselben Stelle stehen bleiben. Dann ist auch das Ablesen am angenehmsten.
Hi
>würde das mit den xxx eigentlich reichen, ist auch weniger aufwand, aber >wie??
Du gibst einmal den konstanten Text aus. Für den Temperaturwert setzt du
mit dem Befehl 'Set DDRAM address' die Ausgabeposition an die passende
Stelle und gibst die 3 Zeichen aus.
MfG Spess
Steffen H. schrieb: > Genau, ich werde ja auch die Temperatur immer an eine andere Stelle > schreiben. Schon klar Peter.. Stimmt. Man will ja noch andere Werte ausgeben mit anderem Text und an anderer Stelle (z.B. Innen-, Außentemperatur, Uhrzeit, ...). Und dazu schreibt man sich ne universelle Zahlenausgabe. Peter
Hi >Man will ja noch andere Werte ausgeben mit anderem Text und an anderer >Stelle (z.B. Innen-, Außentemperatur, Uhrzeit, ...). >Und dazu schreibt man sich ne universelle Zahlenausgabe. Es geht um Assembler. Da kann eine universelle Routine komplizierter, größer ... als zwei, drei spezielle Routinen sein. Wenn nur ein paar Zahlen, gleicher Länge, an verschiedenen Stellen ausgegeben werden müssen, reicht es, das Setzen der Cursoradresse und die Ausgabe zu trennen. MfG Spess
Hallo zusammen, es waren hier sehr gute Anregungen dabei. Die Denkanstöße haben mir sehr geholfen. Ich will damit sagen ich habe jetzt einiges davon ausprobiert, funktionieren alle nun habe ich nur noch das Problem mit der Wahl. Wahrscheinlich werde ich den Vorschlag von Steffen aufgreifen, hab ich auch schon versucht geht wunderbar und ist zudem wenig Aufwand. Danke an alle die sich beteiligt haben.
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.