2017-04-06 16 views
-1

커스터마이징 된 보드의 PIC18F45k80 핀 출력을 제어하는 ​​펌웨어를 개발 중입니다. 최종 버전으로이 그림을로드하고 프로그래밍하기 전에 가장 간단한 사용자 코드로 내 프로그램/디버그 환경 (MPLABX IDE + Pickit3)을 테스트했습니다. 50ms주기의 일부 portD 출력을 토글합니다.출력 방향에 맞게 PIC18 포트 D를 올바르게 구성하는 방법은 무엇입니까?

3 핀이 제대로 작동하지만 (RD6, RD5, RD4) RD3 및 R2의 경우는 아닙니다. 그들은 신호가 없으며 결코 켜지지 않습니다. 핀은 실행 시간을 모두 0으로 유지합니다.

을 main.c 파일 : : 무슨 일 할 수

//C libraries 
#include <stdio.h> 
#include <stdint.h> 
#include <stdbool.h> 

#include <pic18f45k80.h> 
#include "18f45k80_mainconfig.h" 
#include <xc.h> 

//Application dependent libraries 
#include "gold_whyl_task.h" 

/*outputs defines*/ 
#define CADENZA  PORTDbits.RD2 //problem with this bit 
#define CAPW  PORTDbits.RD3 //problem with this bit 
#define FREQFISSA PORTDbits.RD4 
#define FISSAWAIL PORTDbits.RD5 
#define COMCICLOSIR PORTDbits.RD6 

/*inputs - debug*/ 
#define PGC   PORTBbits.RB6 
#define PGD   PORTBbits.RB7 

int main() 
    { 

    TRISDbits.TRISD0=1;//input ACTIVACIOn 
    TRISDbits.TRISD1=1;//input CLACSON 
    TRISBbits.TRISB6=1;//pdg 
    TRISBbits.TRISB7=1;//pdc 

    /*outputs*/ 
    TRISDbits.TRISD2=0;//output CADENZA //problem with this 
    TRISDbits.TRISD3=0;//output CAPW //problem with this 

    TRISDbits.TRISD4=0;//output FREQFIJA 
    TRISDbits.TRISD5=0;//output FIJAWAIL 
    TRISDbits.TRISD6=0;//output COMCICLOSIR 

    while(1) 
     { 
      COMCICLOSIR=0; 
      FISSAWAIL=0; 
      CAPW=0; 
      CADENZA=0; 
      FREQFISSA=0; 

      __delay_ms(50); 
      COMCICLOSIR=1; 
      FISSAWAIL=1; 
      CAPW=1; //this assignment has no effect --> it stills 0 
      CADENZA=1;//this assignment has no effect--> it stills 0  
      FREQFISSA=1; 
      __delay_ms(50); 
     } 
} 

을 당신이 다음 코드에서 볼 수 있듯이 모든 핀은, 구성 같은 시간에 같은 방법으로 활성화? 정의, 포트 구성 등에 문제가 있습니까?

+0

마이크로 컨트롤러 및 전자 제품에 대한 별도의 교환 사이트가 있습니다. http://electronics.stackexchange.com/ – arminb

+0

무엇을 의미합니까? 나는 지침을 따랐고, 항상 같은 방식으로 입력과 출력을 구성하지만, 전체 포트를 정확히 같은 방식으로 구성 할 때 포트의 일부만 작동하고 나머지는 작동시키지 않았습니다. 데이터 시트가이 문제에 관해 어떤 정보를 제공합니까? –

+0

그 핀은 어떨까요? 모든 회로가 동일합니까? 아마도 'PADCFG1' 레지스터로 풀업을 활성화해야합니다. – LPs

답변

3

당신은 항상 RD2RD3를 사용 기본적으로, 불행하게도 당신을 위해, datasheet

귀하의 MCU는 A/D port을 가지고 확인해야한다.

아날로그로 사용할 수있는 page 364, ADCON1 reg에서 확인할 수 있습니다.

enter image description here

page 92에서 당신은 시작할 때 ADCON1 레지스터에서 구성을 볼 수 -111 1111

enter image description here

이 전원을 켤/browout/WDT/reste ... RD2RD3는 것을 의미한다 아날로그 입력으로 설정합니다.

A/D 변환기의 핀을 I/O으로 사용하지 않도록 설정해야합니다.

나는 마이크로 칩 SDK가없는하지만 당신은 0bit 6bit 5을 설정하려면

ADCON1 &= 0x9F; 

처럼 뭔가를하고 RD2을 활성화하고, 내부 그들 모두가 동일하게 연결되어 RD3

+0

필자는 항상 마이크로 칩이 아날로그 포트가 아닌 포트를 기본 포트로 설정하기로 결정했다. –

+0

@Colin__s 아마 ... – LPs

-1

I/O로한다 이 핀들과 연결된 풀업 (pull up)이지만 출력 구성시 자동으로 꺼집니다. 그러나 이제 나는 그 질문의 킷을 발견했다. PORTDbits.RD2를 사용하면 핀에서 읽고 어쩌면 쓸 수 있지만 보증이 필요하지 않습니다 (이것이 일부 핀이 작동하고 다른 핀이 작동하지 않는 이유입니다). 대신 핀이 ouptut으로 구성된 경우 LATD 옵션을 사용하여 핀을 작성합니다. 이제 작동합니다.

+0

@LPs ANCON1 = 0x00 (다른 파일에 포함되어 있음)을 구성했습니다. 문제가있는 첫 번째 게시물을 작성하기 전에 나는 주석을 달았습니다. 나는 LAT와 PORT의 차이점에 대해 이야기 한 데이터 시트와 다른 자료를 다시 읽었다. 그들은 쓰기 출력 핀에 항상 LAT를 사용하도록 제안합니다. 나는 PORT로 디지털 출력을 쓰려고했다. –