C++ 检测3v3电源芯片上2v5 src的数字输入?

C++ 检测3v3电源芯片上2v5 src的数字输入?,c++,microcontroller,pic,mplab,8-bit,C++,Microcontroller,Pic,Mplab,8 Bit,我用的是一个LED灯,我把它编程成3个LED灯依次闪烁。我希望它只在未收到特定输入时执行此操作。PIC以3v3运行,当我测试它时,这似乎足以为芯片和LED供电。输入来自不同PCB上的另一个LED,基本上我想检测它是开还是关。它在2v5亮起,所以这是我输入引脚的输入。当我测试它时,关闭2v5源代码或从它关闭开始不会触发3个LED闪烁。这是我的密码: /* * File: main.c */ // PIC12F675 Configuration Bit Settings // 'C' so

我用的是一个LED灯,我把它编程成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;
    }
}
/*
*文件:main.c
*/
//PIC12F675配置位设置
//“C”源代码行配置语句
//配置
#pragma config FOSC=INTRCIO//振荡器选择位(INTOSC振荡器:GP4/OSC2/CLKOUT引脚上的CLKOUT功能,GP5/OSC1/CLKIN上的I/O功能)
#pragma config WDTE=OFF//看门狗定时器启用位(WDT启用)
#pragma config PWRTE=ON//通电定时器启用位(PWRT禁用)
#pragma config MCLRE=OFF//GP3/MCLR引脚功能选择(GP3/MCLR引脚功能为MCLR)
#pragma config BOREN=ON//Brown out检测启用位(BOD启用)
#pragma config CP=OFF//代码保护位(程序内存代码保护被禁用)
#pragma config CPD=OFF//数据代码保护位(禁用数据内存代码保护)
//#pragma config语句应位于项目文件includes之前。
#定义LED_GRN GP0
#定义LED_YLW GP1
#定义LED_红色GP2
#在GP3/中定义LED_//我不认为使用它,但它在这里显示IO在哪个引脚上。
#定义额外频率4000000
#包括
#包括
#包括
void初始端口(void){
ANSEL=0X00;//将端口设置为数字IO而不是模拟输入。
ADCON0=0x00;//关闭ADC。
CMCON=0x07;//关闭比较器。
VRCON=0x00;//关闭参考电压。
TRISIO=0x08;//除3之外的所有GPIO引脚输出。
GPIO=0x00;//将所有引脚设为低电平。
}
真空总管(真空){
初始化端口();
//等待~1s
__延迟μms(1000);
//仅在背光关闭时闪烁LED。
//背光灯打开时,不要执行任何操作。
而(GPIO&0b001000);
如果(GPIO&0b000000){
发光二极管=1;
__延时μms(200);
发光二极管=0;
__延迟(5000);
发光二极管w=1;
__延时μms(200);
发光二极管w=0;
__延迟μms(1000);
LED_红色=1;
__延时μms(200);
LED_红色=0;
}
}
我的代码是否有问题,或者2v5是否低于芯片的工作电压太低,无法在接收输入时检测到?如果是后者,我可以在代码中设置一个不同的阈值,或者使用比较器检测~2v阈值以上的电压吗?还是有其他方法可以解决这个问题


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

首先隔离问题:

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

这应该会给出一个答案:这是一个电压水平问题,是一个软件问题,还是其他地方的硬件问题。

这里的代码中有一个问题:
if(GPIO&0b000000)

在某物和
0
之间执行按位AND运算-始终为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上的二极管下降可能会使您处于低电压。

我认为这更多是关于了解硬件而不是代码。当你面对的是同时发生在同一语句中的
if
else
时,你的LED很可能没有按照你的代码预期的方式连接,或者你的观察结果是错误的。我在输入“if”子句之前测试了LED。当没有“如果”条款时,它们按预期顺序闪烁。我投票结束这个问题,因为它是关于电信号电平的,而不是编程。阅读数据表,确定什么阈值电压被视为数字输入。阅读数据表可以回答大多数类似的问题。哦,如果你改变了你提到的代码,你应该更新你的问题。您的代码与“我加载了一些代码…”不匹配