2014-06-12 57 views
1

我試圖讓Raspberry Pi上的LED按時間間隔打開/關閉。我知道有一個關於如何做到這一點的教程,但我被告知這對於程序的手段來說太複雜了。大會:延遲使用循環

所以,我的一個朋友給了我這個代碼,並告訴我說,是可以延遲執行:

/* using 3 loops for delay*/ 
for_i: 
    mov r2, #0 

next_i: 
    cmp r2, #1000 
    bge endfor  

for_j: 
    mov r3, #0 

next_j: 
    cmp r3, #1000 
    bge fin_i  

for_k: 
    mov r4, #0 
    cmp r4, #1000 
    bge fin_j 
    add r4, #1 
    b for_k 

fin_j: 
    add r3, #1 
    b next_j 

fint_i: 
    add r2, #1 
    b next_i 

endfor: 

其中,據我瞭解基本上是3嵌套的for循環。

我想插入延遲程序的一點是這樣的:

loop$: 

/*turn LED on*/ 
mov r5,#1 
lsl r5,#16 
str r5,[r4,#40] 

*/insert delay*/ 

/*turn LED off*/ 
mov r5, #1 
lsl r5,#16 
str r5, [r4, #28] 

*/insert delay*/ 

b loop$ 

當我cluelessly試圖在LED只是停留在某處代碼插入循環。老實說,我不知道如何插入這一小段代碼讓程序被延遲,或者即使3個循環足以注意到這個間隔。

的代碼來開啓/關閉LED應該完全正常工作,如果我沒有環$運行代碼時,指示燈熄滅,當我運行這個循環的代碼,LED是非常暗淡

回答

2

首先,讓我們簡化代碼。少一些分支可以更容易地看到它實際上是三個循環:

mov r2, #0 
next_i: 
    mov r3, #0 
next_j: 
    mov r4, #0 
next_k: 
    add r4, #1 
    cmp r4, #1000 
    blt next_k 
    add r3, #1 
    cmp r3, #1000 
    blt next_j 
    add r2, #1 
    cmp r2, #1000 
    blt next_i 

您可以將其粘貼到代碼中您希望延遲的位置。

如果LED發光暗淡,則表明環路太短。使用非常快的速度打開和關閉LED可以使其發光強度不同。

嘗試將#1000之一更改爲#10000以使延遲更長。

+0

非常感謝,結果1000是相當高的3個循環。現在它可以工作。你有任何建議如何使用這些循環作爲*方法*從代碼調用,而不是僅僅複製2次? – akalikin

+0

@ user2407413:您可以將其設爲子程序:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0473c/Cihcfigg.html – Guffa