这个程序段的功能是检查PCB板上每片芯片里可读写的寄存器。
思路是先依次往所有寄存器里赋一个常数,然后在依次读出寄存器的内容和常数进行比对如果一样送回FLAG 0 。不一样的就送回FLAG 1并把FLAG为1的那个循环号(每个循环就是检查一块芯片,有几个芯片就有几个循环)送给一个ERRO数组。最后判标志位COUNT,如果为0说明正常则点亮一个LED,否则就去读ERRO数组里的值`,把它来赋到一个可复用的点LED灯的涵数。ERRO数组里内容代表相应的灯号。
现在我的问题是我用程序去测试是肯定好的芯片,但是执行结果没有点亮代表正常的LED,而点亮了ERRO LED,我换了好几次PCB都是这问题。
#define LED_NUM 3
#define CHIP_NUM 2
#define PARITY_BIT 0xF0
typedef struct tagaddr
{
Uint16 *addr_pointer;
Uint16 range;
}addr;
typedef struct tagled
{
char light;
}led;
void chip_test(void)
{
Uint8 i,j=0,count=0;
Uint8 erro_num[CHIP_NUM],checkflag=0;
Uint16 edata E_F_address[3]={0xD001,0xD004,0xD006,
};
/* register of MUX_FPGA */
Uint16 edata M_F_address[5]={0xE001,0xE003,
0xE008,0xE012,
0xE018};
addr edata chip_addr[CHIP_NUM]={M_F_address,5};
/*{E_F_address,3}*/
led edata l_s[LED_NUM]={OW_LED,ACO_LED};
/* set LED OFF */
for(i=0;i<LED_NUM;i++)
{
set_LED(l_s[i].light,LED_OFF);
}
/* clean register */
for(i=0;i<CHIP_NUM;i++)
reg_clean(chip_addr[i].addr_pointer,chip_addr[i].range);
/* input parity bit in register*/
for(i=0;i<CHIP_NUM;i++)
reg_input(chip_addr[i].addr_pointer,chip_addr[i].range);
/* check register */
for(i=0;i<CHIP_NUM;i++)
{
checkflag=check_reg(chip_addr[i].addr_pointer,chip_addr[i].range);
if(checkflag==1)
{
erro_num[j]=(i+1);
j++;
count++;
}
}
/* clean register*/
for(i=0;i<CHIP_NUM;i++)
reg_clean(chip_addr[i].addr_pointer,chip_addr[i].range);
/* report status of chip */
/* if the chip is OK , the LI_1-LED will light */
if(count==0) while(1)
{
set_LED(l_s[0].light,LED_ON);
reset_watchdog();
}
/* if error (one light or several light will light:
LI_2_LED: NVRAM
LI_3_LED: MUX_FPGA
LI_4_LED: DEMUX_FPGA
*/
else {
while(1)
{for(i=0;i<count;i++)
set_LED(l_s[erro_num[i]].light,LED_ON);
reset_watchdog();
}
}
} /*end chip_test(),
if the operator want to restore system, please push "reseat button" */
void reg_clean(Uint16 *addr,Uint16 n)
{
Uint16 i;
for(i=0;i<n;i++)
{XBYTE[*addr]=0x00;
addr++;
}
}
void reg_input(Uint16 *addr,Uint16 n)
{
Uint16 i;
for(i=0;i<n;i++)
{XBYTE[*addr]=PARITY_BIT;
addr++;
}
}
Uint8 check_reg(Uint16 *addr,Uint16 n)
{
Uint8 flag=0;
Uint16 i;
for(i=0;i<n;i++)
{
if(XBYTE[*addr]!=PARITY_BIT) flag=1;
addr++;
}
return(flag);
}
7 个解决方案
#1
光是这么看程序是很难找到有什么毛病的,有两种方法可以用用:
1.使用仿真器跟踪调试。
2.在keil c51里面使用printf语句将调试信息回送上位机。
1.使用仿真器跟踪调试。
2.在keil c51里面使用printf语句将调试信息回送上位机。
#2
你先把程序整理干净,在給我看。
#3
怎么这么长
#4
你的这个程序看上去太大了一点,不太好观察.
建议你把它修改一下,以便使其更清晰.
你说呢,如何?
建议你把它修改一下,以便使其更清晰.
你说呢,如何?
#5
没有程序呀????
#6
Uint16 edata E_F_address[3]={0xD001,0xD004,0xD006,〈————","
};
};
#7
addr edata chip_addr[CHIP_NUM]={M_F_address,5};
感觉这一句给结构数组赋值好象有点问题,应该为{{M_F_address,5},{E_F_address,3}}。
其实,用仿真器一调试不就行了吗?
感觉这一句给结构数组赋值好象有点问题,应该为{{M_F_address,5},{E_F_address,3}}。
其实,用仿真器一调试不就行了吗?
#1
光是这么看程序是很难找到有什么毛病的,有两种方法可以用用:
1.使用仿真器跟踪调试。
2.在keil c51里面使用printf语句将调试信息回送上位机。
1.使用仿真器跟踪调试。
2.在keil c51里面使用printf语句将调试信息回送上位机。
#2
你先把程序整理干净,在給我看。
#3
怎么这么长
#4
你的这个程序看上去太大了一点,不太好观察.
建议你把它修改一下,以便使其更清晰.
你说呢,如何?
建议你把它修改一下,以便使其更清晰.
你说呢,如何?
#5
没有程序呀????
#6
Uint16 edata E_F_address[3]={0xD001,0xD004,0xD006,〈————","
};
};
#7
addr edata chip_addr[CHIP_NUM]={M_F_address,5};
感觉这一句给结构数组赋值好象有点问题,应该为{{M_F_address,5},{E_F_address,3}}。
其实,用仿真器一调试不就行了吗?
感觉这一句给结构数组赋值好象有点问题,应该为{{M_F_address,5},{E_F_address,3}}。
其实,用仿真器一调试不就行了吗?