在具有 3v3 电源的芯片上检测来自 2v5 src 的数字输入?

Detect digital input from 2v5 src on a chip with 3v3 power?

我正在使用 12F675 PIC 并且我已将其编程为使 3 个 LED 依次闪烁。我希望它仅在未收到特定输入时执行此操作。 PIC 在 3v3 时为 运行,这似乎足以在我测试时为芯片和 LED 供电。输入来自不同 PCB 上的另一个 LED,基本上我想检测它是打开还是关闭。它以 2v5 点亮,所以这是我输入引脚的输入。当我对其进行测试时,关闭 2v5 源或从关闭它开始不会触发 3 个 LED 闪烁。这是我的代码:

/*
 * File:   main.c
 */

// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONFIG

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

// #pragma config statements should precede project file includes.

#define LED_GRN   GP0
#define LED_YLW   GP1
#define LED_RED   GP2
#define LED_IN    GP3 // I don't think this is used but it's here to show which pin the IO is on.

#define _XTAL_FREQ 4000000
#include <xc.h>
#include <stdlib.h>
#include <htc.h>


void init_ports(void) {
    ANSEL   = 0X00;  // Set ports as digital IO not analog input.
    ADCON0  = 0x00;  // Shut off ADC.
    CMCON   = 0x07;  // Shut off comparator.
    VRCON   = 0x00;  // Shut off the voltage reference.
    TRISIO  = 0x08;  // All GPIO pins output except 3.
    GPIO    = 0x00;  // Make all pins LOW.
}


void main(void) {
    init_ports();

    // Wait ~ 1s
    __delay_ms(1000);

    // Only flash LEDs if the backlight is off.
    // Do nothing while the backlight is on.
    while (GPIO & 0b001000);
    if (GPIO & 0b000000) {


        LED_GRN = 1;
        __delay_ms(200);
        LED_GRN = 0;
        __delay_ms(5000);

        LED_YLW = 1;
        __delay_ms(200);
        LED_YLW = 0;
        __delay_ms(1000);

        LED_RED = 1;
        __delay_ms(200);
        LED_RED = 0;
    }
}

我的代码是否有问题,或者 2v5 是否低于芯片的工作电压而无法被检测为接收输入?如果是后者,我能否以某种方式在代码中设置不同的阈值,或者以某种方式使用比较器来检测高于 ~2v 阈值?或者有其他方法可以解决这个问题吗?

更新:现在我真的很困惑,我已经将一些代码加载到芯片上以闪烁绿色 if (GPIO & 0b000000)、闪烁黄色 if (GPIO & 0b001000) 和闪烁红色 else。无论背光是否打开,它都会闪烁黄色然后闪烁红色。这让我感到困惑,因为“if”条件和“else”条件不可能同时触发。

首先确定问题:

  • 将输入连接到 3.3 V 电源总线,最好通过 2K 电阻,并检查电路是否被触发。
  • 测量 2.5 伏输出中的电压,并验证它们是否在 3.3 伏输入会遵守的范围内。如果没有,你需要一个电平转换器。

这应该可以回答是电压问题,还是软件问题,还是其他地方的硬件问题。

您的代码存在问题:if (GPIO & 0b000000)

您在某些内容和 0 之间执行按位与 - 始终为 0,而 0 始终计算为 false。

你想要这样的东西:if ((GPIO & 0b001000) == 0b001000)if ((GPIO & 0b001000) == 0b000000)

  • 额外的括号,因为我不记得 &== 是否具有优先权。

另一方面,你应该没问题的电压水平。在您链接的数据表的第 8 页上,它说 GP3 有一个 TTL 输入缓冲器,在第 93 页上它说带有 TTL 缓冲器的输入高电压是 (0.25 VDD+0.8) = 1.625V(3.3V VDD)。

但是,当然,您还应该测量您实际拥有的 2.5V 电压,因为 LED 上的二极管压降可能会使您电压下降。