SOGO論壇

標題: arduino腳位宣告的問題? [列印本頁]

作者: nk931003    時間: 2013-3-17 01:48:59     標題: arduino腳位宣告的問題?

小弟最近用arduino UNO寫按鈕控制LED的程式
雖然是完成了 但是有些問題讓我不解

程式:
int led=13;
int buttom=2;
int val=0;
void setup()
  {
   pinMode(buttom,INPUT);
   pinMode(led,OUTPUT);
  }
void loop()
{
  val=digitalRead(butt);
  if(val==HIGH)
     {  
       delay(20);
       digitalWrite(led,LOW);
     }
else
    {
      digitalWrite(led,HIGH);
     }
}
----------------------------------------
1.問題是小弟LED的接腳定義在13 是用
int led=13;

可是小弟又在其他書上看到
#defnie led 13;

請問這兩者有什麼不同嗎?

2.如果今天要將某感測器接至第0腳位
那不就變成
int sensor=0;
int val=0;
兩者不就衝突了嗎?

3.小弟以前學過一點C語言 記得
宣告變數可以不用給數值 如:
int x;
int y;
可是使用arduino寫這樣除錯時會產生錯誤
怎麼會這樣?

小弟是學機械的 程式設計基礎不好
問教授又說不清楚 所以想請各位大大幫忙解答
謝謝

作者: alphi    時間: 2013-3-17 10:20:52

本帖最後由 alphi 於 2013-3-17 21:01 編輯

第一個問題
這兩種方式都可以,不過通常會使用第一組方式
  1. #define LED 13
複製代碼
因為這種方式為Pre-Process ,當編譯器看到
  1. PinMode(LED,Output);
複製代碼
會直接把LED 這個值取代為13,實際上為
  1. PinMode(13,Output);
複製代碼
而且也不占記憶體空間(因為他只是把值取代)

第二種方式功能一樣,但是式動態執行或著看編譯器規則要怎麼定義,但是不管怎樣至少會在Stack中佔2Byte,對於嵌入式系統記憶體都是要很在乎例如
Microchip PIC10F320,RAM:64Byte,Flash: 512Byte.隨便使用就超過限制.如果使用浮點運算更是不行 得用一些方式來處理

另外針對I/O或著內部資源.就算要用變數最好前面加上
  1. const int LED=13;
複製代碼
否則不小心改到值 永遠都查不到原因.當然有step by step trace ,不過要先熟悉工具

第二個問題
  1.   int sensor=0;
  2.   int val=0;
複製代碼
這兩個並不矛盾,例如
  1. 國文成績=60分
  2. 數學成績=60分
複製代碼
只是剛好你的值一樣.但不代表共用與衝突.除非未來您用到指標與union,enum這些就會遇到一些問題
第三個問題
  1. int x;
  2. int y;
複製代碼
一般來說的確C語言可允許變數不給初始值,頂多出現warring[警告],但是在嵌入式系統等編譯器是可以設定警告[Warring]視為錯誤[Error]
不管如何最好任何變數都給初始值最好.因為不同編譯器在處裡這種沒有初始值得變數有不同的做法例如
Keil RealView C compiler for ARM 會根據當時狀況指定值
Microchip XC8 Compiler 會將有給初始值得在某一個
memory block,沒給初始值得放在另一個區塊.在處理上會比較麻煩.所以最好不要相信Compiler 幫你做的動作.自己做最好

最後關於您問題三.應該是Ardunio 把Compiler 警告訊息等級調高吧

作者: nk931003    時間: 2013-3-18 20:33:25

專業
雖然有些不是很懂
但是還是謝謝大大解答




歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM