- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Eine Binärzahl in ASCII umwandeln

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2007
    Beiträge
    10
    Anzeige

    E-Bike
    Hi,

    erst mal vielen Dank. Ich werde den Code heute Abend mal durcharbeiten.

    Ist ja ne ganze Menge. Mal sehen, ob ich das gebacken kriege.

    MfG L

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2007
    Beiträge
    10
    Hallo izaseba,

    ich kenne den Code schon (Posting weiter oben).
    Ehrlich gesagt, ist mir der Code noch zu komplex (Anfänger).
    Ich sehe nicht mal, in welche Register meine 2 Reggister gehören. Könntest Du mir bitte noch etwas unter die Arme greifen?

    Danke schon jetzt Lothar

  3. #13
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Hallo Lothar,
    Sorry, ich habe Deine Antwort etwas verpennt

    Trotzdem versuche ich es etwas zu erklären (vielleicht hast Du das Problem noch nicht gelöst )

    Der einstieg ist hier:
    Code:
    warte:
       sbis ADCSRA,ADIF
       rjmp warte
       ;fertig und lese Ergebnis ein
       in rBin1L,ADCL
       in rBin1H,ADCH
       cbi PORTD,PD3   ;Pin PD3 wieder LOW
       cbi DDRD,PD3   ;und wieder als Eingang
       sei   ;Interrups wieder an
       rcall berechne   ;Rechne Ergebnis in ascii um und schreibe
       ;es in sram
    und zwar werden die Register rBin1L und rBin1H mit Deinem Wert belegt, den Rest mit sei usw. kannst Du hier vergessen...

    dann geht es nach berechnen und weiter nach Bin2ToBcd5, was dann die Routine von Gerd Schmidt wohl ist...

    So, zuerst werden die Reister mit push auf den Stack gelegt, damit die Werte beim verlassen der Routine nicht weg sind, ob man das braucht, weiß ich nicht, naja...

    Code:
    ldi rmp,HIGH(10000) ; Lade 10.000 in rBin2H:L
       mov rBin2H,rmp
       ldi rmp,LOW(10000)
       mov rBin2L,rmp
       rcall Bin2ToDigit ; Ermittle 5.Stelle durch Abziehen
    hier wird mit Hilfe von rmp, was wohl ein Arbeitsregister >= R16 ist 10000 in die zwei unteren Register rBin2H u. rBin2L geladen. Hier könnte man auch zwei Register über R16 nehmen, wenn man noch welche frei hat, ich habe es aber einfach so übernommen...
    So, jetzt wird Bin2ToDigit angesprungen, die nichts anderes macht als

    Code:
    Bin2ToDigit:
       clr rmp ; Zähler auf Null
    Bin2ToDigita:
       cp rBin1H,rBin2H ; Vergleiche MSBs miteinander
       brcs Bin2ToDigitc ; MSB Binärzahl kleiner, fertig
       brne Bin2ToDigitb ; MSB Binärzahl größer, subtrahiere
       cp rBin1L,rBin2L ; MSB gleich, vergleiche LSBs
       brcs Bin2ToDigitc ; LSB Binärzahl kleiner, fertig
    Bin2ToDigitb:
       sub rBin1L,rBin2L ; Subtrahiere LSB Dezimalzahl
       sbc rBin1H,rBin2H ; Subtrahiere Carry und MSB
       inc rmp ; Erhöhe den Zähler
       rjmp Bin2ToDigita ; Weiter vergleichen/subtrahieren
    Bin2ToDigitc:
       st z+,rmp ; Speichere das Ergebnis und erhöhe Zeiger
       ret ; zurück
    rmp auf null setzen,
    Deine Ausgangszahl in rBin1L / H mit rBin2 L / H (wo jetzt 10000 drin steht) zu vergleichen,
    Ist Deine Zahl kleiner, wird rmp in RAM abgespeichert (wo der z Zeiger hinzeigt) und mit ret zurückgegangen, ist sie größer wird davon 10000 ( rBin1L / H ) abgezogen rmp inkrementiert, wieder verglichen.
    Das Spielchen solange, bis Deine Zahl kleiner als 10000 wird...
    Jetzt ist hoffentlich auch klar, daß im rmp z.B. bei 30000 3 drin steht und bei 45121 eine 4 [-o<

    So nach dem ret geht es in Bin2ToBcd5 mit 1000 100 und 10 weiter die einser werden direkt gespeichert.
    jetzt steht im Ram irgendwo wo der Z Zeiger hingezeigt hat, unsere Ausgangszahl in Digits zerlegt drin.
    rBin1L / H werden wiederhergestellt ( die zwei pop's)

    Ich habe dann noch eine Routine eingebaut, die mit die führenden Nullen bei Zahlen die kleiner 10000 sind entfernt und fertig, danach kommt nur noch die UART Ausgabe wo die Zahlen mit 0x30 verodert werden.

    Ich hoffe, daß es etwas verständlicher geworden ist

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    24.03.2007
    Beiträge
    10
    Hallo izaseba,

    vielen Dank für Deine ausführliche Erklärung. Dank Deiner Hilfe ist es mir jetzt klar geworden. Ich hatte den Versuch schon auf Eis gelegt und wollte es mir später mal wieder anschauen, wenn ich besser bescheid weiß.
    Das mit dem Ablegen im Ram mittels Z-Zeiger hatte ich nicht verstanden. Jetzt ja.

    MfG Lothar

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress