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

Global Var

HI!!

I declared 3 global var, i call it inside diferent task and every execution this var should be updates but not to do it.
I have a 8051 under evaluation board.
Maybe can be a problem of my small micro?
What do u think about this?

Thanks

Parents
  • What do u think about this?
    I have no idea what micro (u) think about this, what I think is that you are trying to run before you have even learned to crawl, that is a surefire way of breaking a leg.
    learn to crawl, THEN learn to walk, THEN learn to run.
    1) read "the bible" and the datasheet for your device a couple of times to familiarize yourself with the contents.
    2) work through (I did NOT say 'read') the Keil "getting started guide"
    3) do some simple projects (start with 'blinky') gradually adding complexity
    4) go back to whatever running it is you are trying to do way too early.

    Erik

Reply
  • What do u think about this?
    I have no idea what micro (u) think about this, what I think is that you are trying to run before you have even learned to crawl, that is a surefire way of breaking a leg.
    learn to crawl, THEN learn to walk, THEN learn to run.
    1) read "the bible" and the datasheet for your device a couple of times to familiarize yourself with the contents.
    2) work through (I did NOT say 'read') the Keil "getting started guide"
    3) do some simple projects (start with 'blinky') gradually adding complexity
    4) go back to whatever running it is you are trying to do way too early.

    Erik

Children
  • that is being wise words of wisdom from the very wise old man!!!!!!

  • For Erik!!

    What is your problem???????
    Im a student and i work too hard to learn it.
    If you dont want response my problem is not necesary your answer!!!!

    Good luck!!

  • java,

    you must be please excuse sir erac becasue he is sometimes makeing joke he thinking is funng but is not funny and is lokking very bad you be thinking!!!!!

    pleaes remember he is very old and wise and he wanting respect from every one and he may be sometimes he giving good ansewr.

  • Erik Did respond. He noted - as several others - that you supplied to little info for anyone to come with suggestions. He also noted that you seemed to be doing things you where not comfortable with, and I would think most other readers would agree.

    I asked you for the function implementation, since it is the function that will assign any new values to your global variable. By the way - why a pointer to a global variable? Do you have multiple global variables of the same type, and sometimes send the address to one variable, and sometimes the address to another?

    You said: "The funtion implementation i think that is not important to resolve my problem."

    If the function does not perform any assign using the pointer, then your global variable will not be updated. Obviously the implementation of the function seems to be very, very relevant, don't you think?

    Another thing - real is int? Is that your own data type, or an assumption about the Keil float? Every programmer who sees the name "real" will map into their brain the very obvious notation that real is NOT an integer. A real should be a floating point value - or in some situations maybe a fixed-point value. But when you work with finite-resolution fixed-point values, you normally name them according to their size, just so you always know how many decimals you have. This is very important when multiplying two fixed-point numbers which produces twice as many decimals as the original numbers had.

  • Thanks Per!!!

    real is my data type, now is int but i created this for future changes.

    The implementation is important Yeah!!! but i think that it is OK:

    error = SP - PV;
    
                    P = pid->Kp*error;
                    if (pid->Ti){
                            I = pid->iState*(pid->Kp*(pid->Ts/pid->Ti)+ pid->Kwindup);
                            pid->iState = pid->iState + error;
                    }else I=0;
                    if (pid->Td){
                            D = (pid->Kp*(pid->Td/pid->Ts)*(PV - pid->dState));
                            pid->dState = PV;
                    }else D=0;
                    v = P + I + D;
    

    this is a piece of code.
    For example the pid->iState it is not updated!!!

    I dont know where is the problem.

  • Have you made sure that your function thinks pid->Ti is non-zero, so it has a reason to update pid->iState?

  • In this funtion, i return pid->iState, first this var returned 10 and after returned 4 and should return 14.

  • are you actually writing into the piece of memory pointed by iA? show that please...

  • For Erik!!

    What is your problem???????
    I have no problem

    Im a student and i work too hard to learn it
    why, then, does it upset you that I tell you HOW to learn it?

    Erik

  • NO, sorry. I didnt understand you!!

  • This is my PID task, it should update the iA, but not to do it!!

    void PIDa (void) _task_ A _priority_ 1 {
    
    
            Ua = UpdatePID (&iA, SPa, PVa, 1, 4);
    
            os_send_signal(WRITE);
    
            os_delete_task(A);
    
    }
    

  • This is my PID task, it should update the iA, but not to do it!!

    Without seeing the code of updatePID, it is impossible for anyone to tell what the function does and what not.

    As long as you keep information scarce, all you're going to get is speculation.

  • please post the body of

    UpdatePID
    

    not just the calls to it - the function itself.

  • OK, well!! I explain the code:

    -I have a global var type struct.
    -I have 2 task: WRITE task: here create PID task PID task: here call to the funtion that update the those struct.

    This is the piece of code:

    PID.H
    
    typedef int real;
    
    typedef struct {
    
    real dState;            /* Ultima posicion             */
    real iState;            /* Estado del integrador       */
    real uMax,uMin;     /* Saturacion del actuador     */
    real Kp;                    /* Ganancia proporcional       */
    real Ti,Td;                     /* Cte, tiempo integral y derivativo        */
    real Ts,Tt;                     /* Periodo muestreo, Cte. tiempo tracking   */
    real Kwindup;           /* Cte. antireset windup                    */
    
    } SPid;
    
    real UpdatePID (SPid *pid, real SP, real PV, unsigned int AUTO,real Uman) reentrant{
             into PID.c
             ....
             pid->iState += error;
             return pid->iState;
    }
    
    MAIN.C
    
    //global var
    SPid iA
    
    void Write (void) _task_ WRITE _priority_ 1{
               .....
               os_create_task(A);
               os_wait(K_SIG, WAIT_FOREVER,0);
               os_clear_signal(WRITE);
    }
    
    void PIDa (void) _task_ A _priority_ 1 {
               ...
               Ua = UpdatePID (&iA, SPa, PVa, 1, 4);
               os_send_signal(WRITE);
               os_delete_task(B);
    }
    
    the iA var never update