標題: Error [1250]could not find space (2 bytes) for variable _SEC pic單片機編譯問題 [打印本頁]

作者: hym8085hym    時間: 2022-6-30 23:43
標題: Error [1250]could not find space (2 bytes) for variable _SEC pic單片機編譯問題
我是新手,提問的帖不夠全面,現(xiàn)在完整發(fā)出來,請問一下高手

出錯提示如下:
Error   [1250] E:\thermometer\PIC\thermometer.c; 72. could not find space (2 bytes) for variable _SEC

unsigned int SEC;這樣定義編譯會通過,這樣的話比較的數(shù)是不是少于255;理論上是不會的。是不是我哪兒設置不對?

單片機源程序如下:
#include <pic.h>
//#include "thermometer.h"
unsigned char volatile ADCY_COUNT @ 0X25;
unsigned char volatile DIP0 @ 0X26;
unsigned char volatile DIP1 @ 0X27;
unsigned char volatile WEI @ 0X30;
unsigned char sbstatus @ 0x23;
bit volatile ADCY@((unsigned)&sbstatus*8+0;

unsigned char LED @ 0x21;
bit volatile LEDdp@((unsigned)&LED*8+0;
bit volatile LEDg@((unsigned)&LED*8+1;
bit volatile LEDf@((unsigned)&LED*8+2;
bit volatile LEDe@((unsigned)&LED*8+3;
bit volatile LEDd@((unsigned)&LED*8+4;
bit volatile LEDc@((unsigned)&LED*8+5;
bit volatile LEDb@((unsigned)&LED*8+6;
bit volatile LEDa@((unsigned)&LED*8+7;

#define XLEDa  RC0
#define XLEDb  RC1
#define XLEDc  RC5
#define XLEDd  RC4
#define XLEDe  RC3
#define XLEDf  RC2
#define XLEDg  RA5

//unsigned char volatile SEC; //雙字節(jié)
unsigned int SEC;
unsigned char  i;

void DisbytLED(void)
  {
                XLEDa=LEDa;
                XLEDb=LEDb;
             XLEDc=LEDc;
        XLEDd=LEDd;
        XLEDe=LEDe;
        XLEDf=LEDf;
        XLEDg=LEDg;
                //LEDdp=;
  }
void interrupt ISR(void)
{
  if(T0IE&&T0IF==1)
    {   T0IF=0;
     TMR0=TMR0+0X03;
     OPTION_REG=0X01;
     LED=0X00;
      DisbytLED();      
      if(WEI==0X00)
      {
         RA0=1;
         RA1=0;
         LED=DIP0;
         WEI=0X01;
      }
      else
      {
         RA1=1;
         RA0=0;
         LED=DIP1;
         WEI=0X00;
      }  

    DisbytLED();
    SEC=SEC+1;
    if(SEC==500)   
        ADCY=1;
    SEC=0;   
    }
  }


void cydelay()   //采樣時間延時程序
{
  for (i=255;i>0;i--)
    {
     asm("nop");
     asm("nop");
     asm("nop");
     asm("nop");
    }

}

void initial()    //初始化程序
{
  INTCON=0X00;
  TRISA=0X0C;
  ANSEL=0X04;
  //TRISB=0X00;
  TRISC=0X00;
//TRISD=0X00;
OPTION_REG=0X01;
  ADCON1=0X04;
  ADCON0=0X00;
  CMCON=0x07;
  INTCON=0XA0;
}
/*主程序*/
main()
{
WEI=0X00;
ADCY=0;
initial();//調用初始化端口程序


for(;;)
{
   asm("clrwdt");//清除看門狗
  // DIP0=0X11;
   //DIP1=0XFF;
    SEC=SEC+1;
   if(SEC>=500)
    ADCY=1;
}
}
// LLED=0XFF;
// LLED1=0;
  //LOLED=0XFF;



作者: datouyuan    時間: 2022-7-1 09:36
這代碼太多問題了。
1.不要大量使用volatile 絕對定位變量。
2.能用自動變量就不要用全局變量。
3.中斷服務中使用函數(shù)。
4.多處代碼邏輯混亂。
5.picc的特有語法使用錯誤。你這代碼功能我猜測是2位數(shù)碼管顯示,只需要標準C語言就能完成,完全不需要用到picc的特有語法。雖然你沒定義幾個變量,因語法出錯,編譯提示定義的變量超出了極限。

樓主應要花幾天學習下C語言基礎。

作者: hym8085hym    時間: 2022-7-1 18:45
datouyuan 發(fā)表于 2022-7-1 09:36
這代碼太多問題了。
1.不要大量使用volatile 絕對定位變量。
2.能用自動變量就不要用全局變量。

中斷里面的程序是1ms刷新一次,顯示需要刷新,2位數(shù)碼管的程序是一樣的,不過可以調整;我奇怪的是:判別秒SEC大于500秒,意味著需要用2個字節(jié),理論上需要定義int,但是編譯會出錯,如果定義一個字節(jié)char就能正常編譯通過。我的意思是PICC的編譯器是不是不能直接比較大的數(shù)據(jù),如2個字節(jié)的數(shù)據(jù)。
作者: 17337161031    時間: 2022-7-1 19:26
先找到錯誤什么意思,然后去對應的地方修改
作者: datouyuan    時間: 2022-7-2 09:25
hym8085hym 發(fā)表于 2022-7-1 18:45
中斷里面的程序是1ms刷新一次,顯示需要刷新,2位數(shù)碼管的程序是一樣的,不過可以調整;我奇怪的是:判別 ...

假設你的mcu共有40byte RAM。由于你代碼這么多問題,使得還沒定義SEC,RAM就用掉了39byte。
所以定義一個字節(jié)(char)就能正常編譯通過,定義l兩個字節(jié)(short)就不能編譯通過。
你按我提到的幾點要求稍微改下,就不會出現(xiàn)你奇怪的現(xiàn)象。

再強調下,編譯器一般不會有問題,該懷疑的是自己的代碼,自己解決相關問題的思路。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1