mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler bei Code Konvertierung AVR->8051


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe einen Routine gesucht um eine hex Zahl in einen ASCII Wert
umzuwandeln. Von diesem Code schwirrt ja hier genug rum. Ich habe mich
für eine Routine entschieden die wohl schon mal mit Erfolg getestet
worden ist  (auf nem AVR).
AVR Code:

;input: R16= 0...255
;output: R18,R17,R16 (ASCII)

 ldi   r18,-1 + '0'
_bcdi: inc R18
       subi R16,100
       brcc _bcd1
       ldi R17,10 + '0'
_bcd2: dec R17
       subi R16,-10
       brcs _bcd2
       subi R16, -'0'
       ret

Meine C51 Interpretation (die nicht funktioniert)

       mov   RR8,#47
_bcdi: inc  RR8
       mov a,RR6
       subb a,#100
       mov RR6,a
       jnc _bcdi
       mov RR7,#58
_bcd2: dec RR7
       mov a,RR6
       subb a,#-10
       mov RR6,a
       jc _bcd2
       mov a,RR6
       subb a,#-48
       mov RR6,a
       ret

Hat jemand ne Ahnung wo da der Wurm drin ist ?
Die RR6 Stelle scheint zu funktionieren, der Rest ist nur Müll.
Habe irgendwie die befürchtung das der mit der subtraktion mit den
negativen Zahlen nicht klar kommt...

Gruß
Alex

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subb = subtract with borrow.
Das Carry-Flag wird mit abgezogen. Ein "clr c" vor jedem "subb"
sollte helfen.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs gerade ausprobiert, hat leider nicht geholfen...
nur die R16 Stelle wird richtig dargestellt.

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh - ich habe mir den Code nicht genauer angeschaut.
Der Code ist -schlichtweg- großer Mist.
Was macht das Programm:
Angenommen, R16 hat als Inhalt 54.

ldi   r18,-1 + '0'     R18 = 47
_bcdi: inc R18         R18 = 48
       subi R16,100    R16 = -46  PENG.
       brcc _bcd1
       ldi R17,10 + '0'
_bcd2: dec R17
       subi R16,-10
       brcs _bcd2
       subi R16, -'0'
       ret

Dieser Code funzt nur bei Zahlen >= 110. Vor der Subtraktion müßte
eigentlich noch geprüft werden, ob die Zahl auch >= 100 ist.
Der MCS-51 kann doch dividieren, damit gehts bequemer. Ich muß mal
kramen, irgendwo sollte ich noch einen MCS-51 Codeschnipsel für so
etwas haben.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Code ist schon richtig und funktioniert von 0..255.

Anbei mal auf Addition umgestellt, da spart man sich das C-Flag
löschen.
Und das ständige MOVen von und zum ACC ist auch nicht nötig, ACC wird
doch nicht anderweitig geändert.


Ich habs simuliert, läuft wie gewünscht.

Vielleicht benutzt Du einen Assembler, der sich nicht an die
Intel-Syntax hält und dann daraus Mist macht.

Mit dem Keil oder Metalink gehts jedenfalls.

Wie schon gesagt wurde, 8Bit Werte kann der 8051 aber auch direkt
dividieren (mit Rest).



@thkaiser

"Der Code ist -schlichtweg- großer Mist."

Dann schau ihn Dir mal genauer an, auch das AVR-Beispiel geht, ist ja
schließlich von mir :-)


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.