我在使用松翰的MCU。但是以下问题让我郁闷了好多天了。
问题1:如果用最简单的程序,就是程序main里只有while(1){NOP(1);}这样的,也会让看门狗溢出。这是怎么回事呢?试了几个松翰的芯片均如此。
比如这样简单的程序:
#include <SN8P2711A.h>
void main(void){
WDTR = 0x5A;
while(1){
NOP(1);
}
}
一执行,看门狗就溢出,是怎么回事呢?
问题2:关于以下程序的数组v_range[90],如果定义在RAM里(用unsigned int v_range[90]定义), 程序执行结果一切正常。但放到ROM里, 那结果就如main函数的while循环里描叙的那样,执行的时候只能正常AD转换到数组的第29或者30个参数这样,不超过就正常ADC,只要一超过就卡机了。因为问题1的看门狗问题,程序关闭了看门狗。不然会一直重启看门狗。
问题3:把以下程序改成只保留相同的数组放到ROM里,去掉ADC和中断功能。只是简单的从0到89循环数组里的内容输出到相同的Port。程序完全正常执行。所以现在问题不知出在哪里。说是ADC问题,但数组放到RAM里就正常,放ROM就卡死;说是数组问题吧,但是去掉ADC后就算放到ROM里也正常。头痛中。
#include <SN8F27E611.h>
unsigned int adc_buf, i, n;
unsigned int __ROM v_range[90]={
51,54,57,62,69,76,83,89,92,94,
96,97,98,99,101,103,105,107,109,110,
111,112,113,114,115,116,117,118,119,120,
121,122,123,124,125,126,127,128,129,130,
131,132,133,134,135,136,137,138,139,140,
141,142,143,144,145,146,147,148,149,150,
151,152,153,154,155,156,157,158,159,160,
161,162,163,165,167,169,172,177,183,188,
195,202,209,215,221,227,233,239,245,255};
void delay (unsigned int i);
void main(void){
//WDTR = 0x5A;
//////port initialize
P1M = 0xEF; //P1 Input-Output value
P1UR = 0x00; //P1 pull up value
P1CON = 0x10; //P1 Analog-Digital value
//////adc initialize
FGIE = 1;
FADCIEN = 0;
ADM = 0x04; //ADC input channel mode: AIN4
FGCHS = 1; //AIN channel enable
FADCKS1 = 0;
FADCKS0 = 1; //Fcpu/8
FADCIEN = 1; //Interrupt enable
FADCIRQ = 0; //Clear ADC interrupt request flag
VREFH = 0x02; //Internal VREFH: 4.0V
FEVHENB = 0; //Internal VREFH enabled
FADENB = 1; //start adc
delay(30);
i = 0;
FADS = 1;
while(1){
if(adc_buf < v_range[0]){
adc_buf = 0x01;
} else {
for(n=0;n<89;n++){ //这里循环到29就会出现卡死,方法已经试过把数组拆分,分开多组判断循环均无法解决。
if(adc_buf>=v_range[n] && adc_buf<v_range[n+1]){
adc_buf = n+1;
break;
}
}
}
FP10 = adc_buf;
FP11 = adc_buf>>1;
FP12 = adc_buf>>2;
FP13 = adc_buf>>3;
FP15 = adc_buf>>4;
FP16 = adc_buf>>5;
FP17 = adc_buf>>6;
}
}
void __interrupt [0x0E] intrp(void){
if(FADCIRQ){
FADCIRQ=0;
adc_buf = ADB;
FADS = 1;
}
}
void delay (unsigned int i){unsigned int j,k;for (j=i;j>0;j--) {for(k=0;k<10;k++){NOP(1);}}}
以下附上map文件的编译出错地方的信息。
/*** Linking error! The following segment information maybe incorrect! ***/
0XFFFFFFFF 0X0000 Data _Function_intrp_isr_data E:\Sonix\Projects\ADC_INTRP\ADC_INTRP_F27E611\Obj\F27E611.o |
楼主显然是不理解看门狗的使用方法。