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 CCS Technical Support

portb interrupt

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







portb interrupt
PostPosted: Sun Aug 28, 2005 7:51 pm     Reply with quote

in the example EX_PBUTT.C, what is the purpose of the statement "last=current' in the detect_rb_change function? last is always set to 0 whenever an interrupt happens, is that right?

Code:
void detect_rb_change() {
   int current;
   static int last=0;

   set_tris_b(0xF0);
   current=input_b();

   #if LOWTOHIGH
   if ((!bit_test(last,4))&&(bit_test(current,4))) {dbutton4=1;}
   if ((!bit_test(last,5))&&(bit_test(current,5))) {dbutton5=1;}
   if ((!bit_test(last,6))&&(bit_test(current,6))) {dbutton6=1;}
   if ((!bit_test(last,7))&&(bit_test(current,7))) {dbutton7=1;}
   #elif HIGHTOLOW
   if ((!bit_test(current,4))&&(bit_test(last,4))) {dbutton4=1;}
   if ((!bit_test(current,5))&&(bit_test(last,5))) {dbutton5=1;}
   if ((!bit_test(current,6))&&(bit_test(last,6))) {dbutton6=1;}
   if ((!bit_test(current,7))&&(bit_test(last,7))) {dbutton7=1;}
   #endif

   last=current;
}


regards
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Aug 28, 2005 7:57 pm     Reply with quote

Quote:
last is always set to 0 whenever an interrupt happens, is that right?

It's only set to zero initially.
Guest
Guest







PostPosted: Sun Aug 28, 2005 8:18 pm     Reply with quote

isn't this function executes at each interrupt so that "last" will always be 0 as it is initialized at each interrupt?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Aug 28, 2005 11:00 pm     Reply with quote

It's not initialized at each interrupt. It's only initialized when the
program first starts running.

I'll show you how you can check this. First make a small test program:
Code:

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

#int_rb
void int_rb_isr(void)
{
int current;
static int last = 0;

last = current;   
}   
//=====================
void main()
{

while(1);
}


Then compile it and look at the .LST file.
Here's the symbol table:
Code:

int_rb_isr.last                   00000028
int_rb_isr.current                00000029


Below, notice that at address 0042, 'last' is cleared (set = 0).
But notice that address 0042 is part of the main() code.
If you follow the addresses in main(), they start at 0039
and then they go down to 0040, and there's a gap.
CCS puts the code for the isr inside the isr to make it
easy to read the .LST file, but the "last = 0" code isn't
executed inside the isr. It's just done once, in main(),
when the program starts.

Code:

0000                 ... #int_rb 
0000                 ... void int_rb_isr(void) 
0000                 ... { 
0000                 ... int current; 
0000                 ... static int last = 0; 
0041 1283        BCF    03.5
0042 01A8        CLRF   28
0000                ...   
0000                ...   
0000                ... last = current;     
0033 0829        MOVF   29,W
0034 00A8        MOVWF  28
0000                ... }     
0000                ...   
0000                ...//========================= 
0035 100B        BCF    0B.0
0036 118A        BCF    0A.3
0037 120A        BCF    0A.4
0038 281D        GOTO   01D
0000                ... void main() 
0000                 ... { 
0039 0184        CLRF   04
003A 301F        MOVLW  1F
003B 0583        ANDWF  03,F
003C 1683        BSF    03.5
003D 141F        BSF    1F.0
003E 149F        BSF    1F.1
003F 151F        BSF    1F.2
0040 119F        BCF    1F.3
0000               ... while(1); 
0043 2843        GOTO   043
0000               ... } 
0044 0063        SLEEP
asmallri



Joined: 12 Aug 2004
Posts: 1635
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Mon Aug 29, 2005 3:34 am     Reply with quote

Guest wrote:
isn't this function executes at each interrupt so that "last" will always be 0 as it is initialized at each interrupt?


No. The variable is declared as static and therefore retains its value between interrupts. It is initially set to zero on program startup.
_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
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