Guten Tag, Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen Zähler programmiert. Wie kann ich es schaffen,dass z.B bei "btfss Multiplikator,Zaehler" das Bit Nr. "Zählerwert" geprüft wird und nicht die Adresse des Zähler-Bytes? Mfg Petersch90.
Multiplikation MOVWF b b = 4 MOVLW b Multiplikant Equ 0x10 Multiplikator Equ 0x20 Zaehler Equ 0x30 Ergebnis Equ 0x40 Zwischenergebnis Equ 0x50 MOVLW 8 ;alles auf Nullsetzen MOVWF Zaehler MOVLW 0 MOVWF Ergebnis MOVWF Zwischenergebnis Rechnung ADDLW 1; WREG++ goto Hochsetzen Addition MOVLW 0 ADDWF Multiplikant,0 ; WREG mit Multiplikant addieren ADDWF Zwischenergebnis,1;Addition des Multiplikanten auf das Zwischenergebnis Additionuebersprungen MOVLW 0 ;WREG auf Nullsetzen ADDLW 1 ADDWF Zwischenergebnis,1; DECFSZ Zwischenergebnis,1 rlcf Zwischenergebnis,1 ;Zwischenergebnis nach links rotieren goto Rechnung Hochsetzen MOVF Zaehler,0 ;Zaehler->WREG ADDLW -1; WREG++ MOVWF Zaehler ;WREG->Zaehler btfss Multiplikator,Zaehler ; Addition, Bit = 1 goto Additionuebersprungen goto Addition
btfss geht nur mit Konstanten, "Zaehler" ist in diesem Fall konstant die Adresse der Speicherzelle und nicht der Inhalt. Ich würde bei jedem Schleifendurchlauf "Multiplikator" mit rlf nach links verschieben und immer das MSb mit btfss Multiplikator,7 abfragen. Petersch90 schrieb: > MOVF Zaehler,0 ;Zaehler->WREG > ADDLW -1; WREG++ > MOVWF Zaehler ;WREG->Zaehler Das geht einfacher mit decf Zaehler,f P.S. PIC18 haben eine 8x8 Single-Cycle Hardware Multiplier
:
Bearbeitet durch User
Danke für die Antwort Wenn man aber das Byte nach links verschiebt, woher weiß man dann wann das LSB der eigentlichen Zahl ist?
Petersch90 schrieb: > Wenn man aber das Byte nach links verschiebt, woher weiß man dann wann > das LSB der eigentlichen Zahl ist? Sry, ich verstehe deine Frage nicht. > MOVLW 0 > ADDWF Multiplikant,0 ; WREG mit Multiplikant addieren Das könnte man durch ein einfaches MOVF Multiplikant,w ersetzen > MOVLW 0 ;WREG auf Nullsetzen > ADDLW 1 > ADDWF Zwischenergebnis,1; > DECFSZ Zwischenergebnis,1 Das ergibt keinen Sinn: Du addierst 1 zum Zwischenergebnis und dekrementierst es dann. > rlcf Zwischenergebnis,1 ;Zwischenergebnis nach links rotieren Vor dieser Anweisung würde ich zur Sicherheit das Carry löschen. > MOVF Zaehler,0 ;Zaehler->WREG > ADDLW -1; WREG++ > MOVWF Zaehler ;WREG->Zaehler Das könnte man durch ein decf Zaehler,f ersetzen.
:
Bearbeitet durch User
Falls es dich interessiet, ich habe eine 8x8 multiplizier Routine für Mid-Range PICs (PIC16 und PIC12) in ASM geschrieben: factor1 wird mit factor2 und das Ergebniss sthet dann im Doppelregister product.
1 | ADD8to16 MACRO _8b, _16b ;Add 8bit to 16bit variable. Result is saved in the 16 bit variable |
2 | movf _8b,w |
3 | addwf _16b,f |
4 | SKPNC |
5 | incf _16b+1,f |
6 | ENDM |
7 | |
8 | LSL16 MACRO _16b ;Logical shift left 16bit variable |
9 | CLRC |
10 | rlf _16b |
11 | rlf _16b+1 |
12 | ENDM |
13 | |
14 | udata 0x20 ;BANK 0 |
15 | factor1 res 1 |
16 | factor2 res 1 |
17 | product res 2 |
18 | mul_cnt res 1 |
19 | |
20 | ;udata 0x70 ;ACCESS RAM |
21 | |
22 | |
23 | ORG 0x00 |
24 | goto Init |
25 | |
26 | ORG 0x04 |
27 | retfie |
28 | |
29 | Init: |
30 | BANKSEL factor1 |
31 | movlw .254 |
32 | movwf factor1 |
33 | movlw .254 |
34 | movwf factor2 |
35 | |
36 | |
37 | mult8x8: |
38 | movlw 0x08 |
39 | movwf mul_cnt |
40 | clrf product |
41 | clrf product+1 |
42 | mul_loop: |
43 | LSL16 product |
44 | btfss factor1,7 |
45 | goto skip_add |
46 | ADD8to16 factor2,product |
47 | skip_add: |
48 | rlf factor1,w |
49 | rlf factor1,f |
50 | decfsz mul_cnt,f |
51 | goto mul_loop |
52 | |
53 | goto $ |
54 | |
55 | END |
:
Bearbeitet durch User
Petersch90 schrieb: > Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen > Zähler programmiert. Wie kann ich es schaffen,dass z.B bei "btfss > Multiplikator,Zaehler" das Bit Nr. "Zählerwert" geprüft wird und nicht > die Adresse des Zähler-Bytes? Könntest du etwas verständlicher dein Problem beschreiben? Wie geht man ein Byte denn Bit für Bit durch? Was meinst du EIGENTLICH damit? zum BTFSS x,y Die Mnemoniks von MicroChip sind Abkürzungen, hier für Bit Test im File und Skip wenn Set Also Teste in der RAM-Zelle x deren Bit y und überspringe den nächsten Befehl, wenn das Bit gesetzt (also 1) ist. Da gibt es keinerlei "Multiplikator, Zähler". Und nochwas: So ein Maschinenbefehl steht im ROM und deswegen sind seine Bestandteile auch alle konstant. Du mußt dir also vorher überlegen, welches Bit in welchem Byte du testen willst. Lies dir mal die Doku zu deinem PIC durch, üblicherweise wird dort auch jeder einzelne Maschinenbefehl ausführlich beschrieben. W.S.
Petersch90 schrieb: > Ich versuche ein Byte Bit für Bit durchzugehen und habe dafür einen > Zähler programmiert. Hallo Peter (ich nehme mal an dass das dein richtiger Name ist), :-) Verstehe ich das richtig, dass Du von 0 hoch zählen willst, bis ein Byte voll ist? Wenn das der Fall ist, könntest Du das viel einfacher haben. incf "Name der Speicherzelle" Siehe auch http://www.sprut.de/electronic/pic/assemble/befehle.html#incf L.G. Micha
Michael R. schrieb: > Verstehe ich das richtig, dass Du von 0 hoch zählen willst, bis ein Byte > voll ist? Ich habe es so verstanden dass er mit btfss ein bit testen will. Welches bit getestet wird soll aber nicht konstant, sondern von der Variable Zaehler abhängig sein. Da das mit btfss nicht geht, da wie weiter obernerwähnt wurde keine Variablen is ASM befehle eingebaut werden können, würde ich zusätzlich zum Zähler die die Variable bei jedem Durchlauf nach links rotieren und immer das bit 7 abfragen. Gerade ist mir noch aufgefallen, dass das Programm des TOs eine Endlosschleife ist und also dauernd wiederholt wird.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.