该代码适用于带有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/