Having some trouble with Assembly code
dayoade
Posts: 13
Hello everyone,
I am sorry for the long post but I have been rattling my head around this problem for quite some time. If anyone could provide assistance to one of my problems I would greatly appreciate it.
1. Every time I load the ASM code onto the debugger i get an error message that says "no data- assembly code with Debug kernel loaded in Propeller Chip?", what does this mean and how do i fix it?
2. I have no problem running the Pasm_AsmDebug_Demo ASM code on the debugger. However, whenever I run the Toggle program (assembly code from the propeller education kit, i see pins that are not supposed to be on turn on and pins that are supposed to be on are off in various different ways. When I run it step by step in the debuggger and then proceed to run the program in its entirety, it executes the way it supposed to. Essentially, it doesn't execute properly until I run it step by step and then run the program in its entirety, how do i fix this?
3. This sets up the main reason why I am posting; the assembly code that I have is not executing at all. I don't know it is an interference with the pins that are operating in Spin or another issue.
I am sorry for the long post but I have been rattling my head around this problem for quite some time. If anyone could provide assistance to one of my problems I would greatly appreciate it.
1. Every time I load the ASM code onto the debugger i get an error message that says "no data- assembly code with Debug kernel loaded in Propeller Chip?", what does this mean and how do i fix it?
2. I have no problem running the Pasm_AsmDebug_Demo ASM code on the debugger. However, whenever I run the Toggle program (assembly code from the propeller education kit, i see pins that are not supposed to be on turn on and pins that are supposed to be on are off in various different ways. When I run it step by step in the debuggger and then proceed to run the program in its entirety, it executes the way it supposed to. Essentially, it doesn't execute properly until I run it step by step and then run the program in its entirety, how do i fix this?
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 PUB Main {Launch cog to toggle P16 endlessly} dbg.start(31,30,@entry) cognew(@Toggle, 0) 'Launch new cog OBJ dbg : "PASDebug" DAT {Toggle P17} org 0 'Begin at Cog RAM addr 0 entry ' --------- Debugger Kernel add this at Entry (Addr 0) --------- long $34FC1202,$6CE81201,$83C120B,$8BC0E0A,$E87C0E03,$8BC0E0A long $EC7C0E05,$A0BC1207,$5C7C0003,$5C7C0003,$7FFC,$7FF8 ' -------------------------------------------------------------- Toggle mov dira, Pin 'Set Pin to output mov Time, cnt 'Calculate delay time add Time, #9 'Set minimum delay here :loop waitcnt Time, Delay 'Wait xor outa, Pin 'Toggle Pin jmp #:loop 'Loop endlessly Pin long |< 17 'Pin number Delay long 6_000_000 'Clock cycles to delay Time res 1 'System Counter Workspace
3. This sets up the main reason why I am posting; the assembly code that I have is not executing at all. I don't know it is an interference with the pins that are operating in Spin or another issue.
CON _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 OBJ dbg : "PASDebug" PUB LightControl_main dbg.start(31,30,@entry) 'Assembly code for 4 light pulsing Command:=0 cognew(@Asm, @Command) ' set up another processor ' 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 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 entry ' --------- Debugger Kernel add this at Entry (Addr 0) --------- long $34FC1202,$6CE81201,$83C120B,$8BC0E0A,$E87C0E03,$8BC0E0A long $EC7C0E05,$A0BC1207,$5C7C0003,$5C7C0003,$7FFC,$7FF8 ' -------------------------------------------------------------- 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
Comments
You need to start the cog you want to debug at @entry and not at the Label after the Debug Kernel. With that your two codes load correct and show the code with addresses in PASD.
The cog always starts into a breakpoint, that is the only way the PASDebug object can communicate with the debugged cog. Then you can press F5 to start the cog (maybe set breakpoints before that).
Some tipps:
You don't need an OR and an AND mask for pins. There is the ANDN instruction that inverts the bits before ANDing with the destination.
You can define a mask with
Plight1or long 1<<21 ' Pin 21
If you want to set a pin according a flag then use te MUX?? instructions.
Instead of: mov temp,INA - and temp,Exposurein wz
you can also do it with one instruction: test Exposurein,INA wz
Andy