This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

interrupt and modular programming

i want to use my interrupt rotine for the different function in different c files;

main.c file

void my_fonction(void);
data unsigned char switch_state ;

void my_interrupr_rotine (void)  IE0_VECTOR using 1 {
switch_state = P1^3;//read switch
}

void main (void){

while(1){
if(switch_state){
//some thing
}
else my_function();


}
}


and another c file

extern data unsigned char switch_state ;

void my_fonction(void){
while (switch_state==0) {
//somethings
}

}


my program enters in my_function, but in this function, the interrupt routine isnt working, what is the solutuion?(or is tehere any solution?) im seraching in google andkeil database "interrupt modular" ,"interrupt extern" "interrupt global" etc. i havent found anything

Parents
  • sounds like your "global" switch_state variable is not actually global.

    Are you using a header file for the 'extern' declaration? If not, there is a very high risk that you will make a slight type somewhere and your different files will be referencing different data

    main.c

    #include "main.h" // Including this here ensures that the extern declaration
                      // of switch_state matches the actual definition
    
    data unsigned char switch_state ;
    
    void my_interrupr_rotine (void)  IE0_VECTOR using 1
    {
       switch_state = P1^3; //read switch
    }
    

    main.h

    extern data unsigned char switch_state ;
    

    other.c

    #include "main.h" // Provide extern declaration of switch_state
    
    void my_fonction(void)
    {
       while (switch_state==0)
       {
          //somethings
       }
    }
    

    c-faq.com/.../decldef.html

Reply
  • sounds like your "global" switch_state variable is not actually global.

    Are you using a header file for the 'extern' declaration? If not, there is a very high risk that you will make a slight type somewhere and your different files will be referencing different data

    main.c

    #include "main.h" // Including this here ensures that the extern declaration
                      // of switch_state matches the actual definition
    
    data unsigned char switch_state ;
    
    void my_interrupr_rotine (void)  IE0_VECTOR using 1
    {
       switch_state = P1^3; //read switch
    }
    

    main.h

    extern data unsigned char switch_state ;
    

    other.c

    #include "main.h" // Provide extern declaration of switch_state
    
    void my_fonction(void)
    {
       while (switch_state==0)
       {
          //somethings
       }
    }
    

    c-faq.com/.../decldef.html

Children
  • thank you for your reply, i was use extern decleration only in another file, not in main file becouse i didnt know, i tried this exactly as you tell, but the trouble remaining, switch_state is changing only when the program in main.c file if, in another file there is no change on switch_state. is keil has got any rule about interrupt routines, suchlike; the interrupt rotines are active only when te program executuion statement is on the same file with interupt routine.

  • "i was use extern decleration only in another file, not in main file becouse i didnt know, i tried this exactly as you tell"

    There is only any point in doing this if you use a header file!

    Are you using a header file?

    "is keil has got any rule about interrupt routines, suchlike; the interrupt rotines are active only when te program executuion statement is on the same file with interupt routine."

    Absolutely not.

  • thank you very much ! my program now working, i am using header files, also the problem was in the one of this header files
    one my variable structure;
    xdata volatile PSD_REGS PSD_reg _at_ PSD_REG_ADDR; and its extern line at header file is;
    extern xdata PSD_REGS PSD_reg _at_ PSD_REG_ADDR; when i writing ,i forgot volatile keyword, (i think may be optimiser didnt take care of on switch port changing whitout volatile (port d which is contrlled by PSD_REGS )) and i didnt see this very long time. i cant paste all my code here becouse the program nearly 700 line, if i can paste here , most probably you can see the wrong line, in one minute:) thanks