PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Multiplikation zweier 8-Bit-Zahlen



Valentiano
16.04.2008, 04:08
ich bin Anfänger und brauche ein Lernbeispiel für die Multiplikation zweier 8-Bit-Zahlen. z.B. PIC-Typ ist pic16f84.

danke im Voraus.

_werwurm_
16.04.2008, 08:20
;Small - 67 cycles constant, 11 instructions
;Same principle as application note 526
;Optimized for minimal size by Bjørn Bæverfjord

mul8x8s clrf prodH
movlw .128
movwf prodL
movfw mulcnd
mulsl rrf mulplr
skpnc
addwf prodH
rrf prodH
rrf prodL
skpc
goto mulsl
return


geklaut bei:
http://ww1.microchip.com/downloads/en/AppNotes/00526e.pdf
http://www.sciencezero.org/computing/picmul8x8.htm

Valentiano
16.04.2008, 18:31
ich habe ein Programm geschrieben, aber das Praoramm läuft nicht richtig, warum?


;****************************
; 8x8 Software Multiplier
;****************************
LIST P = 16f84,
#include<P16f84.INC>

mulcnd equ 0x09 ; 8 bit multiplicand
mulplr equ 0x10 ; 8 bit multiplier
H_byte equ 0x12 ; High byte of the 16 bit result
L_byte equ 0x13 ; Low byte of the 16 bit result
count equ 0x14 ; loop counter
Same equ 1
;************************************************* ***********************

START GOTO main

; *****************************
Begin Multiplier Routine
mpy_S clrf H_byte ; H_byte = 0000 0000
clrf L_byte ; L_byte = 0000 0000
movlw 8
movwf count ; count = 8
movf mulcnd,W ; multiplicand ---> W
bcf STATUS, C ; Clear the carry bit
loop rrf mulplr, F ; multiplier: 1-bit nach rechts verschieben
btfsc STATUS,C ; C=0 , uebergehen
addwf H_byte,Same
rrf H_byte,Same
rrf L_byte,Same
decfsz count, F
goto loop
retlw 0
;
;************************************************* *******************
; Test Program
;************************************************* ********************
main movlw 0x1f
movwf mulplr ; multiplier---> mulplr
movlw 0x12
movwf mulcnd ; Multiplicand ---> mulcnd

call mpy_S ;
END

Code-Tags verwenden ! sieht hübscher aus :-)

PICture
17.04.2008, 07:55
Hallo Valentiano!

Wenn ein R1 Register durch ein R2 Register multipliziert seien soll, kann man den R2 einfach R1 mal zu der bisheriger Summe (am Anfang gleich 0) in einem 16-bit Register (der aus zwei 8-bit Register MH und ML besteht) addieren. Das sollte so wie das PAD im Code zeigt ablaufen.

Dein Programm macht aber nur mehrmals Verschiebung um 1 bit nach rechts, was der Teilung durch 2 entspricht.

MfG

V
0->MH ;löschen
0->ML ;löschen
R1->SZ ;R1 in SZ (Schleifenzähler) kopieren
.--->ML+R2->ML ;R2 zum ML addieren
| C=1 ? N ---. ;Überlaufen?
| J |
| MH+1->MH | ;MH um 1 erhöhen
| V<------´
| SZ=0 J ---> return ;Schleife R1 mal abgelaufen? Wenn ja, Ende
| N
| V
`-------´

karlmonster
28.04.2008, 20:30
Hey,
also ich kann dir nur www.sprut.de empfehlen. Hier ist alles aufgelistet mit (Lern) BSP !!!

greetz