0

この質問が電子機器に行くべきかどうかはわかりませんが、プログラミングに関するものなので、ここで質問しました。

7セグメントディスプレイの代わりにシフトレジスターから電力を供給されるLEDを使用してデジタル時計を作成しています。とにかく、 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);
   }
}

私がこの主題の初心者であることに関して、誰かがこの問題について私を助けてくれますか?

4

2 に答える 2

0

プラグマ/コンパイラ/リンカー設定は、XXk サイズの ROM/EEPROM 用にビルドしていることを示しているようですが、プログラムには XXk サイズを超えるデバイスが必要です。ターゲット デバイスのサイズを設定する構成および/またはヘッダー ファイルの設定を探します。

于 2012-03-11T19:16:04.530 に答える
0

このコードの機能についてあなたが何を考えているかはよくわかりませんが、エラーはおそらく記載されているとおりです (ROM 不足、A セグメントまたはプログラムが大きすぎます)。

「output_high」を使用すると、プログラム メモリが使用されます。つまり、これらすべての「output_high() および output_low()」が非常に多くのスペースを占有します。PIC12F628 には 2048 ワードのプログラム メモリしかありません。

ポート全体の値を 16 進数で入力する場合は、'output_x ()' を使用してポート全体に直接書き込んでみてください。

たとえば、次のように書き込みます。

  1. output_high(PIN_A0)
  2. output_low(PIN_A1)
  3. output_low(PIN_A2)
  4. output_low(PIN_A3)
  5. output_low(PIN_A4)
  6. output_low(PIN_A5)
  7. output_high(PIN_A6)
  8. output_high(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

ただし、それらをマージするときは、16 進数を追加する方法を学ぶ必要があります。

ゲートのすべてのピンを 2 進数で見る

 **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. B 11 0000 1011
  13. C 12 0000 1100
  14. D 13 0000 1101
  15. E 14 0000 1110
  16. F 15 0000 1111

例 1。

  1. output_high(PIN_A0)
  2. output_high(PIN_A1)
  3. output_high(PIN_A2)
  4. output_low(PIN_A3)
  5. output_low(PIN_A4)
  6. output_low(PIN_A5)
  7. output_low(PIN_A6)
  8. output_low(PIN_A7)

「output_a(0x07)」と書いたほうがいいです。

例 2。

  1. output_high(PIN_A0)
  2. output_low(PIN_A1)
  3. output_low(PIN_A2)
  4. output_high(PIN_A3)
  5. output_low(PIN_A4)
  6. output_low(PIN_A5)
  7. output_low(PIN_A6)
  8. output_high(PIN_A7)

PIN_A3 と PIN_A0 を使用して PIN_A7 を追加します: 128+8+1=137 hex(0x89) bin(10001001)。

プログラムメモリを節約するためのプログラムの書き方を知るには、これで十分だと思います。

よろしく // Tommy Hjertezén

于 2021-03-10T16:42:42.820 に答える