2016-09-17 7 views
0

C, MPLAB X (IDE와 IPE 모두)를 사용하고 PICKit 3을 사용하여 PIC 18F4550을 시작하려고합니다. 하나의 LED가 깜박이고 문제가 있지만 동시에 하나 이상의 LED를 깜박이면 작동하지 않습니다.PIC 18F4550을 사용하여 3 개의 LED가 깜박임

질문 끝에 전체 코드를 게시합니다. 그때까지, 나는 약간의 질문을 좀 더 분명하게하기 위해 의사 코드를 쓸 것이다.

내가 각, 당신은 분명히 당신은 모든 LED가 켜져 있고 끌 것으로 기대

loop{ 
    output1 = 1; 
    output2 = 1; 
    output3 = 1; 
    output4 = 1; 
    delay(); 
    output1 = 0; 
    output2 = 0; 
    output3 = 0; 
    output4 = 0; 
    delay(); 
} 

뭔가를 입력하려는 칩의 출력 핀에 부착 된 4 개의 LED를 점멸 할 가정 동시에. 그러나, 나는 output4에 연결된 LED 만 깜박이고 나머지는 꺼져있는 것으로 나타났습니다. 그래서 나는

loop{ 
     output1 = 1; 
     output2 = 1; 
     output4 = 1; 
     output3 = 1; 
     delay(); 
     output1 = 0; 
     output2 = 0; 
     output4 = 0; 
     output3 = 0; 
     delay(); 
    } 

결과, 출력 3에 부착 된 LED 만 깜박 것 같은

로 출력 핀의 순서를 뒤집기 시도하고, 나머지는 해제 상태를 유지합니다.

그래서 어떻게 든 예상대로 코드가 순차적으로 실행되지 않습니다. 누구든지 이에 대한 설명과 가능한 해결책을 제공해 주시겠습니까?

고맙습니다.

여기 이것은 LATCH 문제가 될 수있는 전체 코드를

#include <xc.h> 
#include <p18f4450.h> 
#pragma config FOSC = HS 

#define outRed PORTBbits.RB0 
#define outBlue PORTBbits.RB1 
#define outYellow PORTBbits.RB2 
#define outGreen PORTBbits.RB3 
#define _XTAL_FREQ 10000000 

void delay(unsigned int); 



void main(void) { 
    TRISBbits.TRISB0 = 0; 
    TRISBbits.TRISB1 = 0; 
    TRISBbits.TRISB2 = 0; 
    TRISBbits.TRISB3 = 0; 

    while(1) { 
     outRed = 1; 
     outGreen = 1; 
     outBlue = 1; 
     outYellow = 1; 
     delay(1000); 
     outRed = 0; 
     outGreen = 0; 
     outBlue = 0; 
     outYellow = 0; 
     delay(1000); 
    }   

} 

void delay(unsigned int delayInput) { 
    unsigned int mul = delayInput/50; 
    unsigned int count = 0; 
    for (count = 0; count <= mul; count ++) 
     __delay_ms(50); 
} 

답변

1

을합니다. 내가 시작했을 때 나는이 문제를 몇 번 가지고 있었다. PORTB 레지스터 대신 LATB (출력 래치) 레지스터에 쓰십시오. 필자는 항상 출력을 위해 LATx를 사용하고 입력을 위해 PORTx를 사용합니다.

+0

이것은 나를 위해 아주 잘되었습니다! 고마워요! 그러나이 문제의 이유가 있습니까? PIC의 아키텍처에서? 왜 이런 일이 일어나는거야? – dou2abou

+0

PORTx는 디지털 입력 버퍼에서 읽는 반면 LATx는 출력 래치에 기록합니다. 어떤 경우에는 디지털 입력 버퍼에 LATx 레지스터로 출력하려고하는 전압이 표시되지 않습니다 (예 : 핀 중 하나가 아날로그 입력으로 설정된 경우 0으로 읽음). 비트 연산이 8 비트 읽기 => 수정 => 쓰기로 구현된다는 사실과 결합하면 PORTx 결과가 놀랄 수 있습니다. 추신 PIC18F4550의 핀 중 일부는 ADCON1 레지스터를 사용하여 아날로그 또는 디지털 입력으로 구성 할 수 있습니다. –

0

항상 출력 래치 (LATB의 경우)에 쓰고 PORTx에서 입력을 읽습니다. PORTx에 쓰는 것은 예측할 수없는 행동입니다.