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

Automatic RESET during operation

i am facing a wierd problem.. My MCU P89V51RD2BN resets during Execution...
i am a college student and a beginner Here so i dont know the Advanced Programming methods
i would also inform that..

i have a recursive function , a warning is issued by the compiler for the same. but....

earlier this was not a problem but since i have modified some of the Sub-Routines for 16Bit Data this Problem has come up, i need those functions to be 16 bit because of the limitation of the ALU i was earlier using 8bit and leaving most of the Task to Assumption which i cannot do so now..

i would also state that the Problem occurs in a fumction at a point when i call 2 functions in the same code, these themselves call around 5 sub-routines each but that wasnt a problem earlier (before i used the 16bit return type sub-routines).

now i found something in the manual stating reentrant Functions, but i really dont know how to use it

i used it like this

void Home_Screen_Instance() reentrant
{ ------------
} Do i need to use the keyword "reentrant" in the Function Decleration too?
but that didnt help either
but the compilers shows an error Home_Screen_Instance : redefinition.
Target Not Created

this was the first of a kind problem that i encountered, my MCU is resetting itself for sure(i checked that with a dummy subroutine of blinking LED) and it is not because of the watchdog timer, i am sure about that too..

so whats the Problem here?

is the Stack overflowing???
or there is any other reason behind this?
should i revert back to the 8bit versions of my subroutine (without any other choice)?
is it because of the recursive nature of the function H0me_screen_instance?

Related Data:

The Program is Display intensive, i mean there are a lot of Strings to be displayed and they are stored beforehand in XDATA,
message shown during sucessfull compilation, (still resets)
Program Size: data 9.4 xdata 252 code 9514
creating hex-----blah blah blah----
0 Error(s) 65 Warning(s)

Parents
  • what if i have to enter a 4 digit number, 9999 the maximum value i permit in this project as an user input can be contained by an unsigned int variable..
    suggestions:

    if (num_digit <= 4)
    {
        num *= 10;
        num + digit;
        num_digits++;
    }
    

    or

    if (num_digit <= 5 && Stack[0]<7) // im using a stack here,first element (MSB) is always at Stack[0]
     {
        num *= 10;
        num + digit;
        num_digits++;
    }
    

    will this be fine?

    also i suggest we do it at the end.. when the user has completed entering all the details, well it depends upon the number of characters being entered... yours look really good if the number of characters is large more than 5... i modified your code

    unsigned int Temp2=0;
    
    while(Size>0) //Stack begins at 0, but Size is  a natural Number
            {
                    Temp2*=10;
                    Temp2+=Stack[Stack_Top - Size]-'0'; //Stack_Top is at Size after the Execution
                    --Size;
            }
    

    now if the user is done with just one digit or two and i separately need to know that then
    Temp2%10 or Temp2%100 or like that..

Reply
  • what if i have to enter a 4 digit number, 9999 the maximum value i permit in this project as an user input can be contained by an unsigned int variable..
    suggestions:

    if (num_digit <= 4)
    {
        num *= 10;
        num + digit;
        num_digits++;
    }
    

    or

    if (num_digit <= 5 && Stack[0]<7) // im using a stack here,first element (MSB) is always at Stack[0]
     {
        num *= 10;
        num + digit;
        num_digits++;
    }
    

    will this be fine?

    also i suggest we do it at the end.. when the user has completed entering all the details, well it depends upon the number of characters being entered... yours look really good if the number of characters is large more than 5... i modified your code

    unsigned int Temp2=0;
    
    while(Size>0) //Stack begins at 0, but Size is  a natural Number
            {
                    Temp2*=10;
                    Temp2+=Stack[Stack_Top - Size]-'0'; //Stack_Top is at Size after the Execution
                    --Size;
            }
    

    now if the user is done with just one digit or two and i separately need to know that then
    Temp2%10 or Temp2%100 or like that..

Children