在具有 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 上的二极管压降可能会使您电压下降。
我正在使用 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 上的二极管压降可能会使您电压下降。