2

これは私が理解しようとしているものです.MC9S08AW60を持っています. 2 つのタイマーがあり、タイマーからの目盛りを設定または確認しようとしています。つまり、オーバーフロー フラグがいつ変更されるかを確認したいだけです。コードの基本設計は次のとおりです。

PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0    0x01
#define mLED1    0x02
#define mLED2    0x04
#define mLED3    0x08
#define mLED4    0x10
#define mLED5    0x20
#define mLED6    0x40
#define mLED7    0x80



void main()
{

  While(j>0){

  ch_nbr++;
  if (ch_nbr == 8)  ch_nbr = 0;
  if (ch_nbr == 0)  PTFD = mLED0;  // Turn LED0 on, other LEDs off
  if (ch_nbr == 1)  PTFD = mLED1;  // Turn LED1 on, other LEDs off
  if (ch_nbr == 2)  PTFD = mLED2;  // Turn LED2 on, other LEDs off
  if (ch_nbr == 3)  PTFD = mLED3;  // Turn LED3 on, other LEDs off
  if (ch_nbr == 4)  PTFD = mLED4;  // Turn LED4 on, other LEDs off
  if (ch_nbr == 5)  PTFD = mLED5;  // Turn LED5 on, other LEDs off
  if (ch_nbr == 6)  PTFD = mLED6;  // Turn LED6 on, other LEDs off
  if (ch_nbr == 7)  PTFD = mLED7;  // Turn LED7 on, other LEDs off
  Mydelay();
   }
   } 
 void Mydelay(int *j)
{

 if (TPM1SC_TOF == 0) j=0;
 else j=1;
 return j;
 }

アイデアは、値「j」をチェックし、同時に LED が点灯するかどうかを決定することです! このコードは機能しません。C プログラミングを使用してからしばらく経ちました。私は少し不安定で、助けが必要です。きちんとした説明がいいでしょう。MCU のデータシートについては、次のリンクを検討してください: http://cache.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08AW60.pdf

既存の Mydelay の代わりに次の関数を置き換えることはできますか:

int Mydelay(int& j)
{
 if(TPM1SC_TOF == 0) j=0;
 else j=1;
 return j;
}
void main()
{
  PTFDD = 0xFF;
int j,ch_nbr;
// LED mask values:
#define mLED0    0x01
#define mLED1    0x02
#define mLED2    0x04
#define mLED3    0x08
#define mLED4    0x10
#define mLED5    0x20
#define mLED6    0x40
#define mLED7    0x80   
  While(j==1)
 {
  ch_nbr++;
  if (ch_nbr == 8)  ch_nbr = 0;
  if (ch_nbr == 0)  PTFD = mLED0;  // Turn LED0 on, other LEDs off
  if (ch_nbr == 1)  PTFD = mLED1;  // Turn LED1 on, other LEDs off
  if (ch_nbr == 2)  PTFD = mLED2;  // Turn LED2 on, other LEDs off
  if (ch_nbr == 3)  PTFD = mLED3;  // Turn LED3 on, other LEDs off
  if (ch_nbr == 4)  PTFD = mLED4;  // Turn LED4 on, other LEDs off
  if (ch_nbr == 5)  PTFD = mLED5;  // Turn LED5 on, other LEDs off
  if (ch_nbr == 6)  PTFD = mLED6;  // Turn LED6 on, other LEDs off
  if (ch_nbr == 7)  PTFD = mLED7;  // Turn LED7 on, other LEDs off
 }
 Mydelay();
} 
4

3 に答える 3

3

まず第一に、コードを大幅に単純化するためにビット シフトを使用することをお勧めします (ビット シフトを本質的に行っているためです)。

つまり、位置ごとに 8 つの定数を使用する必要はなく、単純に<<演算子を使用して、反復ごとにビットを 1 位置左に移動します。

int MoveToLeft(int bitPosition)
{
    // shift left
    bitPosition = bitPosition << 1;

    // reset to '1' when we shift through all 8 bits
    if ((bitPosition & 0xFF) == 0)
        bitPosition = 1;

    return bitPosition;
}

次に、タイマー値をポーリングするよりも良い方法は、割り込みルーチンを使用することです。タイマーがカウントを終了するたびに自動的に呼び出される関数をセットアップする必要があります。

あなたのコードがこのように機能するかどうかはわかりません。タイマーの目的は、LED の変化の間に遅延を作成することですか? タイマーは自動的にリセットされますか? タイマーが遷移前に待機するだけの場合、次のようなことはより論理的です。

while (1) // repeat indefinitely
{
     // shift the bit
     ch_nbr = MoveLeft(ch_nbr);
     PTFD = ch_nbr;

     // while the timer is counting, do nothing
     while (TPM1_TOF == 0) 
     { }

     // reset the timer
     (not sure about this part, check your docs)
}
于 2012-12-19T20:39:07.150 に答える
1

これがコードのカットペーストである場合は、修正する必要があることがいくつかあります。

  • この1行目:While(j>0){jがどこにも宣言または定義されていません。コンパイラはそのエラーを生成するWhile必要があり、小文字である必要がありますwhile ( j > 0 )

  • と同じch_nbrです。

  • あなたが電話をするとき、MyDelay()あなたはそれを取るためにそれを書きました、&intそしてあなたはおそらくそれを意味しまし(int *j)た、そしてあなたはそれを何も渡しませんでした。

  • If小文字にする必要がありますif

  • はい、コメントに示されているように、3つの開き角かっこ{と5つの閉じかっこがあります}

それらを修正し、今すぐコンパイルすることを確認してから、ロジックに取り組みます。

于 2012-12-19T18:32:29.933 に答える
0
  1. 開き角かっこよりも閉じかっこが多くあります。角かっこを一致させてこれを修正してみてください(インデントが役立ちます)。

  2. j変数などを宣言していませんcn_nbr が、使用しています。

  3. Cステートメントは小文字(whileではなくWhile)です。

  4. Mydelay()パラメータが必要な場合は、パラメータなしで呼び出しMydelay(int &j)ています。また、&j変数のアドレスを返しますj。ここが欲しいと思いますint *j。ポインタについてもっと読む。

  5. の代わりにswitchまたはを使用します。コードは両方の方法で機能しますが、switchを使用するか、それ以外の場合は高速です。if ... else ifif ... if ... if ...

ここでCプログラミングの詳細を学ぶことを検討してください:http ://www.cprogramming.com/

于 2012-12-19T18:35:06.313 に答える