C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 1   


C51 COMPILER V9.52.0.0, COMPILATION OF MODULE MC_MOTORDRIVER_LAYER
OBJECT MODULE PLACED IN .\obj\MC_MotorDriver_layer.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE User\Source\MC_MotorDriver_layer.c LARGE OMF2 WARNINGLEVEL(0) OPTIMIZE(SIZE
                    -) BROWSE NOAREGS INCDIR(.\Library\Include;.\User\Include) DEBUG PRINT(.\obj\MC_MotorDriver_layer.lst) TABS(2) OBJECT(.\o
                    -bj\MC_MotorDriver_layer.obj)

line level    source

   1          
   2          /************************ (C) COPYRIGHT 2015 FT *******************************
   3          * File Name          : 
   4          * Author             : Application Team  Tom.wang 
   5          * Version            : V2.0.0
   6          * Date               : 06/15/2015
   7          * Description        : 电机驱动层
   8          ********************************************************************************
   9          /*******************************************************************************
  10          * All Rights Reserved
  11          *******************************************************************************/
  12          
  13          /* Includes ------------------------------------------------------------------*/
  14          #include <FU6812_MCU.h>
  15          #include <sys_conf.h>
  16          #include <fu681x_Device.h>
  17          #include <interrupt.h>
  18          #include <Ftech_BLDC.h>
  19          #include <MC_Led.h>
  20          #include <MC_key.h>
  21          #include <MC_PwmIn.h>
  22          #include <MC_Beep.h>
  23          #include <MC_init.h>
  24          #include <MC_UserInterface_layer.h>
  25          #include <MC_MotorCotrol_layer.h>  
  26          #include <MC_MotorFunction_layer.h> 
  27          #include <MC_MotorDriver_layer.h>   
  28          
  29          /* Private typedef -----------------------------------------------------------*/
  30          /* Private define ------------------------------------------------------------*/
  31          
  32          /* Private macro -------------------------------------------------------------*/
  33          /* Private variables ---------------------------------------------------------*/
  34          DRV_TypeDef xdata Drv; 
  35          u16 idata giEventCounter;
  36          
  37          /* Private function prototypes -----------------------------------------------*/
  38          void Drv_DutyLimit(void);
  39          void Drv_StallRestart(void);               //堵转重启
  40          void Drv_SpeedRampCale(void);              //闭环加减速曲线
  41          void Drv_DutyRampCale(void);               //开环加减速曲线   准备废除 此函数 TOM20170831
  42          
  43          void Drv_PWM_Update(u16 tduty);            //PWM更新
  44          void Drv_PosTrack(void);                   //转速跟踪
  45          void DRV_HallEventCalc(void);              
  46          void DRV_EemfEventCalc(void);
  47          void Drv_BemfTim1PDapp(void) ;             //bemf位置检测中断服务函数
  48          /* Private functions ---------------------------------------------------------*/
  49          
  50          /*******************************************************************************
  51          * Function Name  : Drv_StallRestart    
  52          * Description    : 堵转重启
  53          * Input          : 
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 2   

  54          * Output         : 
  55          * Return         : 
  56          *******************************************************************************/
  57          void Drv_DutyLimit(void)           
  58          {
  59   1        #if (CURRENT_CLOSE_EN == 1)
  60   1        if(Drv.AdcMeas.ImeasBus >  Drv.PWM.DutyLimitMaxRef)
  61   1        {
  62   2          Drv.PWM.DutyLimitFlag = 0x01;
  63   2        }
  64   1        else
  65   1        {
  66   2          Drv.PWM.DutyLimitFlag &= (~0x1);
  67   2        }
  68   1        #endif
  69   1        
  70   1        #if(SPEED_LIMIT_EN)
                if((Drv.speed.EventPeriod < ESC_SPEEDLIMITCNT)&&(Drv.speed.EventPeriod != 0))
                {
                  Drv.PWM.DutyLimitFlag |= 0x02;
                }
                else
                {
                  Drv.PWM.DutyLimitFlag &= (~0x2);
                }
                #endif
  80   1      }
  81          /*******************************************************************************
  82          * Function Name  : Drv_StallRestart    
  83          * Description    : 堵转重启
  84          * Input          : 
  85          * Output         : 
  86          * Return         : 
  87          *******************************************************************************/
  88          void Drv_StallRestart(void)             //堵转重启
  89          {
  90   1        #if (STALLRESTARTNUM != 255)
                if(Ctl.Stall.u8Num < STALLRESTARTNUM)
                #endif
  93   1        {
  94   2          Ctl.Stall.u8Num++;
  95   2          Ctl.Tim.STAnms = 0;
  96   2          Ctl.Tim.STB1nms = 0;
  97   2          Ctl.Tim.STB2nms = 0;
  98   2          Ctl.Stall.u8FL = 0;
  99   2          DRV_OE_ON;
 100   2          Ctl.SysError = NONE;
 101   2          if(Ctl.Stall.u16NormalRunms < STANMS+500)
 102   2          {
 103   3            Ctl.State = MOTOR_STOP;
 104   3          }
 105   2          else
 106   2          {
 107   3            Ctl.State = MOTOR_READY;
 108   3          }
 109   2        }
 110   1      }
 111          
 112          
 113          /*******************************************************************************
 114          * Function Name  : Drv_SpeedRampCale 闭环加减速曲线
 115          * Description    : 速度闭环加减速曲线 开环无效
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 3   

 116          * Input          : 目标速度 refTar _IQ15格式
 117          * Output         : 给定速度 refCur _IQ15格式
 118          * Return         : 给定速度 refCur _IQ15格式
 119          问题：TOM++ u16 Q15格式 无法计算30000-(-2000) 会溢出 20170830 18：43 
 120          *******************************************************************************/
 121          void Drv_SpeedRampCale(void)
 122          {
 123   1        if((Ctl.Spd.refTar > 0)&&(Ctl.Spd.refCur < 0))
 124   1        {
 125   2          Ctl.Spd.refTartemp = 0;
 126   2        }
 127   1        else if((Ctl.Spd.refTar < 0)&&(Ctl.Spd.refCur > 0))
 128   1        {
 129   2          Ctl.Spd.refTartemp = 0;
 130   2        }
 131   1        else
 132   1        {
 133   2          Ctl.Spd.refTartemp = Ctl.Spd.refTar; 
 134   2        }
 135   1      
 136   1        if((Ctl.Spd.refTartemp - Ctl.Spd.refCur) > Ctl.Spd.IncValue)
 137   1        {
 138   2          Ctl.Spd.refCur += Ctl.Spd.IncValue;
 139   2        }
 140   1        else if((Ctl.Spd.refCur - Ctl.Spd.refTartemp) > Ctl.Spd.DecValue)
 141   1        {
 142   2          Ctl.Spd.refCur -= Ctl.Spd.DecValue;
 143   2        }
 144   1        else
 145   1        {
 146   2          Ctl.Spd.refCur = Ctl.Spd.refTartemp;
 147   2        }
 148   1      }
 149          
 150          /*******************************************************************************
 151          * Function Name  : Drv_DutyRampCale 
 152          * Description    : 计算频率，每次斩波计算一次 
 153          * Input          : 目标DUTY  格式_IQ15 即0x7FFF
 154          * Output         : 当前DUTY  格式_IQ15 即0x7FFF
 155          * Return         : 当前DUTY  格式_IQ15 即0x7FFF       
 156          *******************************************************************************/
 157          void Drv_DutyRampCale(void)
 158          {
 159   1        if((Drv.PWM.DutyDecValue != 0x7FFF)&&(Drv.PWM.DutyIncValue != 0x7FFF))
 160   1        {
 161   2          if((Drv.PWM.DutyCur - Drv.PWM.DutyTar) > Drv.PWM.DutyDecValue)
 162   2          {
 163   3            Drv.PWM.DutyCur -= Drv.PWM.DutyDecValue;
 164   3          }
 165   2          else if((Drv.PWM.DutyTar - Drv.PWM.DutyCur) > Drv.PWM.DutyIncValue) 
 166   2          {
 167   3            Drv.PWM.DutyCur += Drv.PWM.DutyIncValue;  
 168   3          }
 169   2          else
 170   2          {
 171   3            Drv.PWM.DutyCur = Drv.PWM.DutyTar;
 172   3          }
 173   2        }
 174   1        else
 175   1        {
 176   2          Drv.PWM.DutyCur = Drv.PWM.DutyTar;
 177   2        }
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 4   

 178   1      }
 179          
 180          /*******************************************************************************
 181          * Function Name  : Drv_PWM_Update
 182          * Description    : PWM更新模块，每次斩波更新，实时更新
 183          * Input          : _IQ15 格式duty
 184          * Output         : DRV_DR          
 185          * Return         : DRV_DR
 186          *******************************************************************************/
 187          void Drv_PWM_Update(u16 tduty)
 188          {
 189   1        if(Drv.PWM.DutyLimitFlag != 0)                 //输出限制
 190   1        {
 191   2          Drv.PWM.DutyMax -= Drv.PWM.DutyLimitValue;
 192   2          if(Drv.PWM.DutyMax < 3276)
 193   2          {
 194   3            Drv.PWM.DutyMax = 3276;
 195   3          }
 196   2        }
 197   1        else
 198   1        {
 199   2          Drv.PWM.DutyMax += Drv.PWM.DutyLimitValue;
 200   2          if(Drv.PWM.DutyMax > MOTOR_VS_MAX)
 201   2          {
 202   3            Drv.PWM.DutyMax = MOTOR_VS_MAX;
 203   3          }
 204   2        }    
 205   1        //#endif
 206   1        tduty +=10;
 207   1        if(tduty > Drv.PWM.DutyMax)
 208   1        {
 209   2          tduty = Drv.PWM.DutyMax;
 210   2        }
 211   1        else if(tduty < Drv.PWM.DutyMin)
 212   1        {
 213   2          tduty = Drv.PWM.DutyMin;
 214   2        }
 215   1        
 216   1        MDUControl.DutyCur = tduty;
 217   1        MDUFlag.PWMDuty = 1;
 218   1      }
 219          
 220          
 221          /*******************************************************************************
 222          * Function Name  : Drv_PosTrack
 223          * Description    : 电机转子位置跟踪
 224          * Input          : None
 225          * Output         : None
 226          * Return         : 1
 227          *******************************************************************************/
 228          void Drv_PosTrack(void)
 229          {
 230   1      #if (POS_FB_MODE == SensorLess)
 231   1      
 232   1        #if (WAIT_STEP == WAIT_STRACK)          //调试模式
                Drv.Stk.Calcnms = 0;
                #endif
 235   1        
 236   1        if(Drv.Stk.Calcnms < STKNMS) 
 237   1        { 
 238   2          if(Drv.Stk.BemfFR != 0xFF)
 239   2          {
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 5   

 240   3            if(Ctl.gDirectionC == Drv.Stk.BemfFR)
 241   3            {
 242   4              if(Ctl.gDirectionC == CW)
 243   4              {
 244   5                Ctl.gStepCur = Drv.Stk.BemfTabA; 
 245   5              }
 246   4              else
 247   4              {
 248   5                Ctl.gStepCur = Drv.Stk.BemfTabB;
 249   5              }
 250   4      
 251   4              TIM1__RCNTR = 0;
 252   4              ANGLE_MASK(10);
 253   4              ANGLE_DELAY(10);         
 254   4        
 255   4              //TIM1__RARR = Ctl.Ramp.MaskTime>>2;
 256   4              ClrBit(TIM1_CR0, T1OPS1);
 257   4              ClrBit(TIM1_CR0, T1OPS0);                          //CMP检测反电势
 258   4              
 259   4              TIM1_CR4 = Ctl.gStepCur;                            //选择检测沿 
 260   4              
 261   4              ClrBit(TIM1_CR0, T1OPS1);
 262   4              SetBit(TIM1_CR0, T1OPS0);                          //CMP检测反电势
 263   4      
 264   4              SetBit(CMP_CR3, SAMSEL1);                        // 使能ON 采样
 265   4              ClrBit(CMP_CR3, SAMSEL0);  
 266   4              
 267   4              SetBit(TIM1_IER, T1PDIE);                          //使能位置检测中断
 268   4              SetBit(TIM1_CR2, T1BRS);     //++                  //1位置检测复位 0写入复位TIM
 269   4      
 270   4              Drv.PWM.DutyTar = Ctl.Ramp.DutyEnd ;            
 271   4              Drv.PWM.DutyCur = Drv.PWM.DutyTar;  
 272   4              DRV_DR = MDU_MULA_U16(MDUControl.DutyCur,Drv.PWM.DutyArr+2,15);
 273   4              giEventCounter = 0;
 274   4              Ctl.State = MOTOR_NORMAL;
 275   4      
 276   4            }
 277   3            else if(Drv.Stk.BemfFR == 0x7F) 
 278   3            {
 279   4              #if (STRACK_EN == 2)
                      Ctl.FnStopmodeC = FREE_DOWN;
                      #endif
 282   4              ClrBit(TIM1_CR2, T1BRS);   //TOM++ TIM1_CR2?
 283   4              Ctl.State = MOTOR_PRECHARGE;
 284   4            }  
 285   3            else
 286   3            {     
 287   4              #if (STRACK_EN == 2)
                      Ctl.State = MOTOR_STOP;
                      Ctl.FnStopmodeC = BREAK_DOWN;
                      #endif
 291   4            }
 292   3          } 
 293   2        }
 294   1        else
 295   1        {
 296   2          #if (STRACK_EN == 2)
                  Ctl.FnStopmodeC = FREE_DOWN;
                  #endif
 299   2          ClrBit(TIM1_CR2, T1BRS);       // 0写入复位TIM1   1位置检测复位 
 300   2          Ctl.State = MOTOR_PRECHARGE;
 301   2        }
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 6   

 302   1      
 303   1        if(Ctl.gStartC == FALSE) 
 304   1        {
 305   2          Ctl.State = MOTOR_STOP;
 306   2        }
 307   1      #endif
 308   1      //  ClrBit(TIM1_CR2, T1BRS);      // 0写入复位TIM1   1位置检测复位 
 309   1      //  Ctl.State = MOTOR_PRECHARGE;
 310   1      
 311   1      }
 312          
 313          
 314          /*******************************************************************************
 315          * Function Name  : Drv_BemfTim1PDapp    
 316          * Description    : 
 317          * Input          : None
 318          * Output         : None
 319          * Return         : None
 320          *******************************************************************************/
 321          void Drv_BemfTim1PDapp(void) 
 322          {
 323   1        if(Ctl.State == MOTOR_NORMAL)
 324   1        {
 325   2          DRV_EemfEventCalc();                    //运行策略
 326   2        }
 327   1        else if(Ctl.State == MOTOR_OPENLOOP)
 328   1        {
 329   2          //Drv_SmartStartCalc();                   //启动算法
 330   2        }
 331   1        else if(Ctl.State == MOTOR_READY)      
 332   1        {
 333   2          Drv_SectionCheak();                   //转速跟踪
 334   2        }
 335   1      }  
 336          
 337          
 338          /*******************************************************************************
 339          * Function Name  : DRV_HallEventCalc    
 340          * Description    : 
 341          速度计算模块，根据HALL信号计算速度
 342          1、软件换相
 343          2、硬件换相
 344          3、软件换相，设置超前角（滞后角） 需要软件干预，防止超前换相时，hall信号先来。
 345          * Input          : TIM1_BCCR
 346          * Output         : 速度单位 RPM
 347          * Return         : 无
 348          
 349          *******************************************************************************/
 350          
 351          #define HALL_ADVANCEEANGLE (20) //超前角度  
 352          #define HALL_RUNMODE       (2)  //1->软件换相 2->硬件换相 3->超前换相(软件参与)
 353          
 354          void DRV_HallEventCalc(void)
 355          {
 356   1        giEventCounter++;
 357   1       
 358   1        if(giEventCounter >= 200)
 359   1        {
 360   2          giEventCounter = 200;
 361   2        }
 362   1        else if(giEventCounter == 30)
 363   1        {
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 7   

 364   2          #if (HALL_RUNMODE == 3)
                  ANGLE_DELAY((60-HALL_ADVANCEEANGLE));    
                  ClrBit(TIM1_CR0, T1OPS1);         //00->软件触发 01->上溢 10->位置检测|ADC计算 11->重载+上溢
                  SetBit(TIM1_CR0, T1OPS0);         //10  01
                  #endif
 369   2        }
 370   1        else if(giEventCounter == 12)
 371   1        {   
 372   2          #if (HALL_RUNMODE == 2)
 373   2          TIM1_CR4 = Ctl.gStepCur;   
 374   2          SetBit(TIM1_CR0, T1OPS1);         //00->软件触发 01->上溢 10->位置检测|ADC计算 11->重载+上溢
 375   2          ClrBit(TIM1_CR0, T1OPS0);         //10  01 
 376   2          #endif
 377   2        }
 378   1        
 379   1        else     //软件换相
 380   1        {
 381   2          #if (HALL_RUNMODE == 1)
                  giEventCounter = 6;
                  #endif
 384   2          if(Ctl.gStepPre != Ctl.gStepCur )
 385   2          {
 386   3            if((Ctl.State == MOTOR_NORMAL)||(Ctl.State == MOTOR_PRECHARGE))
 387   3            {
 388   4              TIM1_CR4 = Ctl.gStepCur;
 389   4              Ctl.gStepPre = Ctl.gStepCur ;
 390   4            }
 391   3          }  
 392   2        }
 393   1      }
 394          
 395          /*******************************************************************************
 396          * Function Name  : DRV_EemfEventCalc    
 397          * Description    : 速度计算模块，根据HALL信号计算速度
 398          * Input          : TIM1_BCCR
 399          * Output         : 速度单位 RPM
 400          * Return         : 无
 401          *******************************************************************************/
 402          #define BEMF_CMP          1 //CMP换相
 403          #define BEMF_ADC          2 //ADC换相
 404          #define BEMF_CMP_ADC0     3 //CMP+ADC上溢换相
 405          #define BEMF_CMP_ADC1     4 //CMP+ADC立刻换相
 406          #define BEMF_MODE         BEMF_CMP     
 407               
 408          
 409          void DRV_EemfEventCalc(void)
 410          {  
 411   1        #if (POS_FB_MODE == SensorLess) 
 412   1        giEventCounter++; 
 413   1      
 414   1        if(giEventCounter >= 6)
 415   1        {
 416   2      //    if((Drv.speed.EventPeriod > STB1C))
 417   2      //    {
 418   2      //      Ctl.SysError = E_STB1;
 419   2      //    } 
 420   2      //    if(Drv.speed.EventPeriod < STB2C)
 421   2      //    {
 422   2      //      Ctl.SysError = E_STB2;
 423   2      //    }
 424   2      
 425   2          #if(STB3_EN)
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 8   

 426   2          if(((Drv.speed.EventPeriod >>2) > Drv.speed.EventPeriodPer)||(Drv.speed.EventPeriod < (Drv.speed.Event
             -PeriodPer>>2)))
 427   2          {
 428   3      //      Ctl.SysError = E_STB3;
 429   3          }
 430   2      
 431   2          #endif
 432   2        }
 433   1         
 434   1        Drv.speed.EventPeriodPer = Drv.speed.EventPeriod;
 435   1        
 436   1        if(giEventCounter >= 200)
 437   1        {
 438   2          giEventCounter = 200;
 439   2        }
 440   1        else if(giEventCounter >= 150)
 441   1        {
 442   2          #if (BEMF_MODE == BEMF_CMP_ADC0 )
                  ANGLE_DELAY(30);                      //ADC模式 只是你ON采样
                  SetBit(CMP_CR3, SAMSEL1);       // 00->ON+OFF 01->OFF  10->ON 11->ONOFF加MASK
                  ClrBit(CMP_CR3, SAMSEL0);       // 
                  
                  ClrBit(TIM1_CR1, T1BRS);          // 1位置检测复位 0写入复位TIM
                  SetBit(TIM1_CR3, T1TIS1);         // 00->GPIO 01->CMP 10->ADC 11->CMP+ADC
                  SetBit(TIM1_CR3, T1TIS0);
                  SetBit(TIM1_CR0, T1OPS1);         // 00->软件触发 01->上溢 10->位置检测|ADC计算 11->重载+上溢
                  SetBit(TIM1_CR0, T1OPS0);         //注意 10测试没问题 11测试没问题
                  #elif (BEMF_MODE == BEMF_CMP_ADC0 )
                  ANGLE_DELAY(30);                      //ADC模式 只是你ON采样
                  SetBit(CMP_CR3, SAMSEL1);       // 00->ON+OFF 01->OFF  10->ON 11->ONOFF加MASK
                  ClrBit(CMP_CR3, SAMSEL0);       // 
                  
                  ClrBit(TIM1_CR1, T1BRS);          // 1位置检测复位 0写入复位TIM
                  SetBit(TIM1_CR3, T1TIS1);         // 00->GPIO 01->CMP 10->ADC 11->CMP+ADC
                  SetBit(TIM1_CR3, T1TIS0);
                  SetBit(TIM1_CR0, T1OPS1);         // 00->软件触发 01->上溢 10->位置检测|ADC计算 11->重载+上溢
                  ClrBit(TIM1_CR0, T1OPS0);         //注意 10测试没问题 11测试没问题
                  #elif (BEMF_MODE == BEMF_ADC )
                  ANGLE_DELAY(30);                      //ADC模式 只是你ON采样
                  SetBit(CMP_CR3, SAMSEL1);       // 00->ON+OFF 01->OFF  10->ON 11->ONOFF加MASK
                  ClrBit(CMP_CR3, SAMSEL0);       // 
                  
                  ClrBit(TIM1_CR1, T1BRS);          // 1位置检测复位 0写入复位TIM
                  SetBit(TIM1_CR3, T1TIS1);         // 00->GPIO 01->CMP 10->ADC 11->CMP+ADC
                  ClrBit(TIM1_CR3, T1TIS0);
                  SetBit(TIM1_CR0, T1OPS1);         // 00->软件触发 01->上溢 10->位置检测|ADC计算 11->重载+上溢
                  ClrBit(TIM1_CR0, T1OPS0);      
                  #elif (BEMF_MODE == BEMF_CMP ) 
 473   2      
 474   2          ClrBit(TIM1_CR2, T1BRS);      // 1位置检测复位 0写入复位TIM
 475   2      //    SetBit(TIM1_CR1, BAPE);       
 476   2      //    SetBit(TIM1_CR0, FORC);      // 强制换相60度电角度
 477   2      
 478   2          ANGLE_MASK(RUN_ANGLE_MASK);
 479   2          ANGLE_DELAY(RUN_ANGLE_DELAY);                //
 480   2          SetBit(CMP_CR3, SAMSEL1);    // 使能ON 采样
 481   2          SetBit(CMP_CR3, SAMSEL0);    // 使能OFF采样
 482   2          #endif   
 483   2        }    
 484   1        else if(giEventCounter >= 100)
 485   1        {
 486   2          ANGLE_MASK(35);
C51 COMPILER V9.52.0.0   MC_MOTORDRIVER_LAYER                                              08/21/2018 12:02:27 PAGE 9   

 487   2          ANGLE_DELAY(1);  
 488   2        }
 489   1        else if(giEventCounter == 30)
 490   1        {
 491   2      
 492   2          Drv.PWM.DutyArr = RUN_PWMARR;
 493   2          DRV_ARR = Drv.PWM.DutyArr;
 494   2          DRV_COMR = PWM_FLOW ;    
 495   2      
 496   2          Drv.PWM.DutyIncValue = SPEED_INCVALUE ;   //loop INC DEC
 497   2          Drv.PWM.DutyDecValue = SPEED_DECVALUE ;
 498   2        }
 499   1          
 500   1        #endif
 501   1      }
 502          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1152    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     98       2
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =      2    ----
   BIT SIZE         =   ----    ----
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
