请各位大侠帮我看看我这段程序是否有语法错!

时间:2022-09-21 20:24:47
请各位大侠帮我看看下面这一程序段语法有错吗?我用KEIL C51编译通过后烧到EEPROM中后运行结果和我想要的结果有点两样,可就是找不到原因。

这个程序段的功能是检查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语句将调试信息回送上位机。

#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}}。
其实,用仿真器一调试不就行了吗?

#1


光是这么看程序是很难找到有什么毛病的,有两种方法可以用用:
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}}。
其实,用仿真器一调试不就行了吗?