该代码适用于带有ATmega168pb MCU的AVR atamega168x普通迷你板。我使用的移位寄存器是德州仪器(TI)TPIC6C595,我的移位寄存器的漏极输出连接到8个LED的阳极。移位寄存器的OE(G)引脚连接到GND,CLR连接到5V。移位寄存器VCC和GND之间有一个100nF的陶瓷电容器。 SER OUT没有连接任何东西,因为在我移至链接移位寄存器之前,我试图对此进行位冲击。

发生的是,我没有从移位寄存器得到任何输出,所有的漏极输出均为低电平(用万用表测试)。当我从微控制器上断开SER IN,SRCK和RCK时,我仅在其中一个LED上出现了一些闪烁,我猜这是那些引脚悬空并处于未定义状态的结果。即使代码错误,我也希望至少会得到某种垃圾输出,但是在微控制器完全断开的情况下,我会得到更多的输出。我知道它正在输出信号,因为我可以将其连接到不带移位寄存器的LED上,并看到它们以不同的强度点亮,但是没有示波器可以实际查看信号。

这是代码,在文件顶部包含输出端口的定义,因此很清楚正在执行的操作:

#define DDR_SREG    DDRD
#define PORT_SREG   PORTD
#define SRCK        _BV(PORTD0)
#define RCK         _BV(PORTD1)
#define SER         _BV(PORTD2)

void display_write(uint8_t data)
{
    char i;

    PORT_SREG &= ~RCK;           // latch low

    for (i = 0; i < 8; ++i) {
        PORT_SREG &= ~SRCK;     // clock low
        if (data & 1)           // serial out
            PORT_SREG |= SER;
        else
            PORT_SREG &= ~SER;
        PORT_SREG |= SRCK;      // clock high
        data >>= 1;             // shift data
    }

    PORT_SREG |= RCK;           // latch high
}

最佳答案

解决了。经过更多研究后,很明显,该移位寄存器具有开漏输出,无法提供电流(它们只能吸收电流)。相应地调整布线,我能够使移位寄存器满足我的要求。

关于c - 试图对TPIC6C595移位寄存器进行位冲击但无输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31734283/

10-11 15:15