PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BSF-Befehl, b als Variable möglich???



JayCool
17.06.2006, 18:05
](*,) Hi everybody out there,

ich bin derzeit gerade dabei, mich in die PIC-Programmierung einzuarbeiten. Dabei bin ich auf ein kleines Problem gestoßen:

Ich wollte beim BSF-Befehl

[label] BSF f,b

für die Bit-Position b eine Variable einsetzen, die ich zuvor definiert habe.
Gehe ich recht in der Annahme, dass man für b nur explizite Zahlenwerte eingeben kann?!?!?

Was mich etwas nachdenklich gemacht hat, war die Meldung im *.lst-File. MPASM schrieb hier, dass nur die "last significant bits" verwendet werden. Wenn es unmöglich wäre, dann müsste MPASM doch mit einer ERROR-Meldung abbrechen.

Weiß vielleicht von Euch jemand einen geheimen Trick, wie man den Parameter b variabel gestalten kann, oder ist das generell nicht möglich / nicht vorgesehen, oder wie auch immer ?!?!?!?

Greets, Jan

PS: Ach ja, ich fang bei der Geschichte erstmal ganz klein an, und zwar mit nem PIC 10F206.

PicNick
17.06.2006, 19:10
Etwas zusammengereimt: Der Assembler erwartet dort einen bestimmten Wert von 0-7. Du hast den Namen eine Variablen hingeschrieben. Aus Sicht des Assembler ist das aber eine Adresse, also auch nur irgendeine Zahl.
Weil diese Zahl als Adresse natürlich > 7 ist , sagt er dir, daß er nur die unteren drei Bit verwendet (least significant bit) .

https://www.roboternetz.de/wissen/index.php/AVR_Assembler_Einf%C3%BChrung#3_ist_nicht_gleich_3

Schau mal da, ist ein Versuch von mir , das zu erklären

PICture
17.06.2006, 22:30
Hallo JayCool!

Ich habe mal so ein Problem gehabt und so wie im Code gelöst (es ist ein Fragment meines Programms für PIC18F252, soll aber auf allen PICs laufen). Die Variable ist im DTemp und hat einen wert 0...7. Man kann es aber biliebig erweitern. Nach dem feststellen des Wertes der Variablen wird mit goto ein bit im DTemp2 gesetzt. Z.B. wenn die Variable im DTemp gleich 3 ist, wird ein bit 4 im DTemp2 gesetzt. Es ist vieleicht nicht die optimale Lösung, hat aber funktioniert.

Alles klar ? Wenn nicht, bitte weiter fragen ! :)

MfG


Comp00_07 movf DTemp,0
sublw 7
btfsc _Z
goto SetB0
movf DTemp,0
sublw 6
btfsc _Z
goto SetB1
movf DTemp,0
sublw 5
btfsc _Z
goto SetB2
movf DTemp,0
sublw 4
btfsc _Z
goto SetB3
movf DTemp,0
sublw 3
btfsc _Z
goto SetB4
movf DTemp,0
sublw 2
btfsc _Z
goto SetB5
movf DTemp,0
sublw 1
btfsc _Z
goto SetB6
movf DTemp,0
sublw 0
btfsc _Z
goto SetB7

SetB0 bsf DTemp2,0
return
SetB1 bsf DTemp2,1
return
SetB2 bsf DTemp2,2
return
SetB3 bsf DTemp2,3
return
SetB4 bsf DTemp2,4
return
SetB5 bsf DTemp2,5
return
SetB6 bsf DTemp2,6
return
SetB7 bsf DTemp2,7
return

Mobius
18.06.2006, 09:41
Hum, es müsste rein theoretisch auch einfacher gehen. Meine erste Idee wäre ein lookup-table und ein computed goto gewesen, wobei das aber um einiges leichter ins Auge gehen kann.
Die Grundidee ist relativ einfach, du hast eine Variable, die multipilizerst du mit 2 (einfaches shiften nach links) und addierst den neuen Wert zu dem PCL hinzu. Die Tabelle schaut dann aus 2er Blöcken, einem bsf und einem return/retlw commando.


Compute:
rlf Temp
movfw Temp
addwf PCL,f
Table
bsf POTRB,0
return
bsf PORTB,1
return
bsf PORTB,2
return
bsf PORTB,3
return
bsf PORTB,4
return
bsf PORTB,5
return
bsf PORTB,6
return
bsf PORTB,7
return
...

Hab den Code grad durch den Simulator rennen lassen, funktioniert gut, ABER nur wenn der PCL keinen overflow verursacht. Sollte dies der Fall sein, so muss auch PCLATH in Betracht gezogen werden (welches die high-bits des Programm-Counters beinhaltet).
MfG
Mobius

kalledom
18.06.2006, 11:30
So wie Mobius würde ich es auch machen, jedoch die 256-Byte-Grenze berücksichtigen:


Compute:
movlw HIGH(Table)
movwf PCLATH
rlf Temp ; Wert mal 2
movlw 0x0F ; Nur Bit 3...0
andwf Temp
movfw Temp
addlw 5 ; plus 5 Befehle
addwf PCL,W ; Test-Addition
skip_NC
incf PCLATH ; Bei Uebertrag

movfw Temp
addwf PCL
Table
bsf POTRB,0
return
.......
bsf POTRB,7
return

PICture
19.06.2006, 00:23
Hallo!

Übung macht Meister! Heute schaut mein ehemaliges Programm schon besser aus. Ob sich eine look up table für 8 Werte lohnt ist ja Geschmackssache. Übrigens habe ich vergessen, dass "_Z" mit "#define _Z STATUS,Z" definiert werden muss.

MfG

Comp00_07 movf DTemp,0
sublw 7
btfsc _Z
bsf DTemp2,0
movf DTemp,0
sublw 6
btfsc _Z
bsf DTemp2,1
movf DTemp,0
sublw 5
btfsc _Z
bsf DTemp2,2
movf DTemp,0
sublw 4
btfsc _Z
bsf DTemp2,3
movf DTemp,0
sublw 3
btfsc _Z
bsf DTemp2,4
movf DTemp,0
sublw 2
btfsc _Z
bsf DTemp2,5
movf DTemp,0
sublw 1
btfsc _Z
bsf DTemp2,6
movf DTemp,1
btfsc _Z
bsf DTemp2,7
return