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.
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.
geklaut bei:Code:;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
http://ww1.microchip.com/downloads/e...tes/00526e.pdf
http://www.sciencezero.org/computing/picmul8x8.htm
ich habe ein Programm geschrieben, aber das Praoramm läuft nicht richtig, warum?
Code-Tags verwenden ! sieht hübscher ausCode:;**************************** ; 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
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.
MfGCode: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 `-------´
Hey,
also ich kann dir nur www.sprut.de empfehlen. Hier ist alles aufgelistet mit (Lern) BSP !!!
greetz
Lesezeichen