-         

Ergebnis 1 bis 3 von 3

Thema: was stimmt denn hier nicht?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2005
    Ort
    Hamburg
    Alter
    34
    Beiträge
    176

    was stimmt denn hier nicht?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo!
    ich habe folgendes programm bekommen, allerdings gibt es bei manchen
    werten falsche erbegnisse aus. woran kann es liegen?

    z.b. EA60 / 1388 = 4 anstatt C wobei
    EA60 / 1300 = C den richtigen wert ausgibt


    ich bin auch über programme die das gleiche leisten sehr dankbar



    .def rd1hh=r16
    .def rd1h=r17
    .def rd1l=r18
    .def rd2h=r19
    .def rd2l=r20
    .def rd1ul=r21
    .def rd1uh=r22
    .def rehh=r23
    .def reh=r24
    .def rel=r25

    div:
    ldi rd1hh, 0x4c
    ldi rd1h, 0x4b
    ldi rd1l, 0x40

    ldi rd2h, 0x8e
    ldi rd2l, 0x94

    clr rd1ul ;Hilfsregister
    clr rd1uh

    clr rehh ; Ergebnis rehh:reh:rel
    clr reh ;
    clr rel ; (Ergebnisregister dient auch als
    inc rel ; Zähler bis 24! Bit 1 auf 1 setzen) diese 1 wird immer weiter nach links geschoben, wenn sie
    ; rauskommt sind wir fertig
    ;
    ; Hier beginnt die Divisionsschleife
    ;
    div1:
    clc ; Carry-Bit leeren
    rol rd1l ; nächsthöheres Bit des Dividenten
    rol rd1h ; in das Hilfsregister rotieren
    rol rd1hh ;
    rol rd1ul ;
    rol rd1uh ;
    brcs div2 ; Eine 1 ist herausgerollt, ziehe ab

    cp rd1uh, rd2h
    brcs div3
    cp rd1ul,rd2l ; Divisionsergebnis 1 oder 0?
    brcs div3 ; Überspringe Subtraktion, wenn kleiner
    div2:
    sub rd1ul,rd2l ; Subtrahiere Divisor
    sbc rd1uh,rd2h
    sec ; Setze carry-bit, Ergebnis ist eine 1
    rjmp div4 ; zum Schieben des Ergebnisses
    div3:
    clc ; Lösche carry-bit, Ergebnis ist eine 0
    div4:
    rol rel ; Rotiere carry-bit in das Ergebnis
    rol reh
    rol rehh
    brcc div1 ; solange Nullen aus dem Ergebnis
    ; rotieren: weitermachen

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    10.10.2004
    Ort
    Niedersachsen
    Beiträge
    60
    Ev. musst du die Register ändern (ja nach Prozessor):

    Division zweier 16Bit -Werte (Signed)
    .include "2313DEF.INC"
    .DSEG
    i: .Byte 2
    j: .Byte 2
    k: .Byte 2

    .CSEG
    .ORG 0

    _Reset:
    ldi yl,Low(RAMEND)
    out SPL,yl
    ldi yh,high(RAMEND)
    out SPL+1,yh
    sbiw yl,32

    loop:
    ; k = i / j
    ; Hier die Werte laden
    lds r24,i
    lds r25,i+1
    lds zl,j
    lds zh,j+1

    ; Beginn der Division
    Di16s: mov r22,zl
    mov r23,zh
    mov zl,r24
    mov zh,r25
    mov r21,zh
    eor r21,r23
    sbrs zh,0x07
    rjmp d16s1
    Com zh
    Com zl
    subi zl,Low(-0x01)
    sbci zh,high(-0x01)
    d16s1: sbrs r23,0x07
    rjmp d16s2
    Com r23
    Com r22
    subi r22,Low(-0x01)
    sbci r23,high(-0x01)
    d16s2: clr r24
    Sub r25,r25
    ldi r20,0x11
    d16s3: rol zl
    rol zh
    dec r20
    brne d16s5
    sbrs r21,7
    rjmp d16s4
    Com zh
    Com zl
    subi zl,Low(-0x01)
    sbci zh,high(-0x01)
    d16s4: rjmp ende ; ...fertig
    d16s5: rol r24
    rol r25
    Sub r24,r22
    sbc r25,r23
    brcc d16s6
    add r24,r22
    Adc r25,r23
    clc
    rjmp d16s3
    d16s6: sec
    rjmp d16s3

    ; Und Ergebnis sichern:
    ende: sts k,zl
    sts k+1,zh

    rjmp loop


    Gruß, Olfi

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2005
    Ort
    Hamburg
    Alter
    34
    Beiträge
    176
    VIELEN DANK !!!!!!!!!!!!!!

Berechtigungen

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