• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

HolTek单片机的问题?

我的程序怎么不能用啊,好像没有任何反应?
/*=======================================
* Project Name:     Power_Display
* Program Name:     PowDly
* Author:           Tao Shan Biao 
* Copyright:        Tao Shan Biao 
* CPU:              ht46r064
* Virsion:          1.0
* Project           Start Time: 2011-07-24
* Modify Comment:   Non
=======================================*/

#include "HT46R064.h"

#define S1                  _pb5
#define S2                  _pa6
#define S3                  _pb4
#define DCUP                _pa1
#define ExtPowConnect       _pa3
#define iPadConnect         _pa2

unsigned  long int  P_count0;
unsigned char P_count1;
unsigned char P_count2;

unsigned  long int halt_count0;
unsigned char halt_count1;

unsigned char LED_DisplayBuffer;
unsigned char Pow_grade;
unsigned char charge_count1;
unsigned char charge_count2;
//-------------------------------------------------------------------------
#pragma vector isr_4 @ 0x04     //外部中断
#pragma vector isr_8 @ 0x08     //定时/计数器0溢出中断
#pragma vector isr_c @ 0x0c     //A/D转换完成中断
#pragma vector isr_10 @ 0x10     //时基溢出中断

void isr_4()
{
}
void isr_8(){}
void isr_c(){}
void isr_10(){}   
//-------------------------------------------------------------------------

void init_MCU(void)
{   
    _ctrl1 = 0xCA;      //INT外部中断触发方式:双边沿,时基最小,WDT关闭
    _wdts = 0x07;      //设置定时器最大周期
    _clkmod = 0;      //振荡器低功耗模
    _qosc = 1;         //使用HIRC作为系统时
    _pbc = 0;         //设置B端口为输
    _pac = 0xBF;      //设置除PA6为输出的其他A端口为输
    _papu = 0xBF;      //设置除PA6端口其他A端口若上
    _pawk = 0x1C;      //设置PA.4,3,2为下降沿唤
   
    _adcr = 0x21;      //设置PA.0为AD通
    _acsr = 0x44;      //开启AD模块电源,选择AD时钟源为系统时
    _start = 0;
    _start = 1;
_start = 0;
   
    _intc0 = 0x07;      //定时器,外部中断使能   
}

void init_Device(void)
{
   S1 = 0;
   S2 = 1;
   DCUP = 1;
   S3 = 1;
   
   P_count0 = 0;
   P_count1 = 0;
   P_count2 = 0;
   
   Pow_grade = 0;
   charge_count1 = 0;
   charge_count2 = 0;
   
   halt_count0 = 0;
   halt_count1 = 0;
      
   LED_DisplayBuffer = 0;   
}

void Updata_Powgrade(void)
{
_adcr = 0x21;       //设置PA.0为AD通道
_acsr = 0x44;       //开启AD模块电源,选择AD时钟源为系统时钟
_start = 0;
_start = 1;
while(_eocb);
Pow_grade = _adrh / 0x30;   
}
    
void Updata_ledbuff(void)
{
    unsigned char i;
    for(i = 0; i < Pow_grade; i++)
    {
        LED_DisplayBuffer |= (1 << i);
    }    
}
 
void warn_Display(void)
{

}

void Pow_Display(void)
{
   Updata_ledbuff();
   _pb |= 0x0F & LED_DisplayBuffer;
}

