[英]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 ()”直接寫入整個端口,您可以在其中以十六進制輸入整個端口的值。
例如,您將寫信給
那么最好寫'output_a(0xC1)。 發生的事情完全相同,但您使用的程序內存更少。
引腳分開有
但是當你合並它們時,你必須學習如何添加十六進制。
將門的所有引腳視為二進制數
**Hex: Dec Bin:**
示例 1。
最好寫'output_a(0x07)。
示例 2。
將 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.