Archiv verlassen und diese Seite im Standarddesign anzeigen : Multiplikation zweier 8-Bit-Zahlen
Valentiano
16.04.2008, 05: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, 09: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, 19: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 :-)
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, 21:30
Hey,
also ich kann dir nur www.sprut.de empfehlen. Hier ist alles aufgelistet mit (Lern) BSP !!!
greetz
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.