|
|
View previous topic :: View next topic |
Author |
Message |
icefield
Joined: 09 May 2005 Posts: 20 Location: Canada
|
dsPIC: Trouble getting ASM load/modify/store working |
Posted: Thu Sep 09, 2010 10:13 am |
|
|
The C code below compiles to 6 or 11 instructions for a load/modify/store and this is a time-sensitive operation. Instead, I want to do it with 4 instructions in assembly. But, for some reason, I cannot get CCS (4.112) to generate the elusive MOV.B W0L,2D4. Presumably this is coded as MOV.B W0, REG_PORTD_LSB, but the compiler generates an "Expecting an opcode mnemonic" error.
Code: | #use delay(clock=20000000)
#byte REG_LATD_LSB = 0x2D6
#byte REG_PORTD_LSB = 0x2D4
void main()
{
unsigned int8 u8PortReg, u8Which;
// C Method #1
u8PortReg = REG_LATD_LSB; // read latched output value
u8PortReg &= 0xf8;
u8PortReg |= u8Which;
REG_PORTD_LSB = u8PortReg;
// C Method #2
REG_PORTD_LSB = (REG_LATD_LSB & 0xf8) | u8Which;
// ASM Method
#asm
MOV.b REG_LATD_LSB, W0
AND.b #0xF8, W0
IOR.b u8Which, W0
MOV W0, REG_PORTD_LSB
#endasm
}
|
The assembled code is as follows. The instruction at 00226 is the one I want to generate, but cannot get the compiler to produce - I can only get the line at 0023A, which is NOT what I want.
Code: | .................... // C Method #1
.................... u8PortReg = REG_LATD_LSB; // read latched output value
00212: MOV.B 2D6,W0L
00214: MOV.B W0L,801
.................... u8PortReg &= 0xf8;
00216: MOV 800,W4
00218: LSR W4,#8,W4
0021A: AND.B #F8,W4L
0021C: MOV.B W4L,W0L
0021E: MOV.B W0L,801
.................... u8PortReg |= u8Which;
00220: MOV.B 802,W0L
00222: IOR.B 801
.................... REG_PORTD_LSB = u8PortReg;
00224: MOV.B 801,W0L
00226: MOV.B W0L,2D4
....................
.................... // C Method #2
.................... REG_PORTD_LSB = (REG_LATD_LSB & 0xf8) | u8Which;
00228: MOV 2D6,W5
0022A: AND #F8,W5
0022C: MOV.B 802,W0L
0022E: MOV.B W0L,2D4
00230: MOV W5,W0
00232: IOR.B 2D4
....................
.................... // ASM Method
.................... #asm
.................... MOV.b REG_LATD_LSB, W0
00234: MOV.B 2D6,W0L
.................... AND.b #0xF8, W0
00236: AND.B #F8,W0L
.................... IOR.b u8Which, W0
00238: IOR.B 802,W0L
.................... MOV W0, REG_PORTD_LSB
0023A: MOV W0,2D4
.................... #endasm
|
Does anyone know how to get the compiler to generate the magic code at 00226?
Cheers! |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Sep 09, 2010 12:28 pm |
|
|
Don't know why PCD assembler refuses to translate legal asm syntax arbitrarily. My solution is to use register variables in C code, either together with assembler instructions, or without it, as shown below:
Code: | #byte W0L=0x00
W0L = REG_LATD_LSB;
W0L &= 0xF8;
W0L ^= u8Which;
REG_PORTD_LSB = W0L; |
|
|
|
icefield
Joined: 09 May 2005 Posts: 20 Location: Canada
|
dsPIC: Trouble with ASM load/modify/store [resolved (sort of |
Posted: Fri Sep 10, 2010 3:33 pm |
|
|
Most excellent! It works.
Now, if CCS would just get their inline assembler to accept legal mnemonics, we'd be spared this bother! It boggles my mind that the compiler can generate the very instructions it refuses to parse.
Many thanks. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Sat Sep 11, 2010 3:01 am |
|
|
The question is "who's" legal mnemonics?....
CCS assembler, is not Microchip assembler. They have their own syntax, that is nearer to C in a lot of places. The big problem is not that it doesn't accept other people's mnemonics, but that they don't document what it does accept....
It really calls for a separate assembler pdf, with details of the accepted instructions for PCM (most known), PCH (ditto), and PCD (still large gaps...), and syntax details for things like accessing addresses etc..
However, it has become less and less necessary, with 98% of stuff that used to require assembler, now being directly do-able in the C.
Best Wishes |
|
|
RenSeven
Joined: 28 Oct 2010 Posts: 5
|
|
Posted: Thu Oct 28, 2010 2:45 pm |
|
|
Quote: | The question is "who's" legal mnemonics?.... |
Not trying to be snarky, but the answer to that can be had in the help file for the error message:
Quote: | Expecting an opcode mnemonic
This must be a Microchip mnemonic such as MOVLW or BTFSC.
|
And while most stuff might be do-able in C, very tight loops where every cycle counts, probably needs assembly. I completely concur on the need for a separate PDF! |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Oct 28, 2010 4:35 pm |
|
|
Quote: | Not trying to be snarky, but the answer to that can be had in the help file for the error message.
Expecting an opcode mnemonic
This must be a Microchip mnemonic such as MOVLW or BTFSC. |
I suggest, to compile the said code yourself before jumping to conclusions, and you hopefully understand, what's the original poster talking about. Just as a hint, the code is using a legal mnemonic, but it's not understood by the compiler anyway. Unfortunately, not everything can be explained from the manual, even when reading it thoroughly. |
|
|
RenSeven
Joined: 28 Oct 2010 Posts: 5
|
|
Posted: Thu Oct 28, 2010 7:05 pm |
|
|
Not sure what conclusions you think I'm jumping to. I found this thread because I am trying to assemble the same mnemonics and getting the same error codes as the OP. So I guess I did compile the said code myself. I believe Ttelmah's point was that CCS uses their own mnemonics, and I simply pointed out that their help file ironically claims they use Microchip's mnemonics.
FWIW (thanks to DR @ CCS support) the (or a) correct syntax is:
...with the W0 implied. I think that answers the OP question. At least it does for me on PIC24. |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Thu Oct 28, 2010 11:49 pm |
|
|
Sorry for misinterpreting your statement. Others should decide, if it can be easily understood as an ironic comment about the confuse CCS documentation.
It seems to me, that the piece of information given in the laconic FWIW would be much more worth a posting than your first cryptic attempt.
I basically agree to your conclusion:
Quote: | I completely concur on the need for a separate PDF! |
As a first step, CCS may want to make the manual part describing the assembler syntax complete and free of errors. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Fri Oct 29, 2010 9:34 am |
|
|
First, CCS's error messages have little to do with real errors. If you have used the compiler for a while, you will have found that 90% of the time, the error message actually doesn't reflect where the real error lies...
Now, the point about the CCS assembler, is that it's 'core syntax', is not Microchip. Unfortunately, this syntax is almost completely undocumented. The manual section is a joke, and most of the more sophisticated constructs have been discovered by past experimentation, hints from CCS etc..
As you see from what you have now found to be the correct syntax, it was not the actual mnemonic that was the problem, but the syntax of the line after it, with CCS 'implying' W0, without having to be told.
Let's all start to ask for better documentation here. Whenever an answer like the one you now have is given, 'ask back' for better documentation. Eventually, someone at CCS may actually listen.
Best Wishes |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|