工程师在调试程序时,有时为了观看个别RAM的数据内容,往往会让IDE停止运行。因为应广单片机的集成开发环境,FPPA IDE 不支持实时显示RAM观察窗口的内容,必须要要IDE停止运行时,才能看到RAM的具体内容。如果你想在程序运行的情况下,观察RAM的内容,那么".printf"这个调试指令,就可以帮到你。

我试了两条,其他的各位自己去尝试:

.printf("ad_result_mv = %d",ad_result_mv);

以上表示输出字符串ad_result_mv = 变量ad_result_mv的值;

.printf("\n")

表示输出换行符。

以下是一个应用实例,利用应广单片机的内部1.2V来发推VDD的。通过该实例,我们可以明显看到随着VDD电压越高,利用内部1.2V反推VDD的算法的测量误差也越大,当在5V左右,测量误差不多快到100毫伏了,而在4.2V左右,误差可能在80毫伏左右。

以下是实际参考程序:

#include"extern.h"

.ramadr      0

word         t16_cnt          ;

.ramadr      system

byte myflag;

bit  f_adc_en: myflag.0;

byte  ad_result;

byte  cnt;

byte  int_cnt;

word  ad_value;

word  i_gword;

word  ad_result_mv;

EWORDdiv_src3;

WORDdiv_val2, div_res2;

voidEWord_Div_Word (void)

{//div_src3[E] / div_val2[W]=div_src3[E] * div_val2[W] + div_res2[W]

BYTEdiv_cnt, div_tmp;

div_cnt=8;

div_res2=0;

do

{

div_src3<<=1;

div_res2<<<=1;

div_tmp<<<=1;

div_cnt++;

A=(div_res2 - div_val2) >> 8;

if (div_tmp.0 || ! CF)

{

div_res2$1=A;

div_res2$0-=div_val2$0;

div_src3.0=1;

}

} while (! div_cnt.5);

}

voidGet_16_AD (void)

{

word ad_temp;

word ad16;

//byte cnt;

AD_Start=1;//Skip first ADC, can delete by your select

while(!AD_DONE)

{

nop;

}//

   ad16=0;

 cnt=16;

do

{

  AD_Start=1;//Skip first ADC, can delete by your select

  while(!AD_DONE)

  {

  nop;

   }// 

//    get_middle_adc_from_3();

ad16    += adcr;

.wdreset; 

} while (--cnt);

a=ad16 >> 4;// >> 4;

}

void    t16_init(void)

{

        word   t16_index;

        $ T16M  IHRC,/16,BIT15;

        i_gword = 32768 - 20000;

        stt16  i_gword;  

        

}

void    ad_init(void)

{

       // $ padier  0x00;

       //  $ pbdier  0x00;

       $ ADCM /2;

       $ ADCC Enable, BANDGAP;//bandgap作为AD输入

       $ ADCRGC VDD; //VDD做参考电压

   // adc_en_cnt = 0;

    f_adc_en   = 0;       

}

voidFPPA0 (void)

{

.ADJUST_ICSYSCLK=IHRC/4//SYSCLK=IHRC/4

//Insert Initial Code

inten = 0x04; 

//-----RAM 清零-注意t16_cnt必须在RAM 0地址-----------

t16_cnt = _SYS(RAM_SIZE)-1;

a = 0;

do{

*t16_cnt = 0;

 t16_cnt--;

}while(t16_cnt);

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

ad_init();

t16_init();  

engint; 

    cnt = 0;

    ad_value = 1234;

while (1)

{

   if(f_adc_en == 1)

   {

   f_adc_en = 0;

   Get_16_AD();

   ad_result = a;

   div_src3 = 0x04ab50;

   div_val2$1 = 0;

   div_val2$0 = ad_result;

   EWord_Div_Word();

   ad_result_mv$0 = div_src3$0;

   ad_result_mv$1 = div_src3$1;

         .printf("ad_result_mv = %d",ad_result_mv);

         .printf("\n"); 

         .printf("ad_result_mv = %x",ad_result_mv);  

         .printf("\n"); 

   }

//...

//wdreset;

}

}

voidInterrupt (void)

{

pushaf;

if (Intrq.T16)

{//T16 Trig

//User can add code

Intrq.T16=0;

stt16  i_gword;

if(int_cnt < 20) //控制显示速度

{

int_cnt++;

}

else

{

f_adc_en = 1;

int_cnt = 0;

}

//...

}

popaf;

}