CCS PIC16F628A出ROM,段或程序太大

时间:2012-03-11 19:01:11

标签: c compiler-errors microcontroller electronics rom

我不确定这个问题是否应该用于电子产品,但由于它是关于编程的,我在这里问过它。

我正在使用由移位寄存器供电的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);
   }
}

有人可以帮助我解决这个问题,因为我是这个主题的新手吗?

提前致谢。

没关系,http://www.ccsinfo.com/forum/viewtopic.php?p=159335

2 个答案:

答案 0 :(得分:0)

您的编译指示/编译器/链接器设置似乎表明您正在为XXk大小的ROM / EEPROM构建,但您的程序需要一个设备&gt; XXk尺寸。查找用于设置目标设备大小的配置和/或头文件设置。

答案 1 :(得分:0)

我不太确定您对使用此代码的函数有何看法,但错误可能完全如其所述(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. A 10 0000 1010
  12. B 11 0000 1011
  13. C 12 0000 1100
  14. 电话 13 0000 1101
  15. E 14 0000 1110
  16. F 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)。

我认为这应该足以让您知道如何编写程序以节省程序内存。

最好的问候 // 汤米 Hjertezén