void charge_Display(void)
{
   if(charge_count1 >= (5 - Pow_grade))
   {
      charge_count1 = 0;
      Updata_ledbuff();
   }
   LED_DisplayBuffer |= (1 <
   charge_count1++;
   _pb |= 0x0F & LED_DisplayBuffer; 
}


void poll_count(void)
{
   if(!P_count0)
   {
      P_count0 = 0x0F51; 
      P_count1--;
   }
   if(!P_count1)
   {
      P_count1 = 0xFF; 
      P_count2--;
       if(S3)
       {
          Pow_Display();        //显示电量
       }
       else
       {
          charge_Display();     //显示充电
       }       
   }
   if(!P_count2)
   {
      P_count2 = 0x12;
      Updata_Powgrade();
   }      
   P_count0--;   
}

void Core_proc(void)
{
   if(ExtPowConnect)
   {
      if(iPadConnect)
      {
         S1 = 0;      //给电池充电
         S2 = 1;
         DCUP = 0;   //此地是开还是不开?
         S3 = 1;
      }
      else
      {
         S2 = 1;      //连入外部电源
         DCUP = 1;
         S3 = 1;
         S1 = 1;
      }
      halt_count0 = 0;
      halt_count1 = 0;      
   }
   else
   {
      if(iPadConnect)
      {
 
         if(halt_count0 == 0x4C97) {halt_count0 = 0; halt_count1++;}
         if(halt_count0 == 250)
         {
          halt_count0 = 0;
          _halt();   //休眠
         }
      }
      else
      {
         if(1)
         {
            S1 = 0;      //用电池供电
            S2 = 1;
            DCUP = 1;
            S3 = 0;
         }
         else
         {
            //显示缺电警告
         }
         halt_count0 = 0;
         halt_count1 = 0;
      }
   }
}
//-------------------------------------------------------------------------
void main()
{
   init_MCU();
   init_Device();
   do
   {
      poll_count();
      Core_proc();
   }
   while(1);
}
全部回复(4)
正序查看
倒序查看
2011-08-09 19:30

没用过这颗芯片,代码也一下子看不出问题。

建议结合硬件,设置断点慢慢调试。

0
回复
sohappy
LV.3
3
2011-08-10 13:59
@on_the_way_li
没用过这颗芯片,代码也一下子看不出问题。建议结合硬件,设置断点慢慢调试。
知道原因了,编译器问题啊,我没有仿真器啊,只能试一次烧一次
0
回复
2011-08-10 14:08
@sohappy
知道原因了,编译器问题啊,我没有仿真器啊,只能试一次烧一次

祝贺。。

0
回复
sohappy
LV.3
5
2011-08-11 09:15
@on_the_way_li
祝贺。。

可是新的问题又来了

/*=======================================

* Project Name:     Power_Display

* Program Name:     PowDly

* Author:           Tao Shan Biao 

* Copyright:        Tao Shan Biao 

* CPU:              ht46r064

* Virsion:          1.0

* Project           Start Time: 2011-07-24

* Modify Comment:   Non

=======================================*/


#include "HT46R064.h"


#define S1                  _pb5

#define S2                  _pa6

#define S3                  _pb4

#define DCUP                _pa1

#define ExtPowConnect       _pa3

#define iPadConnect         _pa2


#define Open_AN0            _adcr = 0x20

#define Open_AN1            _adcr = 0x21

#define Open_AN2            _adcr = 0x22

#define Open_AN3            _adcr = 0x23


#define UseTimerPoll        1                       //1:使用定时器轮询  0:使用变量查询轮询


#define P_count0Value       0x0F51 

#define P_count1Value       0xFF 

#define P_count2Value       0x12 

#define halt_count0Value    0x4000

#define halt_count1Value    0x05

#define charge_count0Value  0           

#define charge_count1Value  0



#define LowPowS_Mode        _adonb = 1; _halt()     //低功耗模式

#define Nor_Mode            _adonb = 0              //正常模式


#define Full_Pow            0x0FF0                  //>4.2V 满电

#define Nor_Pow             0x0D05                  //>3.6V 正常

#define Low_Pow             0x0D05                  //<3.6V 严重缺电


unsigned char P_count0;

unsigned char P_count1;

unsigned char P_count2;


unsigned int  halt_count0;

unsigned char halt_count1;


unsigned char LED_DisplayBuffer;

unsigned char Pow_grade;

unsigned char charge_count1;

unsigned char charge_count2;


unsigned int  AD_Temp;

unsigned int  AD_result0;

unsigned int  AD_result1;


unsigned char Temp0;

//-------------------------------------------------------------------------

#pragma vector INT @    0x04     //外部中断

#pragma vector Timer @  0x08     //定时/计数器0溢出中断

#pragma vector ADIT @   0x0c     //A/D转换完成中断

#pragma vector OverF @  0x10    //时基溢出中断


void INT()

{

    

}

void Timer()

{

    if(++P_count0 > 30) {P_count0 = 0; P_count1++;}

}

void ADIT(){}

void OverF(){}   

//-------------------------------------------------------------------------


void init_MCU(void)

{   

    _ctrl1 = 0xCA;      //INT外部中断触发方式:双边沿,时基最小,WDT关闭

    _wdts = 0x07;       //设置定时器最大周期

    _clkmod = 0;        //振荡器低功耗模

    _qosc = 1;          //使用HIRC作为系统时

    _pbc = 0;           //设置B端口为输

    _pac = 0xBF;        //设置除PA6为输出的其他A端口为输

    _papu = 0xBF;       //设置除PA6端口其他A端口若上

    _pawk = 0x1C;       //设置PA.4,3,2为下降沿唤

   

    Open_AN0;           //设置PA.0为AD通

    _acsr = 0x01;       //开启AD模块电源,选择AD时钟源为系统时

    _start = 0;         //启动AD

    _start = 1;

    _start = 0;

//----------------------------------------------------------------------    

#if UseTimerPoll        //使用了定时器作为轮询

    _tmr0c = 0x97;    

    _intc0 = 0x07;      //定时器,外部中断使能 

#else                   //

    _intc0 = 0x03;      //外部中断使能 

#endif

}

//----------------------------------------------------------------------

void init_Device(void)

{

    S1 = 0;

    S2 = 1;

    DCUP = 1;

    S3 = 1;

    

    

    Pow_grade = 0;

    charge_count1 = 0;

    charge_count2 = 0;

    

    halt_count0 = 0;

    halt_count1 = 0;

        

    LED_DisplayBuffer = 0;   

}



void Updata_Powgrade(void)

{

    AD_result0 = 0;

    Open_AN0;

    _acsr = 0x01;       //开启AD模块电源,选择AD时钟源为系统时

    _start = 0;

    _start = 1;

    while(_eocb);

    AD_result0 = (unsigned int)_adrh*0x10 + (unsigned int)_adrl/0x10;

    Pow_grade = (char)(AD_result0 / 0x0333);

    _adcr = 0;     

}


void ExtPow_Detect(void)

{

    unsigned char i = 5;

    AD_result1 = 0;

    Open_AN3;

    _acsr = 0x01;       //开启AD模块电源,选择AD时钟源为系统时

    _start = 0;

    _start = 1;

    while(_eocb);

    AD_result1 = (unsigned int)_adrh*0x10 + (unsigned int)_adrl/0x10;

    Pow_grade = (char)(AD_result1 / 0x0333);

    _adcr = 0; 

}

    

void Updata_ledbuff(void)

{

    LED_DisplayBuffer = 0xFF << Pow_grade;   

}

 

void warn_Display(void)

{


}


void Pow_Display(void)

{

    Updata_ledbuff();

    _pb = (LED_DisplayBuffer & 0x0F) | (_pb & 0xF0);;

}


void charge_Display(void)

{

    if(charge_count1 >= (5 - Pow_grade))

    {

        charge_count1 = 0;

        Updata_ledbuff();

    }

    else

    {

        LED_DisplayBuffer <<= 1;   

        charge_count1++;

    }

    _pb = (LED_DisplayBuffer & 0x0F) | (_pb & 0xF0);; 

}

//----------------------------------------------------------------------

#if UseTimerPoll                //使用了定时器作为轮询

void poll_count(void)

{

    if(P_count1 > 2)        

    {

        if(P_count2 > 18)

        {

            if(!S2){S2 = 1; Temp0 = 1;}    //如果在充电,关闭充电一段时间再开启AD

        }

        if(P_count2 > 20)

        {

            P_count2 = 0;

            Updata_Powgrade();

            if(Temp0){S2 = 0;}      //如果在充电,在AD转化过后开启充电

        }


        if(S2)

        {

            Pow_Display();        //显示电量

        }

        else

        {

            charge_Display();     //显示充电

        }

        P_count1 = 0;

        P_count2++;

    }    

}

#else

void poll_count(void)

{

    if(P_count0 > P_count0Value)

    {

        if(P_count1 > P_count1Value)

        {

            if(P_count2 > P_count2Value-3)

            {

                if(!S2) {S2 = 1; Temp0 = 1;}    //如果在充电,关闭充电一段时间再开启AD

            }        

            if(P_count2 > P_count2Value)

            {

                P_count2 = 0;

                Updata_Powgrade();

                if(Temp0){S2 = 0;}   //如果在充电,在AD转化过后开启充电

            }

            P_count1 = 0; 

            P_count2++;

            

            if(S2)

            {

                Pow_Display();        //显示电量

            }

            else

            {

                charge_Display();     //显示充电

            }       

        }   

        P_count0 = 0; 

        P_count1++;

    }    

    P_count0++;   

}

#endif

//----------------------------------------------------------------------

void Core_proc(void)

{

    ExtPow_Detect();        //获得AD_result1值

    if(AD_result1 > 0x0FFF)

    {

        if(iPadConnect)

        {

            S1 = 0;      //给电池充电

            S2 = 1;

            DCUP = 0;    //此地是开还是不开?

            S3 = 1;

        }

        else

        {

            S2 = 1;      //连入外部电源

            DCUP = 1;

            S3 = 1;

            S1 = 1;

        }

        halt_count0 = 0;

        halt_count1 = 0;      

    }

    else

    {

        if(iPadConnect)

        {


            if(halt_count0 > halt_count0Value)

            {

                halt_count0 = 0;

                if(halt_count1 > halt_count1Value)      

                {

                    halt_count1 = 0;

                    LowPowS_Mode;   //休眠

                    Nor_Mode;

                }

                halt_count1++;            

            }


            halt_count0++;

        }

        else

        {

            if(AD_result0 > Nor_Pow)

            {

                S1 = 0;      //用电池供电

                S2 = 1;

                DCUP = 1;

                S3 = 0;

            }

            else

            {

                //显示缺电警告

            }

            halt_count0 = 0;

            halt_count1 = 0;

        }

   }

}

//-------------------------------------------------------------------------

void main()

{

    init_MCU();

    init_Device();

    do

    {

        poll_count();

        Core_proc();

    }

    while(1);

}

发现程序进入不了
poll_count()函数

0
回复