[英]Arduino - About Data Types
我正在為要在項目中使用的Arduino編寫延遲功能。 原因是TIMER0(用於Arduino延遲的默認計時器)被PWM控制占用。 延遲功能的測試代碼如下:
int count;
unsigned long int sec;
void delay_ms (uint16_t millisecond) {
sec = ((16000000/12)/1000)*millisecond;
for (count = 0; count < sec; count ++);
}
void setup (){
Serial.begin(9600);
}
void loop (){
Serial.println('a');
delay_ms(1000);
Serial.println('b');
delay_ms(1000);
}
此設置僅打印a和b之間的間隔為1秒。 它工作正常,但是在此之前,我使用了其他設置,這些設置不起作用。 更改為:
基於Arduino參考提供的有關Unsigned Long和Int的知識,我認為在這種情況下它們本質上是相同的。 因此,我想對循環如何處理數據以及延遲函數進行一些說明。
您用arduino-uno
標記了問題,並且您提供給int
的鏈接明確表示Uno上的int
是16位,范圍為-32768到32767:
在Arduino Uno(和其他基於ATmega的主板)上,一個int存儲一個16位(2字節)的值。 這將產生-32,768到32,767的范圍(最小值為-2 ^ 15,最大值為(2 ^ 15)-1)。
現在((16000000/12)/1000)*1000
(對於延遲1000
)是1333333
,這是通過一個限方式 int
(即使是unsigned int
)。 這意味着您的int
變量count
將在循環中溢出 ,並且您將具有未定義的行為 。
實際上,當count
溢出時,它變為負數 (因為Uno對負數使用二進制補碼)。 然后,你數到零和獨到之處數量,直到它再次溢出,導致count < sec
永遠是真實的,給你一個無限循環。
解決方案當然是使用可以處理像您這樣的大數目而沒有問題的類型。 像是unsigned long
。
哦,別再使用全局變量了。 count
和sec
都應位於延遲函數內部。 並停止制作自己的延遲功能,Arduino框架AFAIK應該具有可以使用的延遲功能。 最后,盡管沒有完整和適當的標准庫(它使用自己的框架),但Arduino是用C ++而不是C編程的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.