Hi listers,

I have problems polling volatile variable from "extern" main(). Here are details:

Compiler:
=======
I use this distribution: (output from "sdcc -v")
SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.5.6 #4264 (Jul  6 2006)

OS:
===
Win2000

Chip:
====
AT89S52

Simulator:
=======
JSIM 4.05 (Freeware from Jens Altmann)

Project files: (details are attached)
=========
sys.h
sys.c
project1.c
project2.c

Commands: ( -L and -I paths are stripped)
=========
x:/>sdcc -c sys.c
x:/>sdcc project.c sys.rel
x:/>packihx project.ihx > project.hex

Problems:
=======
When I compiled the project1.c in modular way, with: ( -L and -I paths are stripped)
x:/>sdcc -c sys.c
x:/>sdcc project1.c sys.rel
polling volatile variable TIMEOUT from main() is failed.

When I merged "sys.h", "sys.c" in single file "project2.c" and do single file compilation,
x:\sdcc project2.c
polling volatile variable TIMEOUT from main() is successfull.

Please anyone help me.
I prefer modular compilation.
I usually break source files in modules and build them with Borland's make.

Regards,
Fahmy


=====
SYS.H
=====
#define XTAL               11.0592e6

#define TICK_PERIODE       50e-3
#define RELOAD_VALUE       -( TICK_PERIODE * XTAL / 12 )
#define TMOD_CONF          0x51                 // Timer 0: 16-bit timer, Timer 1: 16-bit counter

// I stripped "extern" when I merged "sys.c" with "project2.c"
extern void SystemTick     ( void ) interrupt 1 using 1;   // timer 0
extern void LoadDelay      ( unsigned int ticks );
extern void Delay          ( unsigned int ticks );
extern void InitMcu        ( void );

volatile unsigned int  TICKS;           // system ticks
volatile unsigned char TIMEOUT;         // system timeout flag


=====
SYS.C
=====
#include <at89x52.h>
#include "sys.h"

void SystemTick( void ) interrupt 1 using 1 {
    TR0 = 0;
    TL0 = (unsigned char) RELOAD_VALUE;
    TH0 = (unsigned char) ((unsigned int) RELOAD_VALUE >> 8);
    TR0 = 1;

    /* system ticks */
    if ( TICKS ) {
        TICKS--;
        return;
    }
    TIMEOUT = 1;
}

void LoadDelay( unsigned int ticks ) {
    if ( ticks ) {
        TIMEOUT = 0;
        TICKS = ticks;
    }
}

void Delay( unsigned int ticks ) {
    LoadDelay( ticks );
    while ( !TIMEOUT );
}

void InitMcu( void ) {
    // Initialize GLOBAL VARs here !
    TICKS = 0;
    TIMEOUT = 1;

    // External Interrupt Setting
    IT0  = 0;       // falling edge for INT0
    IT1  = 0;       // falling edge for INT1

    // Interrupt Priority Setting
    PX0  = 0;       // Priority to INT 0
    PT0  = 1;       // Priority to Timer 0
    PX1  = 0;
    PT1  = 0;
    PS   = 0;
 #ifdef AT89x52_H
    PT2  = 0;
 #endif

    // Enable specific interrupt(s)
    EX0  = 0;       // External 0 interrupt
    ET0  = 1;       // Timer 0 interrupt
    EX1  = 0;       // External 1 interrupt
    ET1  = 0;       // Timer 1 interrupt
    ES   = 0;       // Serial interrupt
 #ifdef AT89x52_H
    ET2  = 0;       // Timer 2 interrupt
 #endif
    EA   = 1;       // Enable all interrupts

    // Timer Setup, see SYS.H
    TMOD = TMOD_CONF;

    TL0 = (unsigned char) RELOAD_VALUE;
    TH0 = (unsigned char) ((unsigned int) RELOAD_VALUE >> 8);

    TR0  = 1;       // run Timer0
}


==========
PROJECT1.C
==========
#include <at89x52.h>
#include "sys.h"

void main( void ) {
    InitMcu();

    while ( 1 ) {
        LoadDelay( 10 );
        P1 = 0xff;              // leds off
        while( !TIMEOUT );
        LoadDelay( 10 );
        P1 = 0;                 // leds on
        while( !TIMEOUT );
    }
}


==================
PROJECT2.C
==================
#include "sys.c"

void main( void ) {
    InitMcu();

    while ( 1 ) {
        LoadDelay( 10 );
        P1 = 0xff;              // leds off
        while( !TIMEOUT );
        LoadDelay( 10 );
        P1 = 0;                 // leds on
        while( !TIMEOUT );
    }
}