|
|
View previous topic :: View next topic |
Author |
Message |
Guest
|
Unspected reset |
Posted: Mon Oct 27, 2003 1:07 pm |
|
|
Hi,
I've been programming PICs using assembler for a few years now, and I decided to move to C, as assembler is not a fast development tool.
I'm migrating a program which allows the user to configure a PBX using a phone.
I don't include the code here because its written in spanish, and most of you won't understand it (tell me if I'm wrong, and I'll post it).
Basically, my code is comprised by a lot of infinite loops, every one representing a "state".
The main selects the state according to the events. Below are some excerpts of the code that I translated to english:
Code: |
void main() {
#bit tris_RELE = 0x85.0 // relay tris (PORTA<0>)
#bit tris_HOOK = 0x86.5 // hook tris (PORTB<5>)
#bit tris_RING = 0x86.6 // ring tris (PORTB<6>)
#byte adcon1 = 0x9F // A/D control
int state = IDLE;
// initializations
enable_interrupts(GLOBAL); // in order for the timer to work
initialize_I2C();
initialize_PWM();
initialize_timer();
initialize_DTMF();
initialize_clock();
tris_RELE = 0; // relay pin as an output
tris_HOOK = 1; // hook pin as an input
tris_RING = 1; // ring pin as an input
adcon1 = 0x18; // port A pins as digital I/O
#IFDEF DEBUG_MAIN
printf("\n\rQOK");
#ENDIF
while(1) {
if(state == IDLE) state = eIDLE(); //idle state
if(state == INTT) state = eINTT(); //internal tone
if(state == BUST) state = eBUST(); //bussy tone
if(state == LOGN) state = eLOGN(); //login
if(state == COMU) state = eCOMR(); //commands reception
}
}
int eIDLE() { // IDLE state
#ifdef DEBUG_STATE
printf("\n\rIDLE");
#endif
//state initializations
//
//
relay_coil = 0; // disconnect the user from the config line
stop_PWM(); // mute the internal tone
while(1) {
// if the phone goes off-hook, jump to INTT (internal tone)
if(!on_hook) return INTT;
// if the phone is ringing, jump to RING (ringing routine)
if(!no_ring) return RING;
}
}
int eINTT() { // INTT state (Internal Tone)
#ifdef DEBUG_STATE
printf("\n\rINTT");
#endif
//state initializations
//
//
start_timer(1500); //set the timer to 15 seconds
start_PWM(190); //start the internal tone
while(1) {
//if the user hungs up, jump back to idle
if(off_hook) return IDLE;
//if the user presses a key, save it as user number
if(DTMFhit()) {
user = read_DTMF(); //user is a global variable
return LOGN;
}
// if the timer expires, jump to bust
if(timer_out()) return BUST;
}
}
int eLOGN() { // LOGN state (LOGiN)
int key[4], numkeys = 0;
int PIN[4];
#ifdef DEBUG_STATE
printf("\n\rLOGN");
#endif
//inicializaciones de este estado
//
//
start_timer(1000);
stop_PWM();
while(1) {
//on_hook ? go back to idle
if(off_hook) return IDLE;
//timeout ? bussy tone
if(timer_out()) return BUST;
//receive the PIN
if(DTMFhit()) {
key[numkeys] = read_DTMF();
numkeys ++;
if(numkeys == 4) {
read_EEPROM((user<<4) + 12, PIN, 4);
if(key[0] == PIN[0] && key[1] == PIN[1] && key[2] == PIN[2] && key[3] == PIN[3]) {
start_PWM(100); // a little beep
delay_ms(200);
stop_PWM();
return ECOR;
} else return BUST;
}
}
}
}
|
Well, that should give an idea of what I'm doing (and it only tookme half an hour to translate...)
The thing is ti hungs (and resets) randomly during the login state. Some times I'm able to login without a problem, and some other times it hungs and resets.
I'm using only the rtcc interrupt, and its enabled only between the start_timer() function and the timeout.
Can anyone giveme a hint on this ? This is my first ccs program, and I don't have a clue on what's wrong.
BTW, the watchdog is disabled.
Thanks in advance |
|
|
kamyip
Joined: 14 Oct 2003 Posts: 10
|
|
Posted: Mon Oct 27, 2003 1:57 pm |
|
|
I think you should enable global interrupt only after you initialise all the hardware peripherals. This should be before you go into main(). |
|
|
kamyip
Joined: 14 Oct 2003 Posts: 10
|
|
Posted: Mon Oct 27, 2003 2:11 pm |
|
|
kamyip wrote: | I think you should enable global interrupt only after you initialise all the hardware peripherals. This should be before you go into main(). |
Thousands apologies, "main()" should have been "while(1) {}" superloop. |
|
|
Guest
|
|
Posted: Tue Oct 28, 2003 7:06 am |
|
|
Is there any bug list for the compiler I can check ? |
|
|
Guest
|
unexpected reset |
Posted: Tue Oct 28, 2003 7:00 pm |
|
|
One possibility: there are hardware condition(s) to cause unexpected resets. If you happen to have very long wires (>10ft) from switch inputs to processor I/O pins, this can cause a reset. If this is applicable, I can offer more info. |
|
|
sbayeta
Joined: 27 Oct 2003 Posts: 6
|
Re: unexpected reset |
Posted: Wed Oct 29, 2003 4:48 am |
|
|
Anonymous wrote: | One possibility: there are hardware condition(s) to cause unexpected resets. If you happen to have very long wires (>10ft) from switch inputs to processor I/O pins, this can cause a reset. If this is applicable, I can offer more info. |
Hi,
Thanks for that answer, but it can be that. The thing is i have a version of the program written in assembler and it runs fine. It's not a hardware problem, nor a configuration problem.
The C porgram is really simple, so I don't think the problem is there. That's why I think it must be the compiler.
BTW, I'm the original poster (I registered now)
Thanks |
|
|
|
|
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
|