Seite 1 von 1
PASM Operators
Verfasst: Do 2. Feb 2012, 12:24
von TuxFan
Hallo!
Ich mach jetzt mal einen Thread für Operatoren im Propeller-Assembler auf, vielleicht kommen da außer meiner Frage noch andere hinzu, von denen, die sich auch in PASM einarbeiten wollen.
In Spin gibt es den Operator |< "Bitwise decode" um eine Zahl zwischen 0 und 31 in eine PIN-Maske zu wandeln. In Spin ist das kein Problem aber laut Seite 326 im Propellerhandbuch soll das auch in PASM möglich sein. Aber wie, es gibt hier keinen Opcode der von BST akzeptiert wird.
Gruß
TuxFan
Re: PASM Operators
Verfasst: Do 2. Feb 2012, 12:51
von josto
Dies könnte ein "Feature" von BST sein.
Versuch mal "#1<<...". Geht natürlich nur mit Konstanten, nicht Registern
Re: PASM Operators
Verfasst: Do 2. Feb 2012, 13:55
von kuroneko
TuxFan hat geschrieben:In Spin ist das kein Problem aber laut Seite 326 im Propellerhandbuch soll das auch in PASM möglich sein. Aber wie, es gibt hier keinen Opcode der von BST akzeptiert wird.
Funktioniert hier ohne Probleme. Was hast Du denn genau versucht?
Code: Alles auswählen
PUB null
DAT
mov temp, #|< 5 ' 2^(0..8)
movd temp, #|< (12 - 9) ' 2^(9..17)
movi temp, #|< (24 - 23) ' 2^(23..31)
long |< 12
temp res 1
Der Nachteil mit
mov[sdi] ist das es nur jeweils 9 bit des Zielregisters modifiziert. Notfalls musst Du dann auf
zurueckgreifen. In dem Fall wuerd' ich dann aber die Maske als data definieren und direkt ins Register laden. Verbraucht den gleichen Platz ist aber schneller.
Re: PASM Operators
Verfasst: Do 2. Feb 2012, 14:57
von TuxFan
Danke für die Reaktionen.
Als blutiger PASM-Anfänger versuche ich die Device-Selektion des C3-SPI-Bus abzuändern, da ich beim Gam_Bo_Prop, um Strom zu sparen, den Counter weggelassen habe

und nun mit drei I/O-Leitungen des Propellers den Encoder füttere um die 8 (eigentlich 7) Devices (RAM, Flash, SD etc.) zu selektieren. Bei reinem Spin-Code ist das alles kein Problem. Wenn man aber wegen höherer Geschwindigkeit auf Assembler-Routinen wechselt, wird es für mich kompliziert. Um das Rad nicht neu zu erfinden, wollte ich als Software-Grundlage die spi-Treiber aus C3-Femtobasic assimilieren

und diese an die geänderte Hardware anpassen.
Deshalb dachte ich mir folgendes : Die 3 I/O-Leitungen zur Ansteuerung des Encoders liegen beim GBP an P0, P1 und P2. Es bräuchte nun nur der Select-Kanal (1 bis 7) als Parameter/Variable an die Assemblerroutine übergeben werden und dieser per |< in eine Maske überführt zu werden. (Geht natürlich sooooo nicht ganz

)
Das Ganze versuche ich natürlich erst einmal auf dem Breadboard mit meinem SoMProp und ein paar Leuchtdioden sowie etwas Assembler ans Laufen zu bringen, bevor ich die Treiber-Routinen anfasse.
Fixe Masken im DATA sind natürlich auch denkbar würden mMn aber durch die wahrscheinlichen if-Anweisungen deutlich mehr Platz beanspruchen.
Aufgefallen war mir nun der obige Sachverhalt im Handbuch.
Ich hoffe mich verständlich ausgedrückt zu haben......
Gruß
TuxFan
Re: PASM Operators
Verfasst: Do 2. Feb 2012, 20:22
von TuxFan
So jetzt zitiere ich mich mal selber :
TuxFan hat geschrieben:........Deshalb dachte ich mir folgendes : Die 3 I/O-Leitungen zur Ansteuerung des Encoders liegen beim GBP an P0, P1 und P2. Es bräuchte nun nur der Select-Kanal (1 bis 7) als Parameter/Variable an die Assemblerroutine übergeben werden und dieser per |< in eine Maske überführt zu werden. (Geht natürlich sooooo nicht ganz

).......
Ha, ging sogar leichter als ich dachte. Da die I/O-Leitungen in der richtigen Reihenfolge liegen, P0 als LSB und P2 als MSB am Decoder, kann die Kanal-Nummer (0 bis 7) als long-Variable übergeben werden. Da im Inneren der Variablen binär operiert wird, liegen die richtigen Signale an den Decodereingängen an. Nur die Erstellung der Pin-Maske für die dira-operation muß im Spin-Teil des Programmes durchgeführt werden. Eine |< Operation ist im Moment im PASM-Teil nicht nötig.
Code: Alles auswählen
con
_clkmode = xtal1 + pll8x
_xinfreq = 10_000_000
spiSel0 = 0 ' SPI select0
spiSel1 = 1 ' SPI select1
spiSel2 = 2 ' SPI select2
var
long Kanal, Sel
long Sel0, Sel1, Sel2
PUB main
Sel := 0
Sel0 := |< spiSel0
Sel1 := |< spiSel1
Sel2 := |< spiSel2
Sel := Sel2 or Sel1 or Sel0 'gesamte Pinmaske
Kanal := 7
cognew(@init, @Kanal)
DAT
org 0
init mov temp,par
rdlong channel,temp
add temp,#4
rdlong select,temp
mov dira,select
or outa,channel
temp long 0
select long 0
channel long 0
fit 496
Gruß
TuxFan
Re: PASM Operators
Verfasst: Fr 3. Feb 2012, 00:32
von kuroneko
Wenn Du schon Konstanten benutzt dann kannst Du Dir 'ne Menge code sparen.
Code: Alles auswählen
con
_clkmode = xtal1 + pll8x
_xinfreq = 10_000_000
#0, spiSel0, spiSel1, spiSel2 ' SPI select
var
long Kanal
PUB main
Kanal := %111{7} << spiSel0 ' falls spiSel0 mal nicht 0 ist
cognew(@init, @Kanal)
DAT
org 0
init mov dira,select
rdlong channel,par
or outa,channel
waitpeq $, #0 ' stop
select long |< spiSel0 | |< spiSel1 | |< spiSel2
channel res 1
fit
Re: PASM Operators
Verfasst: So 5. Feb 2012, 17:47
von TuxFan
@kuroneko
Schönen Dank für die Tips.
Gruß
TuxFan