2016-07-09 1 views
2

PIC16f688을 사용하여 아날로그 입력을 읽고 전압 읽기를 기반으로 표시등을 켜거나 끄십시오. 이 PIC를 사용하여 깜박이는 빛을 성공적으로 켜고 끕니다. 여기에 사용 된 코드가 있습니다.mplab 및 xc8 컴파일러를 사용하여 pic16f688에 아날로그 입력을 읽어야합니다.

void main() { 
    ANSEL = 0b00000000; //All I/O pins are configured as digital 
    CMCON0 = 0x07; // Disbale comparators 
    TRISC = 0b00000000; // PORTC All Outputs 
    TRISA = 0b00001000; // PORTA All Outputs, Except RA3 

    do { 
     RC0 = 1; 
     __delay_ms(500); 
     RC0 = 0; 
     __delay_ms(500); 
    } while (1); // Infinite Loop 
} 

나는 아날로그 입력을 읽으려고이 코드를 읽은 후 여러 가지를 읽었습니다.

#pragma config FOSC = HS  // Oscillator Selection bits (HS oscillator) 
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled) 
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) 
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) 
#pragma config CPD = OFF  // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) 
#pragma config CP = OFF  // Flash Program Memory Code Protection bit (Code protection off) 


#include <xc.h> 
#include <pic16f688.h> 
#define _XTAL_FREQ 8000000 
void main() { 
    int voltage; 
    ANSEL = 0b01000000; //All I/O pins are configured as digital except an6/RC2 
    TRISC = 0b00000100; // PORTC All Outputs except RC2 
    TRISA = 0b00001000; // PORTA All Outputs, Except RA3 

    do { 
     ADCON0 = 0xbb; //set to read 
     GO_nDONE = 1; 
     while(GO_nDONE == 1); 
     voltage = (ADRESH << 8) + ADRESL; //get voltage reading 
     if(voltage > 500){ //if voltage is greater than 500 out of 1023 turn light on 
      RC0 = 1; 
     } 
     else{ 
      RC0 = 0; 
     } 
     __delay_ms(500); 
    } while (1); // Infinite Loop 
} 

내가 이것을 실행할 때, 입력이 땅에 연결될 때를 포함하여 입력이 무엇이든 상관없이 조명이 켜집니다.

MPLab에서 XC8 컴파일러를 사용하고 있습니다.

+0

오실레이터 구성은 무엇입니까? 워치 독 타이머가 켜지거나 꺼져 있습니까? –

+0

#define _XTAL_FREQ 8000000 따라서이 라인에 따라 오실레이터는 8MHz로 설정됩니다. 전 제출 한 후 전처리 조각에서 편집 할 것입니다. 워치 독 타이머가 꺼져 있습니다. – user6569498

+0

외부 발진기가 있습니까? –

답변

0

외부 발진기를 사용하고 있으면 내부 발진기를 잘못 설정했기를 바랍니다.

기본 ADC 클록은 Fosc/2이고 8Mhz는 하이이므로 ADCON1을 Fosc/16 검사 데이터 시트로 설정하십시오.

왜이 행을 삭제 했습니까?

CMCON0 = 0x07; // Disbale comparators 

필수적입니다.

0

CMCON0 = 0x07을 사용하여 비교기를 비활성화하십시오. RC0이 정상적으로 작동해야합니다.

관련 문제