PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : was stimmt denn hier nicht?



Philipp83
09.05.2006, 20:14
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

olfi13
10.05.2006, 15:33
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

Philipp83
12.05.2006, 13:51
VIELEN DANK !!!!!!!!!!!!!!