Acerca de las salidas digitales de PIC16F877A

3

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.

    
pregunta Barış Öz

1 respuesta

2

El problema es que tiene un valor diferente para RB0 y RB1:

Supongamos que RB0 = 0, y RB1 = 1, el flujo del código es:

RA0 = 0, luego demora 5us luego RA0 = 1 luego bucle

Si conectas un osciloscopio, verás que el pin RA0 en realidad está alternando, pero la lectura del pin de voltaje con un voltímetro promedia (en términos generales) esta señal pulsada.

No entendí qué intentas lograr aquí, pero estás controlando 1 salida usando 2 entradas, lo que es realmente extraño.

Si desea verificar si una de las entradas es alta, debe hacer lo siguiente:

while(1)
{
if((RB0==1)||(RB1==1))
RA0=1;
else
RA0=0;
}
    
respondido por el fhlb

Lea otras preguntas en las etiquetas