簡體   English   中英

CCS PIC16F628A Out of ROM, A segment or the program is too large

[英]CCS PIC16F628A Out of ROM, A segment or the program is too large

我不確定這個問題是否應該去電子產品,但由於它是關於編程的,我在這里問。

我正在使用由移位寄存器供電的 LED 而不是 7 段顯示器制作數字時鍾。 無論如何,在使用CCS編譯代碼時,出現以下錯誤:

***Error 71 "test.c" Line 195(0,1) Out of ROM, A segment or the program is too large  num
Seg 00004-007FF, 07DC left, need 07EA
Seg 00000-00003, 0000 left, need 07EA

到目前為止,這是我的代碼:

#include <16f628a.h>
#use delay (crystal=32768)

//to display a number on the LEDs using the 74164 shift register accordingly
void num(int rnum, char out, char clk) {
   
//start clear shift register   
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
   output_high(clk);
   output_low(clk);
//end clear shift register
   
   switch(rnum) {
      case 0:
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_low(out);
         
         break;
      case 1:
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
         break;
      case 2:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_low(out);//6
         output_high(clk);
         output_low(clk);
         output_high(out);//5
         output_high(clk);
         output_low(clk);
         output_high(clk);//4
         output_low(clk);
         output_high(clk);//3
         output_low(clk);
         output_low(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
      break;
      case 3:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_high(clk);//6
         output_low(clk);
         output_high(clk);//5
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_low(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);//1
         output_high(clk);
         output_low(clk);
         output_low(out);
         output_high(clk);
         output_low(clk);
      break;
      case 4:
         output_high(out);//7
         output_high(clk);
         output_low(clk);
         output_high(out);//6
         output_high(clk);
         output_low(clk);
         output_low(out);//5
         output_high(clk);
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_high(out);//2
         output_high(clk);
         output_low(clk);
         output_low(out);//1
         output_high(clk);
         output_low(clk);
         output_high(clk);
         output_low(clk);
      break;
      case 5:
         output_low(out);//7
         output_high(clk);
         output_low(clk);
         output_high(out);//6
         output_high(clk);
         output_low(clk);
         output_high(out);//5
         output_high(clk);
         output_low(clk);
         output_low(out);//4
         output_high(clk);
         output_low(clk);
         output_high(out);//3
         output_high(clk);
         output_low(clk);
         output_high(out);//2
         output_high(clk);
         output_low(clk);
         output_high(out);//1
         output_high(clk);
         output_low(clk);
         output_low(out);//reset
         output_high(clk);
         output_low(clk);
      break;
   }
}

//==============================


void main() {
   while(true) {
      num(0, pin_a1, pin_a0);
      delay_ms(2000);
      num(1, pin_a1, pin_a0);
      delay_ms(2000);
      num(2, pin_a1, pin_a0);
      delay_ms(2000);
      num(3, pin_a1, pin_a0);
      delay_ms(2000);
      num(4, pin_a1, pin_a0);
      delay_ms(2000);
      num(5, pin_a1, pin_a0);
      delay_ms(2000);
   }
}

有人可以幫我解決這個問題,因為我是這個主題的新手嗎?

我不太確定您對使用此代碼的函數有何看法,但錯誤可能完全如其所述(超出 ROM、A 段或程序太大)。

當您使用“output_high”時,會使用程序內存,這意味着所有這些“output_high() 和output_low()”占用了太多空間。 PIC12F628 只有 2048 字的程序存儲器。

嘗試使用“output_x ()”直接寫入整個端口,您可以在其中以十六進制輸入整個端口的值。

例如,您將寫信給

  1. 輸出高(PIN_A0)
  2. 輸出低(PIN_A1)
  3. 輸出低(PIN_A2)
  4. 輸出低(PIN_A3)
  5. 輸出低(PIN_A4)
  6. 輸出低(PIN_A5)
  7. 輸出高(PIN_A6)
  8. 輸出高(PIN_A7)

那么最好寫'output_a(0xC1)。 發生的事情完全相同,但您使用的程序內存更少。

引腳分開有

  1. PIN_A0 (0x01) // 1
  2. PIN_A1 (0x02) // 2
  3. PIN_A2 (0x04) // 4
  4. PIN_A3 (0x08) // 8
  5. PIN_A4 (0x10) // 16
  6. PIN_A5 (0x20) // 32
  7. PIN_A6 (0x40) // 64
  8. PIN_A7 (0x80) // 128

但是當你合並它們時,你必須學習如何添加十六進制。

將門的所有引腳視為二進制數

 **Hex: Dec   Bin:**
  1. 0 0 0000 0000
  2. 1 1 0000 0001
  3. 2 2 0000 0010
  4. 3 3 0000 0011
  5. 4 4 0000 0100
  6. 5 5 0000 0101
  7. 6 6 0000 0110
  8. 7 7 0000 0111
  9. 8 8 0000 1000
  10. 9 9 0000 1001
  11. 10 0000 1010
  12. 乙 11 0000 1011
  13. C 12 0000 1100
  14. D 13 0000 1101
  15. E 14 0000 1110
  16. 傳真 15 0000 1111

示例 1。

  1. 輸出高(PIN_A0)
  2. 輸出高(PIN_A1)
  3. 輸出高(PIN_A2)
  4. 輸出低(PIN_A3)
  5. 輸出低(PIN_A4)
  6. 輸出低(PIN_A5)
  7. 輸出低(PIN_A6)
  8. 輸出低(PIN_A7)

最好寫'output_a(0x07)。

示例 2。

  1. 輸出高(PIN_A0)
  2. 輸出低(PIN_A1)
  3. 輸出低(PIN_A2)
  4. 輸出高(PIN_A3)
  5. 輸出低(PIN_A4)
  6. 輸出低(PIN_A5)
  7. 輸出低(PIN_A6)
  8. 輸出高(PIN_A7)

將 PIN_A7 與 PIN_A3 和 PIN_A0 添加:128+8+1=137 hex(0x89) bin(10001001)。

我認為這應該足以讓您知道如何編寫程序以節省程序內存。

最好的問候 // Tommy Hjertezén

您的編譯指示/編譯器/鏈接器設置似乎表明您正在構建 XXk 大小的 ROM/EEPROM,但您的程序需要一個大於 XXk 大小的設備。 查找設置目標設備大小的配置和/或頭文件設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM