Need help with first asm program (playstation controller object)-problem fixed,
Edit: See post #4, I forgot to initialize "addressStatus" so it was trying to put the Status byte into address 0, which I guess affected cog 0 since it stopped running.
This is a follow up from this thread http://forums.parallax.com/showthread.php?p=668706 where I was attempting to get the propeller to receive data from a playstation controller fast enough (presumably) so that it would be able to communicate with wireless controllers as well as wired ones.
This is my first attempt at writing code in propeller assembly, and not surprisingly, it doesn't work! When I run my simple 'test' program using the prop terminal and attempt to print one of these object's button states, my prop completely locks up. I am guessing that it is some memory allocation/usage issue, since if I do not call the "cognew" method in the object, the test program runs fine (I have it printing the # of iterations through its main loop so far). However, with the "cognew" call in the playstation controller object, the test program is stuck displaying "0 iterations".
Here is my code; if anyone could tell me what's wrong, I would greatly appreciate it. In particular, I would like to know:
1) Is my allocation of memory for the new cog done correctly?
2) Does my use of addressID, addressStatus, etc make sense/work?
3) How exactly does the "wrlong" command work? (What is PAR?)
Any other tips on improving this would help too. Below is the object and part of the SPIN version of the object (that the assemby code is trying to copy). I have also attached the object (assembly version) for easier viewing in the prop tool.
Complete object (w/ assembly code)
SPIN code (partial)
Just for reference, I started with CJ's gamecube controller object from the ObEx and, with the help of 'Assembly Code Examples for the Beginner' attempted to convert it to a playstation controller object. I included above the SPIN code that I basically attempted to convert to assembly.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I'm new to the propeller!
Post Edited (bulkhead) : 9/4/2007 12:10:42 AM GMT
This is a follow up from this thread http://forums.parallax.com/showthread.php?p=668706 where I was attempting to get the propeller to receive data from a playstation controller fast enough (presumably) so that it would be able to communicate with wireless controllers as well as wired ones.
This is my first attempt at writing code in propeller assembly, and not surprisingly, it doesn't work! When I run my simple 'test' program using the prop terminal and attempt to print one of these object's button states, my prop completely locks up. I am guessing that it is some memory allocation/usage issue, since if I do not call the "cognew" method in the object, the test program runs fine (I have it printing the # of iterations through its main loop so far). However, with the "cognew" call in the playstation controller object, the test program is stuck displaying "0 iterations".
Here is my code; if anyone could tell me what's wrong, I would greatly appreciate it. In particular, I would like to know:
1) Is my allocation of memory for the new cog done correctly?
2) Does my use of addressID, addressStatus, etc make sense/work?
3) How exactly does the "wrlong" command work? (What is PAR?)
Any other tips on improving this would help too. Below is the object and part of the SPIN version of the object (that the assemby code is trying to copy). I have also attached the object (assembly version) for easier viewing in the prop tool.
Complete object (w/ assembly code)
'' PS2 Controller Driver v1.2
' not working yet!
obj
var
long ID, ThumbL, ThumbR, Status, JoyRX, JoyRY, JoyLX, JoyLY
long cog
con
start = %00000001 '0x01
getDat = %01000010 '0x42
pub startUp(ddat, cmd, att, clk)
clkPin:=clk
attPin:=att
cmdPin :=cmd
datPin:=ddat
'INIT
outa[noparse][[/noparse]attPin]~~ 'deselect PSX controller
outa[noparse][[/noparse]cmdPin]~
outa[noparse][[/noparse]clkPin]~~ 'release clock
dira[noparse][[/noparse]attPin]~~
dira[noparse][[/noparse]cmdPin]~~
dira[noparse][[/noparse]clkPin]~~
dira[noparse][[/noparse]datPin]~
uS := clkfreq / 1_000_000
uS2 := 2 * uS
addressID := @ID
addressThumbL := @ThumbL
addressThumbR := @ThumbR
addressJoyRX := @JoyRX
addressJoyRY := @JoyRY
addressJoyLX := @JoyLX
addressJoyLY := @JoyLY
speed := clkfreq / 1000
if cog
cogstop(cog~ - 1)
cog := cognew(@psx, @ID) + 1
PUB getStatus
result:=Status
PUB getID
result:=ID
PUB getThumbL
result:=ThumbL
PUB getThumbR
result:=ThumbR
PUB getJoyRY
result:=JoyRY
PUB getJoyRX
result:=JoyRX
PUB getJoyLY
result:=JoyLY
PUB getJoyLX
result:=JoyLX
dat
org 0
psx mov temp, #1 'initialize pin mask
shl temp, clkPin
mov clkPin, temp
mov temp, #1
shl temp, attPin
mov attPin, temp
mov temp, #1
shl temp, cmdPin
mov cmdPin, temp
mov temp, #1
shl temp, datPin
mov datPin, temp 'clkPin, attPin,cmdPin, datPin are now masks
loop mov tempID, #0 'clear old data
mov tempStatus, #0
mov tempThumbR, #0
mov tempThumbL, #0
mov tempJoyRX, #0
mov tempJoyRY, #0
mov tempJoyLX, #0
mov tempJoyLY, #0
mov attPin, #0 wz,nr 'set attn LOW to select controller
muxnz outa, attPin
mov psxOut, #start 'send 'start' command
call #psxTxRx
mov psxOut, #getDat 'send 'getDat' command, get ID
call #psxTxRx
mov tempID, psxIn
mov psxOut, #0 'clear command out byte for rest of transmission
call #psxTxRx 'get status
mov tempStatus, psxIn
call #psxTxRx 'get buttons
mov tempThumbR, psxIn
call #psxTxRx
mov tempThumbL, psxIn
call #psxTxRx
mov tempJoyRX, psxIn 'get joysticks
call #psxTxRx
mov tempJoyRY, psxIn
call #psxTxRx
mov tempJoyLX, psxIn
call #psxTxRx
mov tempJoyLY, psxIn
mov attPin, #0 wz,nr 'set attn HIGH to deselect controller
muxz outa, attPin
put_data wrlong tempID, addressID 'globalize datasets
wrlong tempStatus, addressStatus
wrlong tempThumbL, addressThumbL
wrlong tempThumbR, addressThumbR
wrlong tempJoyRX, addressJoyRX
wrlong tempJoyRY, addressJoyRY
wrlong tempJoyLX, addressJoyLX
wrlong tempJoyLY, addressJoyLY
mov time, cnt
add time, speed
waitcnt time, #0 'wait for next update period
jmp #loop
'************ Subroutine psxTxRx ************
' takes parameter: psxOut
' returns: psxIn
psxTxRx mov clkPin, #0 wz,nr 'use Z Flag for clk
mov psxIn, #0 'clear byte
mov reps, #8 'loop for 8 bits (1 byte)
txrxloop muxz outa, clkPin 'clk HIGH
test psxOut, #1 wc 'place bit from psxOut on cmdPin
muxc outa, cmdPin
shr psxOut, #1 'prep for next bit
muxnz outa, clkPin 'clk LOW
test datPin, ina wc 'read data bit
rcl psxIn, #1 'store bit in psxIn
djnz reps, #txrxloop
psxTxRx_ret ret
clkPin long 0 'pin masks
attPin long 0
cmdPin long 0
datPin long 0
temp long 0
psxOut long 0 'parameter/return for psxTxRx routine
psxIn long 0
tempID long 0 'temp data
tempStatus long 0
tempThumbL long 0
tempThumbR long 0
tempJoyRX long 0
tempJoyRY long 0
tempJoyLX long 0
tempJoyLY long 0
uS long 0 'helper stuff
uS2 long 0
time long 0
reps long 0
speed long 0
addressID long 0 'addresses of global data
addressStatus long 0
addressThumbL long 0
addressThumbR long 0
addressJoyRX long 0
addressJoyRY long 0
addressJoyLX long 0
addressJoyLY long 0
SPIN code (partial)
PUB Get_PSX_Packet
outa[noparse][[/noparse]attPin]~ 'select controller
PSX_TxRx(constant(start)) 'send "start"
ID:=PSX_TxRx(constant(getDat)) 'send "get data" and save controller type
outa[noparse][[/noparse]cmdPin]~ 'clear to zero for rest of packet
Status := PSX_TxRx(0) 'should be $5A ("ready")
ThumbL := PSX_TxRx(0) 'get PSX data
ThumbR := PSX_TxRx(0)
JoyRX := PSX_TxRx(0)
JoyRY := PSX_TxRx(0)
JoyLX := PSX_TxRx(0)
JoyLY := PSX_TxRx(0)
outa[noparse][[/noparse]attPin] ~~ 'deselect controller
PUB PSX_TxRx(psxOut)[img]http://forums.parallax.com/images/smilies/tongue.gif[/img]sxIn |idx
repeat idx from 0 to 7
outa[noparse][[/noparse]cmdPin]:= (((psxOut>>idx)&1)==1)
outa[noparse][[/noparse]clkPin]:=clockMode
psxIn&= !(1<<idx)
if(ina[noparse][[/noparse]datPin])
psxIn |= (1<<idx)
outa[noparse][[/noparse]clkPin]:= !clockMode
Just for reference, I started with CJ's gamecube controller object from the ObEx and, with the help of 'Assembly Code Examples for the Beginner' attempted to convert it to a playstation controller object. I included above the SPIN code that I basically attempted to convert to assembly.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I'm new to the propeller!
Post Edited (bulkhead) : 9/4/2007 12:10:42 AM GMT
Comments
It was a pretty long post, hopefully you have a copy you can cut and paste.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Paul Baker
Propeller Applications Engineer
Parallax, Inc.
It's back up
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I'm new to the propeller!
Post Edited (bulkhead) : 9/3/2007 3:59:25 AM GMT
However, it still does NOT work with my two wireless controllers! At this point, I do not thing it is a timing issue, but perhaps a "start sequence", or something to do with the "ACK" line which is currently unused.
Attached is the most recent version of the object, that works for wired controllers only.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I'm new to the propeller!