Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/05/07 03:59
Read: times


 
#142778 - Problem with using Timer 1 of AT89S52 in C
I am learning C51 and am writing a C function to control RC servos with AT89S52. The pulses that control the servo shaft are generated by Timer 1.

The function:

SetServoPo(X);

where 0 <= X <= 180, in degree, sends a control pulse to the servo.

The segment of the program that assigns values to TH1 and TL1 is:

float tmp;
unsigned char TH,TL;

--------------------
tmp = 65536 - (10 * AxisAngle + 460);   //with a 12MHz crystal
TH = tmp / 256;                         //Derive the upper 8-bit from "tmp"
TL = tmp - TH * 256;                    //Derive the lower 8-bit from "tmp"
--------------------


and the program worked fine with a 12MHz crystal.
After that I modified the program to work with a 22.1184MHz crystal, so the segment above was replaced with:

--------------------
tmp = 65536 - (10 * AxisAngle + 460) * 22118400 / 12000000;
TH = tmp / 256;
TL = tmp - TH * 256;
--------------------


...and the servos started trembling fiercely (which indicated Timer 1 was refilled with random values).

It happened to work correctly with this segment:
--------------------
tmp = 65536 - (10 * AxisAngle + 460) * 221184 / 120000; //that is, by removing the two zeros
TH = tmp / 256;
TL = tmp - TH * 256;
--------------------


Since I used to program in assembly I have no idea what was going wrong with the code in the past few days.

I have no access to the Keil C51 software after school but I don't think the difference of the EVAL and the FULL versions caused the problem because the code size is within the 2k limit.


Any guidance will be appreciated.


Stanley



List of 31 messages in thread
TopicAuthorDate
Problem with using Timer 1 of AT89S52 in C            01/01/70 00:00      
   methodology and the raw reason            01/01/70 00:00      
      Range of Variables            01/01/70 00:00      
         What type is AxisAngle?            01/01/70 00:00      
            AxisAngle is char            01/01/70 00:00      
            Integer < 65536?            01/01/70 00:00      
               Working within the range of long integers            01/01/70 00:00      
                  so I should....?            01/01/70 00:00      
                     A float constant            01/01/70 00:00      
                        what's the different            01/01/70 00:00      
                           const float...            01/01/70 00:00      
                              which means the compiler            01/01/70 00:00      
                     floats            01/01/70 00:00      
         drop float            01/01/70 00:00      
            Since I have just started to learn C...            01/01/70 00:00      
               A real programming language            01/01/70 00:00      
            Fractional Equivalence            01/01/70 00:00      
         Why?            01/01/70 00:00      
            there is a reason for this...            01/01/70 00:00      
               don't think as a PC programmer....            01/01/70 00:00      
                  Application vs. Hardware Platform            01/01/70 00:00      
                     the prudent programmer...            01/01/70 00:00      
                  PDP?            01/01/70 00:00      
                     it's not similar to the REAL assembly, of course,            01/01/70 00:00      
            Division is not always first            01/01/70 00:00      
               You are right.            01/01/70 00:00      
                  Explicitness            01/01/70 00:00      
                     is this when the C-code...            01/01/70 00:00      
                     agree with the agreement            01/01/70 00:00      
   Try this, can be better            01/01/70 00:00      
      Superfluous casts            01/01/70 00:00      

Back to Subject List