CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Relocating Interrupts

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Andreas



Joined: 25 Oct 2004
Posts: 136

View user's profile Send private message

Relocating Interrupts
PostPosted: Fri Aug 24, 2007 12:24 am     Reply with quote

Hi Friends !

I know thats an old issue, but I was not able to find samples !

I need to use a ready bootloader which resides at the the beginof programm memory and expects the user area to start at H2028.

It should have zeros at H2000 ... H2007

The interrupts should be at H2008 / H2018

So the memora map is:
0x2028 user program entry
0x2018 Low-Level Interrupt handler
0x2008 High-level interrupt handler
0x2000 user info 8 Bytes filled with zeros

SO my questions are now:

Which directive to use to relocate the interrupt and to set the area H2000..H2007 to zeros ?

any help very appreciated

best regards
Andreas
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Aug 24, 2007 12:32 am     Reply with quote

http://www.ccsinfo.com/forum/viewtopic.php?t=28504
Andreas



Joined: 25 Oct 2004
Posts: 136

View user's profile Send private message

PostPosted: Fri Aug 24, 2007 2:30 pm     Reply with quote

Thank You, PCM programmer, I found the point where to start now.

In searching for the best implementation I got to the directives #Locate and reserve.

Out of the explanation in the manual I cannot see a difference in this directives, can You give me the point??

Mybe I cant read it because english is not my native language...

Best regards and Thanks for big contribution to the board

Andreas
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Aug 24, 2007 3:11 pm     Reply with quote

#locate is used to assign a specific RAM address to a variable.
Normally, you don't need to use #locate, because the CCS compiler will
automatically assign the RAM addresses of each variable to some
appropriate place in the PIC's memory map.

Also, an address that is assigned with #locate will not be used for
other variables by the compiler. For example, here is the memory
map for the program shown below. Notice that value is placed at
address 0x21, and the other variables are automatically placed in
free RAM locations, but they do not use address 0x21.
Code:

020     a
021     value
022     b
023     c
024     x
025     y
026     z

Code:
#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)

int8 a,b,c;

int8 value;
#locate value = 0x21

int8 x,y,z;

//===============================
main()
{

while(1);
}



The #reserve directive just prevents the compiler from using one or more
bytes of RAM. It doesn't assign any variables to the RAM.
Here is the memory map for the program shown below. Note that
address 0x21 is not used, because the #reserve directive tells the
compiler not to use it.
Code:

020     a
022     b
023     c
024     x
025     y
026     z


Code:
#include <16F877.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 4000000)

#reserve 0x21
int8 a,b,c;
int8 x,y,z;
//====================================
main()
{



while(1);
}
Andreas



Joined: 25 Oct 2004
Posts: 136

View user's profile Send private message

PostPosted: Sat Aug 25, 2007 7:14 am     Reply with quote

Hi

Thanks PCM Programmer, that was very usefull explanation.

I have a problem with implementing a third party bootloader:

It needs to have 8 0x00 Bytes at 0x2000, and I couldnt find a way to make this.

The requirements are

Start of user Program 0x2028
High level ints at 0x2008
low level ints at 0x2018
user programinfo = 8 x 0x00 at 0x2000

I made this, but I can see a jump at 0x2000 !!!
Code:

#build(reset=0x2000)
#build(interrupt=0x2008)
#org 0x0000,0x1FFE
void bootloader() {}



So I tried to set the reset to 0x2028 but then the comiler said wrong org statement

I also tried to set #rom 0x2000 = {0,0,0,0,0,0,0,0}

again compiler says wrong org statement

any idea to make this setup working ??

again: User program should start at 0x2028, interupts at 0x2008, and user info at 0x0200

best regards

Andreas
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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