Assembly code may not be working
dayoade
Posts: 13
Hello everyone, I am a first time poster and I wanted to see if I could get some assistance working on Spin and Assembly code. I am new to Spin and Assembly code and I was having some trouble executing the Assembly code. I am using the P8x32a-d40 to control an LED sequence. There is a portion of the code that is written in Assembly for speed purposes. However, the Spin portion executes perfectly, but the Assembly portion does not appear to run when I use the cognew command to call it. Has anyone experienced this or can anyone provide me with a way to just test the Assembly portion?
Comments
Post your code so we can see what is wrong. You can use the "C" button in the format bar.
Welcome to the forum.
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
VAR
byte datin[3], dp
byte light1status, light2status, light3status, light4status
word dtemp1, dout1, dtemp2, dout2, dtemp3, dout3, dtemp4, dout4
long Command
long pulsecount
PUB LightControl_main
' UM245R communication Lines
dira[7..0] := %00000000 ' input byte form UM245R
dira[8] := 0 'input, RXF
dira[9] := 1 ' output, RD#
dira[10] := 0 'input, TXE
dira[11] := 1 ' output, WR#
'Digital output communication lines, SN74HC595
dira[12] := 1 ' output, clock
dira[13] := 1 ' output, data line 1
dira[14] := 1 ' output, latch 1
dira[15] := 1 ' output, data line 2
dira[16] := 1 ' output, latch 2
dira[17] := 1 'output, data line 3
dira[18] := 1 'output, latch 3
dira[19] := 1 ' output, data line 4
dira[20] := 1 ' output, latch 4
dira[21] := 1 ' output, analog MUX 1
dira[22] := 1 ' output, analog MUX 2
dira[23] := 1 ' output, analog MUX 3
dira[24] := 1 ' output, analog MUX 4
dira[25] := 0 ' input, camera frame exposure signal
'Assembly code for 4 light pulsing
Command:=0
cognew(@Asm, @Command) ' set up another processor
outa[9] := 1
outa[11] := 0
outa[12] := 0
outa[13] := 0
outa[14] := 0
outa[15] := 0
outa[16] := 0
outa[17] := 0
outa[18] := 0
outa[19] := 0
outa[20] := 0
outa[21] := 0
outa[22] := 0
outa[23] := 0
outa[24] := 0
light1status := 0
light2status := 0
light3status := 0
light4status := 0
' set 4 LED drive voltage outputs to 0
repeat 16
outa[12] := 1 ' clock it in
outa[12] := 0
outa[14] := 1 ' latch it in
outa[14] := 0
outa[16] := 1 ' latch it in
outa[16] := 0
outa[18] := 1 ' latch it in
outa[18] := 0
outa[20] := 1 ' latch it in
outa[20] := 0
repeat
repeat dp from 0 to 2
repeat until ina[8]==0
outa[9] := 0
datin[dp] := ina[7..0]
outa[9] := 1
'change lightlevel1
if datin[0]==2
dout1 := datin[1] + datin[2]*256
dtemp1 := dout1
repeat 12
if (dtemp1 & %0000100000000000)==%0000100000000000
outa[13] := 1
else
outa[13] := 0
outa[12] := 1 ' clock it in
outa[12] := 0
dtemp1 <<= 1 ' shift left 1
outa[14]:=1 'latch it in
outa[14]:=0
' turn on light1
elseif datin[0]==3
if light1status==0
outa[21] := 1
light1status := 1
elseif light1status==1
outa[21] := 0
light1status := 0
'change lightlevel2
elseif datin[0]==4
dout2 := datin[1] + datin[2]*256
dtemp2 := dout2
repeat 12
if (dtemp2 & %0000100000000000)==%0000100000000000
outa[15] := 1
else
outa[15] := 0
outa[12] := 1 ' clock it in
outa[12] := 0
dtemp2 <<= 1 ' shift left 1
outa[16]:=1 ' latch it in
outa[16]:=0
' turn on light2
elseif datin[0]==5
if light2status==0
outa[22] := 1
light2status := 1
elseif light2status==1
outa[22] := 0
light2status := 0
' change lightlevel3
elseif datin[0]==6
dout3 := datin[1] + datin[2]*256
dtemp3 := dout3
repeat 12
if (dtemp3 & %0000100000000000)==%0000100000000000
outa[17] := 1
else
outa[17] := 0
outa[12] := 1 ' clock it in
outa[12] := 0
dtemp3 <<= 1 ' shift left 1
outa[18]:=1 ' latch it in
outa[18]:=0
' turn on light3
elseif datin[0]==7
if light3status==0
outa[23] := 1
light3status := 1
elseif light3status==1
outa[23] := 0
light3status := 0
' change lightlevel4
elseif datin[0]==8
dout4 := datin[1] + datin[2]*256
dtemp4 := dout4
repeat 12
if (dtemp4 & %0000100000000000)==%0000100000000000
outa[19] := 1
else
outa[19] := 0
outa[12] := 1 ' clock it in
outa[12] := 0
dtemp4 <<= 1 ' shift left 1
outa[20]:=1 ' latch it in
outa[20]:=0
' turn on light4
elseif datin[0]==9
if light4status==0
outa[24] := 1
light4status := 1
elseif light4status==1
outa[24] := 0
light4status := 0
' Run Light Pulsing (Round-Robbin) with Processor 2
elseif datin[0]==10
pulsecount := datin[1] + datin[2]*256
Command:=1
repeat until Command==0
elseif datin[0]==255
reboot
DAT
' Processor 2 code: Simple Round-Robbin Sequence
org 0
Asm mov CmdAddr, par
mov VarAddr, par
add VarAddr, #4
mov dira, Pin
WaitForCmd rdlong Temp, CmdAddr
tjz Temp, #WaitForCmd
rdlong Count, VarAddr
Loop1 mov Temp, ina
and Temp, Exposurein wz
if_z jmp #Loop1
or outa, Plight1or ' turn on light 1
Lp1 mov Temp, ina
and Temp, Exposurein wz
if_nz jmp #Lp1
and outa, Plight1and ' turn off light 1
Loop2 mov Temp, ina
and Temp, Exposurein wz
if_z jmp #Loop2
or outa, Plight2or ' turn on light2
Lp2 mov Temp, ina
and Temp, Exposurein wz
if_nz jmp #Lp2
and outa, Plight2and ' turn off light2
Loop3 mov Temp, ina
and Temp, Exposurein wz
if_z jmp #Loop3
or outa, Plight3or ' turn on light3
Lp3 mov Temp, ina
and Temp, Exposurein wz
if_nz jmp #Lp3
and outa, Plight3and ' turn off light 3
Loop4 mov Temp, ina
and Temp, Exposurein wz
if_z jmp #Loop4
or outa, Plight4or 'turn on light4
Lp4 mov Temp, ina
and Temp, Exposurein wz
if_nz jmp #Lp4
and outa, Plight4and ' turn off light4
djnz Count, #Loop1
wrlong Zero, CmdAddr
jmp #WaitForCmd
CmdAddr long 0
VarAddr long 0
Temp long 0
Zero long 0
Count long 0
Pin long %00000001_11111111_11111010_00000000
Plight1or long %00000000_00100000_00000000_00000000 ' Pin 21
Plight1and long %11111111_11011111_11111111_11111111 ' Pin 21
Plight2or long %00000000_01000000_00000000_00000000 ' Pin 22
Plight2and long %11111111_10111111_11111111_11111111 ' Pin 22
Plight3or long %00000000_10000000_00000000_00000000 ' Pin 23
Plight3and long %11111111_01111111_11111111_11111111 ' Pin 23
Plight4or long %00000001_00000000_00000000_00000000 ' Pin 24
Plight4and long %11111110_11111111_11111111_11111111 ' Pin 24
Exposurein long %00000010_00000000_00000000_00000000
]
That way, all the formatting is maintained. It is especially important in spin where indents count.
I don't see anything obvious wrong. I assume it all compiles and loads and the spin part is turning its light on.
I see you are loading DIRA in the PASM cog; not doing this is a common error.
I would simplify the PASM to turn on a light to make sure it is being executed and the add the command part later.
So your spin cog is colliding with your pasm cog on pins 21-24.
Remove or comment out all references to Pin 21-24 out of your Spin-Cog.
my 2 cents.
Mike
should be
and your Plight... masks could look like this:
You'd then turn on light 1 with
and turn off light 1 with
Note the "andn" instead of the "and". This means that *only* the bit(s) set in the mask are turned off.
Regarding your issue with the code not running... I agree with Mike. You're trying to control a light from 2 cogs. Not a good idea.
If you set any of the lights on with the SPIN code, then it is impossible to turn them off with the assembly code. The OUTA bits from all cogs are OR'd together to set the pin states. This means that if any cog turns on a pin then no other cog can turn it off.
I suspect that the issue is that one or more of the lights is turned on via a command, which will cause the assembly code that waits for the corresponding light to be turned off to go into an infinite loop when you attempt to pulse the lights.
A possible fix would be to have the "Run light pulsing" SPIN code do the following before setting Command to 1: Of course, this would override any previous commands that turned on a light.
But ultimately, IMHO, only one cog should manipulate a pin (light).
Walter