2013-07-09 4 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 MHz의 판단 명령어 사이클 속도, 함께 할 수있는 뭔가가있을 수 있습니다 생각할 수 없다 .

도움을 주시면 큰 도움이됩니다.

+0

왜 디버그가 켜져 있습니까? – Iancovici

+0

DelayA에서 먼저 DECFSZ를 호출 한 다음 무조건 (!) 지연 A로 점프합니다. 대신 조건부 점프를 기대합니다. 루핑하기 전에 어떤 종류의 루프 변수를 초기화해야합니다. 그렇지 않으면 변수가 이미 0이기 때문에 다음 호출이 전혀 반복되지 않거나 언더 플로가 발생하여 다시 0이 될 때까지 루프가 발생합니다. PIC 어셈블리를 모르기 때문에 완전히 잘못 될 수 있습니다. BTW : DelayA와 DelayB가 비대칭 인 것도 약간 이상합니다. – doomster

+0

@doomster 루프 변수를 초기화 할 필요가 없으며,이 마이크로 컨트롤러에서 영원히 반복 할 수 있습니다. – Iancovici

답변

0

1. 토글하는 핀의 3 중 상태를 설정해보십시오. 입력 또는 출력인지 표시해야합니다.이 경우 출력됩니다.

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

2

#define D0_1Tris B'11001111'

처럼. 당신의 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 예제에서 가져옴)