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.
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
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.
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
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.