|
|
View previous topic :: View next topic |
Author |
Message |
Steve Elliott Guest
|
Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 10:58 am |
|
|
Having trouble using multiply and divide on ccs 3.124 with pic16f876 (MPLAB 5.7). The object code that is generated is missing the multiply and divide stubs.
here's sample code:
#include <16F876.H>
main ()
{
int a;
int b;
a = 1200;
b = 12*a;
}
generates:
CCS PCM C Compiler, Version 3.124, 16648
Filename: C:\BK\KEYERS\K45C\TEST.LST
ROM used: 60 (1\%)
Largest free fragment is 2048
RAM used: 7 (4\%) at main() level
9 (5\%) worst case
Stack: 1 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 02B
0003: NOP
....................
.................... #include <16F876.H>
.................... //////// Standard Header file for the PIC16F876 device ////////////////
.................... #device PIC16F876
.................... #list
....................
....................
.................... main ()
.................... {
.................... int a;
.................... int b;
002B: CLRF 04
002C: MOVLW 1F
002D: ANDWF 03,F
002E: MOVLW 07
002F: BSF 03.5
0030: MOVWF 1F
0031: BCF 03.5
....................
.................... a = 1200;
0032: MOVLW B0
0033: MOVWF 21
.................... b = 12*a;
0034: MOVLW 0C
0035: MOVWF 23
0036: MOVF 21,W
0037: MOVWF 24
0038: GOTO 004
0039: MOVF 78,W
003A: MOVWF 22
.................... }
....................
003B: SLEEP
....................
***
That is all the code that gets generated.
Notice that there is a jump to the multiply handler at address 004 but there is nothing present at 004, it wasn't included by the complier !!
Am I missing an include file ?
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514786 |
|
|
davidpk Guest
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 11:14 am |
|
|
An int variable is limited to 0-255, both 1200 and 12*1200 are too large for the variables. Try the 'long' variable type.
:=Having trouble using multiply and divide on ccs 3.124 with pic16f876 (MPLAB 5.7). The object code that is generated is missing the multiply and divide stubs.
:=
:=here's sample code:
:=
:=
:=#include <16F876.H>
:=
:=main ()
:={
:= int a;
:= int b;
:=
:= a = 1200;
:= b = 12*a;
:=}
:=generates:
:=
:=CCS PCM C Compiler, Version 3.124, 16648
:=
:= Filename: C:\BK\KEYERS\K45C\TEST.LST
:=
:= ROM used: 60 (1\%)
:= Largest free fragment is 2048
:= RAM used: 7 (4\%) at main() level
:= 9 (5\%) worst case
:= Stack: 1 locations
:=
:=*
:=0000: MOVLW 00
:=0001: MOVWF 0A
:=0002: GOTO 02B
:=0003: NOP
:=....................
:=.................... #include <16F876.H>
:=.................... //////// Standard Header file for the PIC16F876 device ////////////////
:=.................... #device PIC16F876
:=.................... #list
:=....................
:=....................
:=.................... main ()
:=.................... {
:=.................... int a;
:=.................... int b;
:=002B: CLRF 04
:=002C: MOVLW 1F
:=002D: ANDWF 03,F
:=002E: MOVLW 07
:=002F: BSF 03.5
:=0030: MOVWF 1F
:=0031: BCF 03.5
:=....................
:=.................... a = 1200;
:=0032: MOVLW B0
:=0033: MOVWF 21
:=.................... b = 12*a;
:=0034: MOVLW 0C
:=0035: MOVWF 23
:=0036: MOVF 21,W
:=0037: MOVWF 24
:=0038: GOTO 004
:=0039: MOVF 78,W
:=003A: MOVWF 22
:=.................... }
:=....................
:=003B: SLEEP
:=....................
:=
:=***
:=
:=That is all the code that gets generated.
:=
:=Notice that there is a jump to the multiply handler at address 004 but there is nothing present at 004, it wasn't included by the complier !!
:=Am I missing an include file ?
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514787 |
|
|
Steve Elliott Guest
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 12:33 pm |
|
|
:=An int variable is limited to 0-255, both 1200 and 12*1200 are too large for the variables. Try the 'long' variable type.
:=
hmmm.... same thing...
#include <16F876.H>
main ()
{
long a;
long b;
a = 1200;
b = 12*a;
}
generates:
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 01B
0003: NOP
....................
.................... #include <16F876.H>
.................... //////// Standard Header file for the PIC16F876 device ////////////////
.................... #device PIC16F876
.................... #list
....................
....................
.................... main ()
.................... {
.................... long a;
.................... long b;
001B: CLRF 04
001C: MOVLW 1F
001D: ANDWF 03,F
001E: MOVLW 07
001F: BSF 03.5
0020: MOVWF 1F
0021: BCF 03.5
....................
.................... a = 1200;
0022: MOVLW 04
0023: MOVWF 22
0024: MOVLW B0
0025: MOVWF 21
.................... b = 12*a;
0026: CLRF 26
0027: MOVLW 0C
0028: MOVWF 25
0029: MOVF 22,W
002A: MOVWF 28
002B: MOVF 21,W
002C: MOVWF 27
002D: GOTO 004
002E: MOVF 79,W
002F: MOVWF 24
0030: MOVF 78,W
0031: MOVWF 23
.................... }
....................
0032: SLEEP
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514788 |
|
|
Steve Elliott Guest
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 1:46 pm |
|
|
Ok, sorry for the bandwidth, the code is there in the hex file it is just not included in the MPLAB .lst file. It is odd to step through the code and see it get frozen on the goto line while it is executing code "that isn't there". But is does come back magically with the correct calculated value.
I'm guessing it's protected code, hidden to protect IP ?
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514790 |
|
|
R.J.Hamlett Guest
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 1:47 pm |
|
|
:=Having trouble using multiply and divide on ccs 3.124 with pic16f876 (MPLAB 5.7). The object code that is generated is missing the multiply and divide stubs.
:=
:=here's sample code:
:=
:=
:=#include <16F876.H>
:=
:=main ()
:={
:= int a;
:= int b;
:=
:= a = 1200;
:= b = 12*a;
:=}
:=generates:
:=
:=CCS PCM C Compiler, Version 3.124, 16648
:=
:= Filename: C:\BK\KEYERS\K45C\TEST.LST
:=
:= ROM used: 60 (1\%)
:= Largest free fragment is 2048
:= RAM used: 7 (4\%) at main() level
:= 9 (5\%) worst case
:= Stack: 1 locations
:=
:=*
:=0000: MOVLW 00
:=0001: MOVWF 0A
:=0002: GOTO 02B
:=0003: NOP
:=....................
:=.................... #include <16F876.H>
:=.................... //////// Standard Header file for the PIC16F876 device ////////////////
:=.................... #device PIC16F876
:=.................... #list
:=....................
:=....................
:=.................... main ()
:=.................... {
:=.................... int a;
:=.................... int b;
:=002B: CLRF 04
:=002C: MOVLW 1F
:=002D: ANDWF 03,F
:=002E: MOVLW 07
:=002F: BSF 03.5
:=0030: MOVWF 1F
:=0031: BCF 03.5
:=....................
:=.................... a = 1200;
:=0032: MOVLW B0
:=0033: MOVWF 21
:=.................... b = 12*a;
:=0034: MOVLW 0C
:=0035: MOVWF 23
:=0036: MOVF 21,W
:=0037: MOVWF 24
:=0038: GOTO 004
:=0039: MOVF 78,W
:=003A: MOVWF 22
:=.................... }
:=....................
:=003B: SLEEP
:=....................
:=
:=***
:=
:=That is all the code that gets generated.
:=
:=Notice that there is a jump to the multiply handler at address 004 but there is nothing present at 004, it wasn't included by the complier !!
:=Am I missing an include file ?
There is nothing wrong with the code...
The compiler does not generate assembler, in the list file for these routines, by default. The code is sitting there, between 0004, and 002B. If you look at the hex file, or import it into MPLAB, you will see the code is there.
If you want to see it, edit the start of the 16F876.h file, and change the third line (which normally reads #nolist), and remark this out as //#nolist). Recompile, and the code will be displayed.
Best Wishes
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514791 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Tue May 27, 2003 2:11 pm |
|
|
:=Ok, sorry for the bandwidth, the code is there in the hex file it is just not included in the MPLAB .lst file. It is odd to step through the code and see it get frozen on the goto line while it is executing code "that isn't there". But is does come back magically with the correct calculated value.
----------------------------------------------------
You can see the code if you go to the Window/Program Memory
menu in MPLAB.
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514792 |
|
|
Michael Thompson Guest
|
Re: Multiply/Divide Problems ccs 3.124 |
Posted: Wed May 28, 2003 8:35 am |
|
|
:=Having trouble using multiply and divide on ccs 3.124 with pic16f876 (MPLAB 5.7). The object code that is generated is missing the multiply and divide stubs.
:=
:=here's sample code:
:=
:=
:=#include <16F876.H>
:=
:=main ()
:={
:= int a;
:= int b;
:=
:= a = 1200;
:= b = 12*a;
:=}
:=generates:
:=
:=CCS PCM C Compiler, Version 3.124, 16648
:=
:= Filename: C:\BK\KEYERS\K45C\TEST.LST
:=
:= ROM used: 60 (1\%)
:= Largest free fragment is 2048
:= RAM used: 7 (4\%) at main() level
:= 9 (5\%) worst case
:= Stack: 1 locations
:=
:=*
:=0000: MOVLW 00
:=0001: MOVWF 0A
:=0002: GOTO 02B
:=0003: NOP
:=....................
:=.................... #include <16F876.H>
:=.................... //////// Standard Header file for the PIC16F876 device ////////////////
:=.................... #device PIC16F876
:=.................... #list
:=....................
:=....................
:=.................... main ()
:=.................... {
:=.................... int a;
:=.................... int b;
:=002B: CLRF 04
:=002C: MOVLW 1F
:=002D: ANDWF 03,F
:=002E: MOVLW 07
:=002F: BSF 03.5
:=0030: MOVWF 1F
:=0031: BCF 03.5
:=....................
:=.................... a = 1200;
:=0032: MOVLW B0
:=0033: MOVWF 21
:=.................... b = 12*a;
:=0034: MOVLW 0C
:=0035: MOVWF 23
:=0036: MOVF 21,W
:=0037: MOVWF 24
:=0038: GOTO 004
:=0039: MOVF 78,W
:=003A: MOVWF 22
:=.................... }
:=....................
:=003B: SLEEP
:=....................
:=
:=***
:=
:=That is all the code that gets generated.
:=
:=Notice that there is a jump to the multiply handler at address 004 but there is nothing present at 004, it wasn't included by the complier !!
:=Am I missing an include file ?
R.J. is correct in that the code for the multiply routine at 004 will only be in the list file if the #nolist in the pic16f876.h file is commented out or removed.
Try a = 1200L; to ensure that the constant is typed to that of a long.
Regards,
Mike
___________________________
This message was ported from CCS's old forum
Original Post ID: 144514812 |
|
|
|
|
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
|