2012-12-19 128 views
2

這是我想弄明白,我有一個MC9S08AW60。它有兩個計時器,我正在嘗試配置,或者只是檢查計時器中的時鐘,也就是說,我只想檢查溢出標誌何時更改。該代碼的基本設計是:循環和微控制器

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(); 
} 
+2

我注意到的第一件事是您有3個開頭括號和5個右括號。 – Foggzie

+1

這是編譯?您可以不帶參數調用MyDelay。 MyDelay功能不會有任何延遲。 j的定義在哪裏?如何調用LED_poll?你需要處理這個問題...... –

+0

什麼是溢出標誌? –

回答

3

首先,你可能想使用bit shifting來顯著簡化代碼(因爲這是你基本上是做什麼的,移位位)。

這意味着你不需要有8個常數每個位置,但只需使用<<運營商位一個位置移動到左側,在每次迭代:

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; 
} 

接下來,比更好的辦法輪詢定時器值是使用interrupt routines。您需要設置一個函數,只要您的計時器計數完成,該函數就會自動調用。

我不確定你的代碼是否可以像這樣工作。您的計時器的目的是在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) 
} 
+0

感謝您的完美回覆。至於位移,我會牢記這一點。是的,根據數據表,定時器重置自身。所以我需要檢查的是在0xFF到0x00之間切換時標誌開/關的時候。如果您查看數據表第170頁,TOF部分。 – sheetansh

1

好吧,如果這是你的代碼的複製粘貼你已經得到了一些東西來解決:

  • 1日這一行:While(j>0){我沒有看到Ĵ聲明或任何定義。編譯器應該已經生成了一個錯誤,並且While應該是小寫while (j > 0)

  • ch_nbr相同。

  • 當你撥打MyDelay()時,你寫了一個&int,你可能意思是(int *j),那麼你沒有通過任何東西。

  • If必須是小寫if

  • 是的,作爲評論表明你有3個開括號{和5日收盤那些}

修復這些,確保它現在編譯,然後解決任何邏輯。

+0

我已經做了必要的更改! – sheetansh

+0

太棒了!它現在按預期工作嗎?或者需要更多更改? –

0
  1. 您有更多的右括號。嘗試通過匹配括號來糾正這種情況(縮進將有所幫助)。

  2. 您沒有在任何地方聲明變量jcn_nbr,但是您使用它們。

  3. C語句是小寫字母(while,而不是While)。

  4. Mydelay(int &j)期望一個參數時,您正在調用Mydelay()而不帶參數。另外,&j返回變量j的地址。我想你想在這裏int *j。閱讀更多關於指針的信息。

  5. 使用switchif ... else if而不是if ... if ... if ...。你的代碼可以兩種方式工作,但是使用開關或者其他的更快。

考慮學習更多關於C編程的位置:http://www.cprogramming.com/