0

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

发生的情况是移位寄存器没有输出,所有漏极输出都为低(用万用表测试)。当我从微控制器断开 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
}
4

1 回答 1

0

解决了。在做了更多研究之后,很明显这个移位寄存器具有开漏输出并且不能提供电流(它们只能吸收电流)。相应地调整接线,我能够让移位寄存器的工作令我满意。

于 2015-07-31T23:34:39.473 回答