Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe welche Assembler Befehle sind richtig?
Import-Script
18.01.2002, 20:34
Ich habe folgendes Problem beim AT 89C2051. Über eine serielle Schnittstelle werden ASCII Zeichen der Reihe nach abgeholt. Es handelt sich um HZE.D, ZE.D und E.D (Hunderter, Zehner , Einer, Dezimalzahl). Aber vorher ist nicht bekannt, ob z.B. 111.1, 11.1 oder 1.1 ankommt. Daher wird die erste Zahl immer in 33H Hunderter, 34 H Zehner und 33H Einer geschrieben und durch den identifizierten Dezimalpunkt ggf. nachträglich wieder auf 0 gesetzt. <BR>Der nachfolgende Quelltext funktioniert aber nur, wenn drei Stellen vor dem Dezimalpunkt geliefert werden. Der Befehl MOV 33H,A MOV 34H,A MOV 35H,A schreibt nicht ein ankommendes Zeichen in drei Register und z.B. der Befehl MOV 33H,#0 überschreibt ggf. die vorsorgliche Eintragung nicht mit 0. <BR> <BR>Was mache ich falsch? <BR> <BR>LIES1: LCALL GETCHR ;lesen 1.Stelle <BR>MOV 33H,A ;Hunderter <BR>MOV 34H,A ;vorsorglich auch <BR> Zehner schreiben <BR>MOV 35H,A ;vorsorglich auch Einer <BR> schreiben <BR>LCALL GETCHR ;lesen 2.Stelle <BR>CJNE A,#2EH,LIES2 ;es kommt keine <BR> Dezimalstelle <BR>MOV 33H,#0 ;es kommt eine <BR> Dezimalstelle setze <BR> Hunderter auf 0 <BR>MOV 34H,#0 ;es kommt eine <BR> Dezimalstelle setze <BR> Zehner auf 0 <BR>LCALL GETCHR ;lesen 3.Stelle <BR>MOV 36H,A ;Dezimale schreiben <BR>SJMP LCALL ;mit CALL weitermachen <BR>LIES2: MOV 34H,A ;Zehner <BR>MOV 35H,A ;vorsorglich auch Einer <BR> schreiben <BR>LCALL GETCHR ;3.Stelle lesen und <BR> abholen <BR>CJNE A,#2EH,LIES3 ;es kommt keine <BR> Dezimalstelle <BR>MOV 33H,#0 ;es kommt eine <BR> Dezimalstelle, setze <BR> Hunderter auf 0 <BR>LCALL GETCHR ;4.Stellen lesen und <BR> abholen <BR>MOV 36H,A ;Dezimale schreiben <BR>SJMP LCALL ;mit CALL weitermachen <BR>LIES3: MOV 35H,A ;DST-Einer lesen <BR>LCALL GETCHR ;4.Stelle lesen und <BR> abholen( muss Punkt <BR> sein ) <BR>LCALL GETCHR ;5.Stelle lesen und abholen <BR>MOV 36H,A ;Dezimale schreiben <BR>CALL: Weiter im Programmablauf
Import-Script
19.01.2002, 02:05
Habe ich das richtig verstanden, daß hinterher die Hunderter an 33h, Zehner an 34h... "." an 36h und die Dezimalstelle an 37h stehen soll? <BR> <BR>probier doch mal <BR> <BR><TABLE><TR><TD>lade_zahl:</TD><TD>mov r0,#33h</TD><TD>; vorläufige Zieladresse </TD></TR><TR><TD>_nextc:</TD><TD>lcall getchr </TD></TR><TR><TD></TD><TD>mov @r0,a </TD></TR><TR><TD></TD><TD>inc R0 </TD></TR><TR><TD></TD><TD>cjne a, #2eh, _nextc</TD><TD>; bis nach "." weiterlesen </TD></TR><TR><TD>; "." ist gespeichert</TD><TD> jetzt noch 1 Ziffer: </TD></TR><TR><TD></TD><TD>lcall getchr </TD></TR><TR><TD></TD><TD>mov @r0, a </TD></TR><TR><TD>; jetzt lesen wir das</TD><TD> rückwärts aus und</TD><TD> speichern ab 37h: </TD></TR><TR><TD></TD><TD>mov r1, #38h</TD><TD>; eins weiter als Zieladresse </TD></TR><TR><TD>_copy:</TD><TD>mov a, @r0 </TD></TR><TR><TD></TD><TD>dec r1 </TD></TR><TR><TD></TD><TD>mov @r1, a </TD></TR><TR><TD></TD><TD>dec r0 </TD></TR><TR><TD></TD><TD>cjne r0, #32h, _copy</TD><TD>; solange bis 33h (Startadresse) kopiert wurde </TD></TR><TR><TD>; die übrigen Bytes</TD><TD> noch löschen: </TD></TR><TR><TD></TD><TD>clr A </TD></TR><TR><TD>_clear:</TD><TD>cjne r1, #33h, _fertig</TD><TD>; 33h schon bearbeitet? </TD></TR><TR><TD></TD><TD>dec r1 </TD></TR><TR><TD></TD><TD>mov @r1, a </TD></TR><TR><TD></TD><TD>sjmp _clear </TD></TR><TR><TD>_fertig:</TD><TD></TD><TD>; Ende! </TD></TR><TR><TD></TD></TR></TABLE> <BR> <BR>nochmal in Prosa: <BR>Die ankommenden Bytes werden ab 33h aufsteigend <BR>gespeichert. Ende wird durch "." und noch 1 Ziffer erkannt. <BR>Jetzt wird der empfangene String von hinten so kopiert, daß er bei 37h aufhört und schließlich noch vorne mit 0-Bytes aufgefüllt. <BR> <BR>Ciao!
Import-Script
19.01.2002, 08:17
Hallo, <BR> <BR>die HZE.D sollen nicht verschoben werden. Nur nachdem bekannt ist (durch erkennen ein Dezimalpunkt kam), sollen z.B. HZE auf 0 gesetzt werden, wenn die Zahl z.B. 0,5 ist. <BR> <BR>MfG <BR> <BR>Wolfgang
Import-Script
20.01.2002, 01:20
Nach Deiner Mail weiß ich mehr: Die "." sollen nicht gespeichert werden. Also verkürzen wir den Puffer etwas: <BR> <BR>- hinter dem Kommentar "jetzt noch eine Ziffer" noch ein "dec r0", dann überschreiben wir mit der letzten Ziffer den "." wieder. <BR> <BR>- die Kopierroutine bleibt, allerdings initialisieren wir r1 ein Byte niedriger (wir brauchen ja keins für den "."): mov r1, #37h (statt 38h). <BR> <BR>Alles andere kann so bleiben. Jetzt stehen in 33h die Hunderter, in 34h die Zehner, in 35h die Einer und in 36h die Zehntel. Die vorher nicht übertragenen Stellen (H, Z, evtl. E) sind mit dem Wert 0 belegt. <BR> <BR>Zu beachten ist noch, daß die Ziffern noch in ASCII vorliegen, also 30h für "0", 31h für "1" usw. Ist dies nicht erwünscht, würde ich während des Kopierens (also zwischen "dec r1" und "mov @r1, a") noch ein "anl a, #0fh" einfügen. <BR> <BR>Gruß <BR>Bernd
Import-Script
20.01.2002, 08:22
Hallo, <BR> <BR>ich verstehe ein wenig die Zusammenhänge, nicht die Befehle, aber nach dem Programmieren hat es funktioniert. ASCII Werte sind richtig für die Weiterverarbeitung. <BR> <BR>Eine Bitte noch, die nächsten gelesenen Werte müssen nur in HZE und nicht Dezimalzahl gespeichert werden in 37H Hunderter, 38H Zehner und in 39H Einer. Gleiche Problemstellung, es ist vorher nicht bekannt ob 1,2 oder 3 Stellen vor dem Dezimalpunkt sind, die Dezimalzahl danach wird nicht benötigt. <BR> <BR>Du benutzt Register, die im Programm vorher und danach auch noch genutzt werden, wird das Probleme geben? <BR> <BR>Vielen Dank <BR>Wolfgang
Import-Script
20.01.2002, 14:56
Das mit den Zahlen ohne Dezimalpunkt ist problematisch, irgendwie muß man ja erkennen, wann die Zahl zuende ist (Nullbyte, Return, Newline...) <BR> <BR>Falls Du in den Registern A, R1, R0 Werte hast, die Du /vor/ dem Aufruf der Routine setzt und die Du /nachdem/ die Routine zurückkehrt brauchst, dann solltest Du das ganze mit <BR>push acc (für A) push 0 (für R0) push 1 (für R1) <BR>... <BR>pop 1 / 0 / acc <BR>einrahmen (Achtung, man holt die Sachen in umgekehrter Reihenfolge vom Stack). <BR> <BR>Ciao
Import-Script
20.01.2002, 19:24
Hallo Bernd, <BR> <BR>ich glaube ich habe mich unpräzise ausgedrückt. Ein Dezimalpunkt kommt auch hier. Zum Erkennen wann die Zahl zu Ende ist, kann er also genutzt werden, er soll aber ebenfalls nicht gespeichert werden und die Dezimalstelle danach auch nicht. <BR> <BR>Gruß <BR>Wolfgang
Import-Script
20.01.2002, 19:51
Hallo Wolfgang, <BR> <BR>willst Du die Zahlen wirklich im Dezimalformat verwenden ? <BR> <BR>Üblicherweise wird doch intern im Binärformat gerechnet. Dann sieht eine Zahleneingabe so aus: <BR> <BR>val = val * 10 + digit <BR> <BR>D.h. zu Anfang wird eine Null gespeichert und dann wird solange der Wert mit 10 multipliziert und das neue Digit addiert, solange Digits empfangen werden. <BR> <BR>für 8 Bit könnte das so aussehen: <BR> <BR>wert equ 33h <BR> <BR>mov wert, #0 <BR>weiter: <BR>call getchr <BR>cjne a, #'.', einlesen <BR>ret <BR>einlesen: <BR>xch a, wert <BR>mov b, #10 <BR>mul ab <BR>add a, wert <BR>mov wert, a <BR>jmp weiter <BR> <BR> <BR>Peter
Import-Script
20.01.2002, 21:48
Hallo Peter, <BR> <BR>ja im HZE Format, da es sich um Nautische Meilen handelt werden die Zahlen danach in KM umgerechnet und mit einem Sprachausgabechip angesagt. <BR> <BR>Gruß <BR>Wolfgang
Import-Script
21.01.2002, 02:05
Hallo Wolfgang, <BR> <BR>werth equ 33h <BR>wertz equ 34h <BR>werte equ 35h <BR> <BR>mov werth, #0 <BR>mov wertz, #0 <BR>mov werte, #0 <BR>weiter: <BR>call getchr <BR>cjne a, #'.', einlesen <BR>ret <BR>einlesen: <BR>xch a, werte <BR>xch a, wertz <BR>mov werth, a <BR>jmp weiter <BR> <BR> <BR>mich würde dann aber mal interessieren, wie Du die Umrechnung machst. <BR> <BR> <BR>Peter
Import-Script
21.01.2002, 19:41
Hallo Peter, <BR> <BR>danke, aber dein Quelltext bringt nicht das gewünschte Ergebnis. Die Lösung von Bernd ist sehr komplex, aber sie funktioniert. <BR> <BR>Vielleicht ist bei dir nur ein kleiner Fehler, den du schnell findest. <BR> <BR>Zur Erklärung: Es kommen über die serielle Schnittstelle ASCII Strings, die Zahlengruppen sind durch Komma getrennt. Die Zahlen werden einzeln abgeholt durch den Befehl „LCALL GETCHR“ und müssen dann verarbeitet werden. <BR> <BR>Noch mal das Problem: Bei deiner Lösung müssen HZE erkannt/ erfasst und abelegt werden, auch hier kommt eine Dezimalstelle und eine/ mehrere Dezimalzahlen, die jedoch nicht genutzt werden sollen. Die Auswertungsroute ist mehrere Seiten lang, schick mir eine Mail, dann hänge ich sie an. <BR> <BR>Gruß <BR> <BR>Wolfgang
Import-Script
21.01.2002, 23:43
Ich habs jetzt nicht getestet, aber sie sollte so funktionieren: <BR> <BR>"1.": H=0 Z=0 E=1 <BR>"12.": H=0 Z=1 E=2 <BR>"123.": H=1 Z=2 E=3 <BR> <BR>Ich dachte, so war es gewünscht. <BR>Hast Du es getestet ? <BR> <BR> <BR>Nochmal, wie rechnet man dezimal auf einem 8-Bitter ? <BR>Ich mach intern immer alles Binär und nur die Ein- und Ausgabe wandelt in oder von Dezimal. <BR> <BR> <BR>Peter
Powered by vBulletin® Version 4.1.7 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.