2013-07-09 60 views
1

我最近開始使用18 PIC 4500,並且我第一次嘗試在彙編中對其進行編程,以使它在循環中閃爍一個LED。但是,我沒有太多的使用這種語言進行編程的經驗,所以不得不依賴其他代碼片段來讓我開始。我的代碼如下:用18PIC4550使用匯編代碼閃爍LED

#include<p18f4550.inc> 

CONFIG WDT = OFF 
CONFIG MCLRE = ON 
CONFIG DEBUG = ON 
CONFIG LVP = OFF 
CONFIG FOSC = INTOSCIO_EC 

ORG 0 


Delay1 res 2 
Delay2 res 2 


Start: 
     CLRF PORTB 
     CLRF TRISB 
     CLRF Delay1 
     CLRF Delay2 


MainLoop: 
    BSF PORTB,1 
    GOTO DelayA 


DelayA: 
    DECFSZ Delay1,1 
    GOTO DelayA 
    BCF PORTB,1 
    GOTO DelayB 

DelayB: 
    DECFSZ Delay2,1 
    GOTO DelayB 
    GOTO MainLoop 

end 

我不明白爲什麼它不工作,但認爲它可能有一些做的指令週期速度,我相信這是1兆赫,造成延誤要過短。

任何幫助非常感謝!

+0

爲什麼調試開啓? – Iancovici

+0

在DelayA,你首先調用DECFSZ,然後無條件地(!)跳轉到延遲A.我期望一個條件跳轉。另外請注意,在循環之前,您必須初始化某種循環變量,否則下一次調用將根本不會循環(因爲變量已經爲零),否則會導致下溢,然後循環直到它再次爲零。我可能完全錯誤,因爲我不知道PIC組裝。順便說一句:DelayA和DelayB是不對稱的也有點奇怪。 – doomster

+0

@doomster您不必初始化循環變量,您可以在這些微控制器中實現永久循環 – Iancovici

回答

0

1。嘗試設置您正在切換的引腳的三態。你必須指出它是輸入還是輸出,在這種情況下它是輸出。

喜歡

#define D0_1Tris B'11001111'

movlw D0_1Tris ; set direction so LEDs D0 & D1 are outputs 
movwf TRISA  ; all others are inputs (high-z) 

2。確保您的A/d被配置爲I/O數字

clrf ANSEL ; configure A/D I/O as digital (可能需要清除比較過,無論外圍複用選擇的I/O)

3。也不要忘記使用復位向量

ORG 0x000 ; processor reset vector

nop   ; required by in circuit debugger 

goto Init   ; go to beginning of program 

4。嘗試以較慢的時鐘速率來確定是否由於短暫的延遲。如果是延遲問題,那麼實現一個定時器,使切換信號爲50-50佔空比 (注意可能必須將其更改爲p18f4550,它取自pic16示例)