簡體   English   中英

Arduino-關於數據類型

[英]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秒。 它工作正常,但是在此之前,我使用了其他設置,這些設置不起作用。 更改為:

  • 將count聲明為無符號long =>這導致延遲功能正常工作,但這只是第一次。
  • 在for循環的初始化步驟中將count聲明為int並將其初始化為int =>延遲功能根本無法按預期工作。

基於Arduino參考提供的有關Unsigned LongInt的知識,我認為在這種情況下它們本質上是相同的。 因此,我想對循環如何處理數據以及延遲函數進行一些說明。

您用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


哦,別再使用全局變量了。 countsec都應位於延遲函數內部。 停止制作自己的延遲功能,Arduino框架AFAIK應該具有可以使用的延遲功能。 最后,盡管沒有完整和適當的標准庫(它使用自己的框架),但Arduino是用C ++而不是C編程的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM