Actualmente estoy desarrollando un circuito que contiene 16 LDR, 4 LM339N IC y 1 PIC16F877A. Yo comparo salidas de LDRs con un voltaje de referencia ajustable. Logré obtener 0-5 V de LM339N. Ahora envío estos valores al 16F877A como entradas digitales para verificar si uno de ellos es ALTO. Si verifico solo un valor, funciona bien y puedo obtener voltajes entre 0.12-5.01 V del pin de salida digital. Pero cuando incremento las entradas digitales a dos o más, la salida digital da 2.1 cuando es baja y 2.5V cuando es alta y no es suficiente para mí. He intentado definir;
TRISB = 0xFF;
TRISC = 0xF0;
TRISD = 0xF0;
leyendo valores entre RB0-7, RC4-7, RD4-7 y escribiendo la salida en RD0. También he intentado descuidar el módulo ADC y;
TRISB = 0xFF;
TRISA = 0x00;
leyendo valores de RB0 y RB1 y escribiendo en RA0. Pero aún no hay suerte.
Estoy usando cristal HS de 8 MHz con dos capacitores de 22 pF. Pin 1 tiene una resistencia con un pulsador. El PIC se suministra con 5.1 V desde 11-32 pines y la tierra se conecta a 12-31 pines. No tengo ningún diagrama de circuito preparado, pero si no puedo encontrar ningún soporte desde aquí, puedo construirlo. Estoy usando MPLAB X IDE v3.45 y PicKit2 para la programación. El código se incluye a continuación.
#define _XTAL_FREQ 8000000
#include
// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
//END CONFIG
void main(){
ADCON1 = 6;
CMCON = 7;
TRISB = 0xFF;
TRISA = 0x00;
RA0 = 0;
while(1){
if(RB0 == 1){RA0 = 1;}else{RA0 = 0;}
__delay_us(5);
if(RB1 == 1){RA0 = 1;}else{RA0 = 0;} // Works well when I comment this line.
}
}
También intenté construir si / else if / else estructura, no funciona también. Gracias de antemano.