- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 6 von 6

Thema: BSF-Befehl, b als Variable möglich???

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.12.2005
    Ort
    Wang-Dong-Township
    Alter
    54
    Beiträge
    67

    BSF-Befehl, b als Variable möglich???

    Anzeige

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

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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/in...nicht_gleich_3

    Schau mal da, ist ein Versuch von mir , das zu erklären
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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
    Code:
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    08.10.2004
    Ort
    ferd. Waldmüllerg. 7/2
    Alter
    39
    Beiträge
    456
    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.

    Code:
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    74
    Beiträge
    2.063
    So wie Mobius würde ich es auch machen, jedoch die 256-Byte-Grenze berücksichtigen:
    Code:
    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
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    73
    Beiträge
    11.077
    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
    Code:
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress