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
Maybe can be a problem of my small micro?
Most likely not. I would guess it is a problem with the code, but lacking the code it is hard to verify that.
What do u think about this?
I think that given the scarcity of information, any statement about the nature of the problem can be classified as speculation.
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
Always Im debugging my code, i trying everythings and im seeing for webs and datasheet. And i dont know where is the problem. Im exasperate!!!
Thanks.
I see some serious problems with your implementation. I think your integrator is totally wrong - you do not even accumulate the error! it should be something like this:
double UpdatePID(SPid * pid, double error, double position) { double pTerm, dTerm, iTerm; pTerm = pid->pGain * error; // calculate the proportional term // calculate the integral state with limiting pid->iState += error; if (pid->iState > pid->iMax) pid->iState = pid->iMax; else if (pid->iState < pid->iMin) { pid->iState = pid->iMin; iTerm = pid->iGain * iState; } dTerm = pid->dGain * (position - pid->dState); pid->dState = position; return pTerm + iTerm - dTerm; }
If your "real" is "(signed) int" I'm in doubt if you thought about scaling, underflow and overflow of our variables.
sorry, you do accumulate the error but I still think your implementation is not correct.
Thanks for your reply. But i think that the problem is not the implementation because is a simple acumulate. I dont understand why this var not acumulate the old value.
The var values in my debugging are 10, 4 ,... im trying change the data type for unisgned int and is the same.
Let me give you simple example with signed int (-32768 to +32767). In mathematical notation:
SP=3000 (setpint) PV=0 (value read from ADC) Kp=12 P=KP*(SP-PV)=12*(3000-0)=36000
This causes an overflow. The result is treated as a negative number.
I understand your example. But in my code i have this:
First iteraction SP=10 (setpint) PV=0 (value read from ADC) Kp=1 P=KP*(SP-PV)=1*(10-0)=10 Second iteraction SP=10 (setpint) PV=6 (value read from ADC) Kp=1 P=KP*(SP-PV)=1*(10-6)=4 but my pid->iState should be 10+4=14, and it is 4
i dont know why dont save the old value in pid->iState
Are There Anybody that help me with my project?? Maybe i can send the code for see it!!!
It is very important for me!! Thanks
You've checked only this part of your code? You have to ensure, that there is no underflow/overflow/division by 0 in the whole code and under all circumstances (for example extreme user input). The "updating problem": It helps a lot if you screw down your code to the interesting core and debug it. If this fails you can show this very short program and all the necessary information to the forum. And don't forget to mention the controller, hardware, RTX. Check the datasheet of the controller and the camera. It seems you didn't.
Sorry. "Camera" belongs to an other thread I read in parallel.
OK! Im working with an emulator (EPM900) and an evaluation board (MCB900), my micro is Philips P89LPC936, under RTX-51.
Independent of my PID, the problem is the var update. For example:
void Write (void) _task_ WRITE _priority_ 1 { int Ub=0; while (1){ Ub+=1; TXRX_putByte(Ub); //send to serial port } void main (void){ os_start_system (WRITE); }
The var Ub always is 1, never update the value ???????
Recently i debugg my code in the simulator of uvision and all var are updated!!! Why dont work in my board?????????
Recently i debugg my code in the simulator of uvision and all var are updated!!! Why dont work in my board????????? DUH, the simulator simulates.
if there is e.g. a baudrate error, the simulating thing will still work, if the internal XRAM in the device is not enabled the simulating thing will still work, ....
if the var you are hunting is in xdata, I'll bet you dollars to doughnuts that you have not modified startup.a51 to enable your XDATA.
BTW this newfangled thing that only few know about called a datasheet will tell you what is needed.
looking at the Keil manual and the startup code will show you why this must be at the start of startup.a51.
java
you be please ignoring sir eracs terrrible sarcasem.
he is be thinking he be funny,,, but he is just crazy yes.
rahib, what happened? where is praise? where is the submission :) :) :) where is the propaganda ?! it is sir erac you are talking about maaaaaaan !!!!
now seriously: your friend did not provide vital data that could have solved his problem earlier and save us time, headache and heartache! instead he offered money. YUK.
HI Eric!! First thanks for your reply.
My code startup is: START900.A51 because i use Philips P89LPC936. It has 512 bytes of xdata.
I have modificated only this:
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> ; the absolute start-address of XDATA memory XDATASTART EQU 0x000 ; ; <o> XDATALEN: XDATA memory length <0x0-0xFFFF> ; the length of XDATA memory in bytes. XDATALEN EQU 0x200 ;
i say no!!!!!!
i asking his help and ansewrs and he be ignored me
i think he liking to heat poeple up and spit the bit out yes???
he say lots but not say much for poeple to be using.
now he is not sir but he being something other yes!!!!
why are taking this so seriously? ok, I sometimes also think that I'd rather jump into a swimming pool filled with Pirenia fish rather than being bashes by Erik, but (un)fortunately he often knows what he is talking about (like this one!). so relax and enjoy the bottomless well of knowledge (gee, I'm poetic!)
tamik
you be wanting downuts you be must be talking by erac
you be wanting sarchastem you be must talking by erac
you be wanting anwser by simple problum you must be talking by erac
you be wanting to know goood ansewr by diffucult problam you be must be talkin gnot by erac
you be wanting downuts you be must be talking by erac while I have had a suspicion the above confirm my suspicion as to who "Erac" is.
anyhow you are totally wrong.
When I use the (common in the US) expression "I will bet you dollars to doughnuts" it means the if you will give me a doughnut if I'm right I'll give you a dollar if I'm wrong. Thus this does not mean that I will give anyone a doughnut.
you be wanting to know goood ansewr by diffucult problam you be must be talkin not by erac there is a familiar expression "give a man a log and he will be warm for a day, set him on fire and he will be warm for the rest of his life" NO, NO, I am confusing sayings I was thinking of "give a man a fish and he will eat for a day, teach him to fish and he will eat for the rest of his life"
THUS, I consider it WRONG to solve peoples probems for them by feeding them the solution, REAL HELP is helping them to help themselves. Thus "here is the code you need" is not real help, whereas "in the datsheet you will find information related to SFR xxx, which will make you see what is wrong" is REAL help. That I prefer not to do this in a dry manner may upset some and some may like it, so what.
"give a man a log and he will be warm for a day, set him on fire and he will be warm for the rest of his life"
Might be considered cruel by some, but it certainly appeals to my sense of humour!
every time I hear of yet another attempt to cut costs on the expense of software development and tools, because it is considered simple and straight forward (anybody can do it, not? they disregard the most important part: doing it right!), I have to think of this phrase: "you can defeat gravity by jumping from a plane. but only temporarily, of course".
View all questions in Keil forum