-         
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

    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
  •