工程师在调试程序时,有时为了观看个别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;
}