View previous topic :: View next topic |
Author |
Message |
Guest2008 Guest
|
Big / Little Endian EE |
Posted: Thu Jun 26, 2008 8:45 am |
|
|
Has the format for memory storage changed from Big Endian to Little Endian?
I noticed in the current version of CCS (4.071) -- it stores my float in EE Little Endian (MSB in upper address). And have also confirmed this using the CCS PConvert program.
For example a float value of 1 is now stored in 0x0000007F
but used to be stored 0x7F000000
I have older programs that rely on reading EE being stored Big Endian. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 26, 2008 11:31 am |
|
|
Post the older CCS compiler version that you previously used. |
|
|
guest2008 Guest
|
|
Posted: Thu Jun 26, 2008 1:02 pm |
|
|
CCS PCH C Compiler, Version 4.011 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 26, 2008 1:23 pm |
|
|
I wouldn't use 4.011 as the basis for anything. But I can test it for you
if you post your PIC. |
|
|
Guest2008 Guest
|
|
Posted: Thu Jun 26, 2008 2:47 pm |
|
|
Quote: | I wouldn't use 4.011 as the basis for anything. But I can test it for you
if you post your PIC. |
What do you need -- the PIC part# or the Code? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 26, 2008 3:20 pm |
|
|
The PIC. |
|
|
Guest2008 Guest
|
|
Posted: Fri Jun 27, 2008 6:41 am |
|
|
The PIC I am using now is the 16F887.
The original PIC I was using for a different project was the 18F4520. |
|
|
Ken Johnson
Joined: 23 Mar 2006 Posts: 197 Location: Lewisburg, WV
|
|
Posted: Fri Jun 27, 2008 6:51 am |
|
|
Didn't CCS change from a proprietary float format to the IEEE standard with V4.xxx ?
Ken |
|
|
Ttelmah Guest
|
|
Posted: Fri Jun 27, 2008 7:34 am |
|
|
Nope.
PConvert, allows you to put values in, using Microchip float32, or IEEE float32. The result, doesn't just result in a byte order reversal (3F800000, versus 0000007F).
The change doesn't come with V4. The Pconvert, with 4.027 for example, gives 7F000000, as does the one with 4.051.
The 'help', still shows the exponent in the first byte, with 7F offset.
As far as I can tell, no change has occurred. It is just that Pconvert has switched to showing the bytes in the order they would appear as a number on paper, not the order in memory.
If you generate a line loading a float:
Code: |
: float val=1;
00A6 0E7F MOVLW 0x7f
00A8 6E08 MOVWF 0x8, ACCESS
00AA 6A09 CLRF 0x9, ACCESS
00AC 6A0A CLRF 0xa, ACCESS
00AE 6A0B CLRF 0xb, ACCESS
|
The compiler is still putting the exponent byte first in memory.
I have code that transfers values to IEEE, and uses my own code at the PC end to do this, and it is still working fine, which would not be the case if the byte order had reversed.
Best Wishes |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 27, 2008 3:37 pm |
|
|
I ran tests on both compiler versions, and in each case the compiler
is putting 0x7F into the lowest byte address of the 4 bytes used to
store a floating point value. There is no difference between the
two compiler versions.
16F887 compiled with vs. 4.071. The .LST file is shown in both symbolic
format and standard CCS format:
Code: |
... float array[1] = 1.0;
0017: MOVLW 7F
0018: BCF STATUS.RP1
0019: MOVWF array
001A: CLRF array+1
001B: CLRF array+2
001C: CLRF array+3
... float array[1] = 1.0;
0017: MOVLW 7F
0018: BCF 03.6
0019: MOVWF 21
001A: CLRF 22
001B: CLRF 23
001C: CLRF 24
|
The test program for the .LST file shown above:
Code: | #include <16F887.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)
//=========================
void main()
{
float array[1] = 1.0;
while(1);
} |
Now for the 18F4520 with vs. 4.011, shown in both symbolic format
and CCS format:
Code: |
... float array[1] = 1.0;
0018: MOVLW 7F
001A: MOVWF array
001C: CLRF array+1
001E: CLRF array+2
0020: CLRF array+3
... float array[1] = 1.0;
0018: MOVLW 7F
001A: MOVWF 06
001C: CLRF 07
001E: CLRF 08
0020: CLRF 09
|
Here is the test program for vs. 4.011:
Code: | #include <18F4520.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
//=========================
void main()
{
float array[1] = 1.0;
while(1);
} |
|
|
|
Ken Johnson
Joined: 23 Mar 2006 Posts: 197 Location: Lewisburg, WV
|
|
Posted: Sat Jun 28, 2008 8:22 am |
|
|
From ***PCD*** help:
"The CCS PCD compiler uses the IEEE format for all the floating point number operations"
I should have looked further before posting - so little time . . .
Ken |
|
|
Ttelmah Guest
|
|
Posted: Sat Jun 28, 2008 10:09 am |
|
|
Yes, there are a couple of 'fixes' to keep compatibility in the math.h file, because of this.
But as both PCM Programmer and myself have said, PCB/M/H, have kept the same format. If the poster is having a byte order problem, something else is causing it. Perhaps as one suggestion, the change to the way pointers are handled for example, so if you want to advance 'byte by byte' through a number, you must cast the pointer to a byte sized type. This would give 'screwy' results if not done, resulting in unexpected return values...
Best Wishes |
|
|
|