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
// 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;
while( !TIMEOUT );
LoadDelay( 10 );
P1 = 0;
while( !TIMEOUT );
}
}
==================
PROJECT2.C
==================
#include "sys.c"
void main( void ) {
InitMcu();
while ( 1 ) {
LoadDelay( 10 );
P1 = 0xff;
while( !TIMEOUT );
LoadDelay( 10 );
P1 = 0;
while( !TIMEOUT );
}
}
------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user