2016-07-10 2 views
3

PIC 12F675를 프로그래밍하여 GPIO 0 핀 (핀 번호 7)에 연결된 LED 다이오드를 깜박 거려했습니다. I는 출력으로 모두 설정지연 루프 PIC 어셈블리 코드가 브레드 보드에서 작동하지 않습니다.

clrf ANSEL 

:

는 I는 디지털 모드로 핀 설정

clrf TRISIO 

하고 마침내는 I가 사용되는 루프이다

     ;this delay loop should consume 1 000 000 ticks 
        ;which is 1 second approximately 
movlw 0xff   ;assigned the highest 8bit value to accumulator 
movwf 0x20   ;moved the value to general purpose register 20 
movwf 0x21   ;moved the value to GPR 21 
clrw     ;cleared the working register (accumulator) 
movlw 0x15   ;assigned the value 15 to accumulator 
movwf 0x22   ;moved the value to GPR 22 

bsf GPIO,0  ;set the first pin high 

loop1 

decfsz 0x20, 1 
goto loop1 
decfsz 0x21, 1 
goto loop1 
decfsz 0x22, 1 
goto loop1  ;nested loops to delay further action 

bcf GPIO,0   ;set the first pin low 

그리고 마침내 이것은 주먹 장소에서 칩을 구성하기 위해 사용한 코드입니다.

__CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON 

내 문제는 MPLAB X에서 프로그램을 컴파일하고 단계별로 디버깅 할 때 프로그램 실행에 문제가 없다는 것입니다. 비트 GPIO 0은 실제로 루프에 따라 상태를 변경합니다. 그러나 칩을 브레드 보드에 연결할 때 LED가 깜박이지 않고 계속 켜져 있습니다.

제 질문은 : 문제가 오실레이터 구성 오류 때문일 수 있습니까? (나는 또한 100 nF 디커플링 세라믹 커패시터를 사용한다.)

나는 꽤 많은 코드 변형을 시도했다. 어떤 조언을 환영합니다. 내가 사용

전체 .ASM 코드 :

  list p=12F675 
#include <p12F675.inc> 

    __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF & _CPD_ON 

    OSCCAL equ 0x90 
    TRISIO equ 0x85 
    ANSEL equ 0x9f 
    GPIO equ 0x05 

    org 0x00 

    bsf 0x03,5  ;bank1 

    movlw b'00111100' ;osccal value 
    clrf OSCCAL 
    movwf OSCCAL ;osccal set 

    movlw b'11111110' ;ansel value 
    movwf ANSEL  ;set pin AN0 as digital I/O 

    movlw b'11111110' ;trisio value 
    movfw TRISIO ;set pin GPIO0 as output 
    clrf TRISIO 


    bcf 0x83,5  ;bank0 

    clrf GPIO  ;clear GPIO port 

start 

    movlw 0xff 
    movwf 0x20 
    movwf 0x21 
    clrw 
    movlw 0x15 
    movwf 0x22 


    bsf GPIO,0 

loop1 
    decfsz 0x20, 1 
    goto loop1 
    decfsz 0x21, 1 
    goto loop1 
    decfsz 0x22, 1 
    goto loop1 


    bcf GPIO,0 

    movlw 0xff 
    movwf 0x20 
    movwf 0x21 
    clrw 
    movlw 0x15 
    movwf 0x22 


loop2 
    decfsz 0x20, 1 
    goto loop2 
    decfsz 0x21, 1 
    goto loop2 
    decfsz 0x22, 1 
    goto loop2 

    goto start 

    end 
+0

워치 독 타이머가 켜지거나 꺼져 있습니까? –

+0

이 코드 조각을 생성했습니다 : _WDTE_OFF, 나는 그것이 꺼져 있다고 생각합니다. 모든 생성 된 컨디션 비트 코드 : __CONFIG _FOSC_INTRCIO & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _CP_OFF ​​& _CPD_ON – Avo

+0

@Aboe 질문을 편집하여 자세한 내용을 추가하십시오. –

답변

1

모든 비교기의 구성을 제외하고, OK 보인다! GP0, GP1 및 GP2를 디지털 I/O 핀으로 사용하기 위해 비교기를 비활성화하려면 다음 코드를 삽입하십시오 (기본값은 켜짐).

bcf  STATUS,RP0 ;Bank 0  
movlw 07h  ;Set GP<2:0> to digital IO 
movwf CMCON  ;digital IO 
+0

선생님/부인, 영원한 감사를 드립시다. 이것은 실제로 내 문제를 해결했습니다! 시간과 노력에 감사드립니다 :) – Avo

관련 문제