ループとマイクロコントローラ



これは私が理解しようとしているものです.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();
}

sheetanshによる質問

答え:


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


つまり、位置ごとに 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)
}