2017-06-21 36 views
0

錯誤的值我有一個頭文件的AVR32程序下面的代碼我寫:被零除警告導致在常量計算

#define PULSE_FREQ 150 
#define TC_FREQ (60000000/8)     
#define PULSE_PER (1/PULSE_FREQ) 
#define TC_PER (1/TC_FREQ) 
#define TTC ((PULSE_PER/TC_PER) - 1) 

我們的目標是能夠產生的頻率和計算由該式給出的恆定計時器計數值:

Target Count = ((1/Target Frequency)/(1/Timer Frequency)) - 1 

例如,對於150Hz的的計時器頻率,需要的49999的計時器計數值。當爲定時器手動輸入該值時,它工作並給出150Hz的頻率。但是,使用上面的代碼時,我得到57Hz的頻率。

我也得到關於一個除零的警告,常數中的數字是否可以如此之小以至於它們被切除爲零?

在運行時而不是#define宏上運行會更好嗎?

+2

你正在進行整數除法,數字結尾在0和1之間(如'(1/PULSE_FREQ)'),所以整數除法將它們視爲0。 –

+0

宏不是常量! – Olaf

+0

數學等價物'Target_Count =(Timer_Frequency/Target_Frequency) - 1'會更好。 (一些舍入問題依然存在) – chux

回答

1

的整數除法很可能在某個時候返回一個值小於1,而且它被截斷爲0

嘗試通過使常數雙重之一迫使浮點除法:

// The .0 should "infect" the other numbers 
#define PULSE_FREQ 150.0 
#define TC_FREQ (60000000/8)     
#define PULSE_PER (1/PULSE_FREQ) 
#define TC_PER (1/TC_FREQ) 
#define TTC ((PULSE_PER/TC_PER) - 1) 
+1

「小於0」是否意味着小於1? –

+0

@FedericoklezCulloca呃,糾正。謝謝。 – Carcigenicate