PDA

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. &Uuml;ber eine serielle Schnittstelle werden ASCII Zeichen der Reihe nach abgeholt. Es handelt sich um HZE.D, ZE.D und E.D &#40;Hunderter, Zehner , Einer, Dezimalzahl&#41;. 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&auml;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 &uuml;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&#40; muss Punkt <BR> sein &#41; <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&szlig; hinterher die Hunderter an 33h, Zehner an 34h... &#34;.&#34; 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&#44;#33h</TD><TD>; vorl&auml;ufige Zieladresse </TD></TR><TR><TD>_nextc:</TD><TD>lcall getchr </TD></TR><TR><TD></TD><TD>mov @r0&#44;a </TD></TR><TR><TD></TD><TD>inc R0 </TD></TR><TR><TD></TD><TD>cjne a&#44; #2eh&#44; _nextc</TD><TD>; bis nach &#34;.&#34; weiterlesen </TD></TR><TR><TD>; &#34;.&#34; ist gespeichert</TD><TD> jetzt noch 1 Ziffer: </TD></TR><TR><TD></TD><TD>lcall getchr </TD></TR><TR><TD></TD><TD>mov @r0&#44; a </TD></TR><TR><TD>; jetzt lesen wir das</TD><TD> r&uuml;ckw&auml;rts aus und</TD><TD> speichern ab 37h: </TD></TR><TR><TD></TD><TD>mov r1&#44; #38h</TD><TD>; eins weiter als Zieladresse </TD></TR><TR><TD>_copy:</TD><TD>mov a&#44; @r0 </TD></TR><TR><TD></TD><TD>dec r1 </TD></TR><TR><TD></TD><TD>mov @r1&#44; a </TD></TR><TR><TD></TD><TD>dec r0 </TD></TR><TR><TD></TD><TD>cjne r0&#44; #32h&#44; _copy</TD><TD>; solange bis 33h &#40;Startadresse&#41; kopiert wurde </TD></TR><TR><TD>; die &uuml;brigen Bytes</TD><TD> noch l&ouml;schen: </TD></TR><TR><TD></TD><TD>clr A </TD></TR><TR><TD>_clear:</TD><TD>cjne r1&#44; #33h&#44; _fertig</TD><TD>; 33h schon bearbeitet? </TD></TR><TR><TD></TD><TD>dec r1 </TD></TR><TR><TD></TD><TD>mov @r1&#44; 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 &#34;.&#34; und noch 1 Ziffer erkannt. <BR>Jetzt wird der empfangene String von hinten so kopiert, da&szlig; er bei 37h aufh&ouml;rt und schlie&szlig;lich noch vorne mit 0-Bytes aufgef&uuml;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 &#40;durch erkennen ein Dezimalpunkt kam&#41;, 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&szlig; ich mehr: Die &#34;.&#34; sollen nicht gespeichert werden. Also verk&uuml;rzen wir den Puffer etwas: <BR> <BR>- hinter dem Kommentar &#34;jetzt noch eine Ziffer&#34; noch ein &#34;dec r0&#34;, dann &uuml;berschreiben wir mit der letzten Ziffer den &#34;.&#34; wieder. <BR> <BR>- die Kopierroutine bleibt, allerdings initialisieren wir r1 ein Byte niedriger &#40;wir brauchen ja keins f&uuml;r den &#34;.&#34;&#41;: mov r1, #37h &#40;statt 38h&#41;. <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 &uuml;bertragenen Stellen &#40;H, Z, evtl. E&#41; sind mit dem Wert 0 belegt. <BR> <BR>Zu beachten ist noch, da&szlig; die Ziffern noch in ASCII vorliegen, also 30h f&uuml;r &#34;0&#34;, 31h f&uuml;r &#34;1&#34; usw. Ist dies nicht erw&uuml;nscht, w&uuml;rde ich w&auml;hrend des Kopierens &#40;also zwischen &#34;dec r1&#34; und &#34;mov @r1, a&#34;&#41; noch ein &#34;anl a, #0fh&#34; einf&uuml;gen. <BR> <BR>Gru&szlig; <BR>Bernd

Import-Script
20.01.2002, 08:22
Hallo, <BR> <BR>ich verstehe ein wenig die Zusammenh&auml;nge, nicht die Befehle, aber nach dem Programmieren hat es funktioniert. ASCII Werte sind richtig f&uuml;r die Weiterverarbeitung. <BR> <BR>Eine Bitte noch, die n&auml;chsten gelesenen Werte m&uuml;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&ouml;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&szlig; man ja erkennen, wann die Zahl zuende ist &#40;Nullbyte, Return, Newline...&#41; <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&uuml;ckkehrt brauchst, dann solltest Du das ganze mit <BR>push acc &#40;f&uuml;r A&#41; push 0 &#40;f&uuml;r R0&#41; push 1 &#40;f&uuml;r R1&#41; <BR>... <BR>pop 1 / 0 / acc <BR>einrahmen &#40;Achtung, man holt die Sachen in umgekehrter Reihenfolge vom Stack&#41;. <BR> <BR>Ciao

Import-Script
20.01.2002, 19:24
Hallo Bernd, <BR> <BR>ich glaube ich habe mich unpr&auml;zise ausgedr&uuml;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&szlig; <BR>Wolfgang

Import-Script
20.01.2002, 19:51
Hallo Wolfgang, <BR> <BR>willst Du die Zahlen wirklich im Dezimalformat verwenden ? <BR> <BR>&Uuml;blicherweise wird doch intern im Bin&auml;rformat gerechnet. Dann sieht eine Zahleneingabe so aus: <BR> <BR>val = val &#42; 10 &#43; 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&uuml;r 8 Bit k&ouml;nnte das so aussehen: <BR> <BR>wert equ 33h <BR> <BR>mov wert, #0 <BR>weiter: <BR>call getchr <BR>cjne a, #&#39;.&#39;, 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&szlig; <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, #&#39;.&#39;, 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&uuml;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&uuml;nschte Ergebnis. Die L&ouml;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&auml;rung: Es kommen &uuml;ber die serielle Schnittstelle ASCII Strings, die Zahlengruppen sind durch Komma getrennt. Die Zahlen werden einzeln abgeholt durch den Befehl „LCALL GETCHR“ und m&uuml;ssen dann verarbeitet werden. <BR> <BR>Noch mal das Problem: Bei deiner L&ouml;sung m&uuml;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&auml;nge ich sie an. <BR> <BR>Gru&szlig; <BR> <BR>Wolfgang

Import-Script
21.01.2002, 23:43
Ich habs jetzt nicht getestet, aber sie sollte so funktionieren: <BR> <BR>&#34;1.&#34;: H=0 Z=0 E=1 <BR>&#34;12.&#34;: H=0 Z=1 E=2 <BR>&#34;123.&#34;: H=1 Z=2 E=3 <BR> <BR>Ich dachte, so war es gew&uuml;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&auml;r und nur die Ein- und Ausgabe wandelt in oder von Dezimal. <BR> <BR> <BR>Peter