From: Muhammad F. F. <m_f...@ho...> - 2001-02-16 00:50:35
|
Hi.. My idea is to set certain flags upon command on serial comm port, the code should look like these, /***********************************/ bit f_char1, f_char2; void serial_ISR( void ) interrupt 4 { if ( RI ) { unsigned char ch = SBUF; RI = 0; switch ( ch ) { case CHAR1 : f_char1 = 1; break; case CHAR2 : f_char2 = 1; break; } } TI = 0; } void main( void ) { while ( 1 ) { if ( f_char1 ) func1(); if ( f_char2 ) func2(); } } /***********************************/ It seems that in my current project such idea is not working. func1() or func2() was never accessed. I'm using SDCC v211 Borland. Is there any explaination ? regards, fahmy _________________________________________________________________________ Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com. |
From: Joris v. d. S. <vd...@pu...> - 2001-02-16 10:16:41
|
> Hi.. > > My idea is to set certain flags upon command on serial comm port, the > code should look like these, > > bit f_char1, f_char2; > > void serial_ISR( void ) interrupt 4 { > [SNIP] > > It seems that in my current project such idea is not working. func1() > or func2() was never accessed. > > I'm using SDCC v211 Borland. Is there any explaination ? Every global variable that is changed "in the background" by an ISR (or another task if you have a multitasking operating system), should have the `volatile' keyword. If you omit this keyword, the compiler will optimise your main loop and will not recheck the values of `f_char1' and `f_char2' for each period of the loop. The compiler has no reason to believe the values might have changed, since the foreground task has not accessed the variables itself. Therefore, add `volatile' to the declaration: volatile bit f_char1, f_char2 ; Regards, Joris |
From: Gernot.Fink <Ger...@mu...> - 2001-02-18 15:35:35
|
On Fre, 16 Feb 2001, Muhammad Fahmy F. wrote: I miss some initialisations in your Programm a function like this: void ser_init (void) { ES = 0; SCON = 0x50; PCON |= 0x80; /* SMOD = 1; */ TMOD &= 0x0f; /* use timer 1 */ TMOD |= 0x20; TL1 = 256-((clock+baudrate*6*16)/16/12/baudrate); TH1=256-((clock+baudrate*6*16)/16/12/baudrate); TR1=1; ES = 1; EA=1; } >Hi.. > >My idea is to set certain flags upon command on serial comm port, the code >should look like these, > >/***********************************/ >bit f_char1, f_char2; > >void serial_ISR( void ) interrupt 4 { > if ( RI ) { > unsigned char ch = SBUF; > RI = 0; > switch ( ch ) { > case CHAR1 : > f_char1 = 1; > break; > case CHAR2 : > f_char2 = 1; > break; > } > } > TI = 0; >} > >void main( void ) { > while ( 1 ) { > if ( f_char1 ) func1(); > if ( f_char2 ) func2(); > } >} >/***********************************/ > > >It seems that in my current project such idea is not working. func1() or >func2() was never accessed. > >I'm using SDCC v211 Borland. Is there any explaination ? > >regards, >fahmy >_________________________________________________________________________ >Get Your Private, Free E-mail from MSN Hotmail at http://www.hotmail.com. > > >_______________________________________________ >Sdcc-user mailing list >Sdc...@li... >http://lists.sourceforge.net/lists/listinfo/sdcc-user -- MFG G.Fink |