2014-05-23 67 views
0

嗨,我是新來的Arduino,我試圖創建一個1秒的延遲,但我不知道如何我可以生成一個代碼,完成delay_ms功能 我已經試着去解決它,但似乎並沒有得到任何改善 謝謝 無效設置(){ 如何創建一個1秒的延遲Arduino

word millisecs; 
Serial.begin(9600); 
} 
void setup() asm volatile(
"   ldi r16,0x3F ; r16 = 00111111\n" 
"   out 4,r16  ; set pins 8-13 as outputs in DDRB\n" 
::: "r16"); 
millisecs = 1000;   // 1s blink delay 
Serial.begin(9600); 
} 
void loop() 
{ 
long starttime = millis();  // make a note of the start time 

asm volatile(
// jump to "blink" - ie jump around the delay_ms subroutine 
"   rjmp blink%=  ; relative jump to 'blink' \n" 
    "   ldi r16,0x3F ; r16 = 00111111\n" 
"   out 4,r16  ; set pins 8-13 as outputs in DDRB\n" 
::: "r16"); 

registers used: 
r31 - millisecond count (lo byte) 
r30 - millisecond count (hi byte) 
r17 - 100 microsecond count 
r16 - 1 microsecond count 
Overall delay (ms) = r30:r31 * r17 * r16 
---------------------------------------------------------------------*/ 
"delay_ms%=: nop     ; code to replace nop \n" 
"delay_100us%=: nop     ; code to replace nop \n" 
"delay_1us%=: nop     ; code to replace nop \n" 
"    sbiw r30,1   ; decrement ms count (r31:r30)\n" 
"    brne delay_ms%=  ; loop to delay_ms while > 0 \n" 
"    ret     ; return from subroutine  \n" 

回答

1

有一個內置在做這個

http://arduino.cc/en/Reference/delay 

你只要給它延遲的毫秒數。所以一秒鐘

delay(1000) 
+0

是的但我想完成它沒有使用內置我需要弄清楚如何完成delay_ms%delay_100us%和delay_1us%函數謝謝。 – user3669884

0

你正在努力工作的方式太簡單了。請參閱BlinkWithoutDelay(代碼如下)。該代碼也是安裝Arduino IDE時安裝的Arduino示例的一部分。那裏有很多好的學習例子。 (呵呵 - 該代碼對VAR previousMillis一個long這是一個錯誤(IMO)這將是更好地使用unsigned long。)

您還可以使用Timer interrupts,但一個簡單秒鐘的延遲選項(特別是如果你沒有太多的經驗),我會建議上述方法,並用易於理解的代碼來完成。

/* Blink without Delay 

Turns on and off a light emitting diode(LED) connected to a digital 
pin, without using the delay() function. This means that other code 
can run at the same time without being interrupted by the LED code. 

The circuit: 
* LED attached from pin 13 to ground. 
* Note: on most Arduinos, there is already an LED on the board 
that's attached to pin 13, so no hardware is needed for this example. 


created 2005 
by David A. Mellis 
modified 8 Feb 2010 
by Paul Stoffregen 

This example code is in the public domain. 


http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay 
*/ 

// constants won't change. Used here to 
// set pin numbers: 
const int ledPin = 13;  // the number of the LED pin 

// Variables will change: 
int ledState = LOW;    // ledState used to set the LED 
long previousMillis = 0;  // will store last time LED was updated 

// the follow variables is a long because the time, measured in miliseconds, 
// will quickly become a bigger number than can be stored in an int. 
long interval = 1000;   // interval at which to blink (milliseconds) 

void setup() { 
    // set the digital pin as output: 
    pinMode(ledPin, OUTPUT);  
} 

void loop() 
{ 
    // here is where you'd put code that needs to be running all the time. 

    // check to see if it's time to blink the LED; that is, if the 
    // difference between the current time and last time you blinked 
    // the LED is bigger than the interval at which you want to 
    // blink the LED. 
    unsigned long currentMillis = millis(); 

    if(currentMillis - previousMillis > interval) { 
    // save the last time you blinked the LED 
    previousMillis = currentMillis; 

    // if the LED is off turn it on and vice-versa: 
    if (ledState == LOW) 
     ledState = HIGH; 
    else 
     ledState = LOW; 

    // set the LED with the ledState of the variable: 
    digitalWrite(ledPin, ledState); 
    } 
} 
+0

是的,但我想用匯編語言編寫閃爍函數,我已經知道如何使用定時器了謝謝 – user3669884

+0

@ user3669884 - 那麼爲什麼你沒有說你的問題,而不是因爲沒有提供足夠的信息而浪費我們的時間。 –