This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SN74HC595:SRCLK 保持高电平时、SRCLR 似乎不会实际清除移位寄存器

Guru**** 2394305 points
Other Parts Discussed in Thread: SN74HC595

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/logic-group/logic/f/logic-forum/792688/sn74hc595-srclr-does-not-seem-to-actually-clear-the-shift-register-when-srclk-is-held-high

器件型号:SN74HC595

你(们)好。

我遇到了一个小问题-无论是对文档的理解还是对文档本身的理解[ www.ti.com/lit/ds/symlink/sn74hc595.pdf]-只有我才会使用具有反相功能的引脚名称而不进行换行[即通过写入"SRCLR high"、我的意思是"\overline{SRCL}" is high]。

关于我的设置:我使用5 V 和16 MHz 的 Arduino Uno [Atmega328p]来控制 GM1803XYF E4 SN74HC595N。

我的调查结果是:

-如果1:

-输出上的 OE 低电平、RCLK 高电平、SRCLK 高电平、SRCLR 高电平和0xff

-我现在可以使 SRCLR 为低电平、RCLK 为低电平、RCLK 为高电平-> 0x00输出[没关系]

 接下来、我可以使 SRCLR 处于高电平、RCLK 处于低电平、RCLK 处于高电平-> 0xff 状态(在输出端[这是意外的])

-何时2:

-输出上的 OE 低电平、RCLK 高电平、SRCLK 低电平、SRCLR 高电平和0xff

-我现在可以使 SRCLR 为低电平、RCLK 为低电平、RCLK 为高电平-> 0x00输出[没关系]

 接下来、我可以使 SRCLR 处于高电平、RCLK 处于低电平、RCLK 处于高电平-> 0x00输出[这是预期的]

SRCLK 必须为低电平才能使 SRCLR 产生永久性影响是否正确? 我是否在文档中未阅读过该内容? 我的部件是否有故障? 或者我有什么问题吗?

我希望,我能让我自己清楚清楚,如果没有,请不要犹豫,问什么。

此致、

Johannes

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如表1所示、只有 SRCLK 上的正边沿很重要;SRCLK 的状态不应产生任何其他影响。

    请显示在拉低 SRCLR 时生成高 SRCLK 信号的 Arduino 代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    晚上好。

    由于我的代码有点复杂、我只想提供以下摘录:

       //电源电压
       GND:::settype (AvrInputOutput:::output_low);
       VCC:::settype (AvrInputOutput:::output_high);

       //引脚设置
       NOE::settype (AvrInputOutput:::output_low);//启用 输出
       RCLK::settype (AvrInputOutput:::output_high);
       SRCLK::settype (AvrInputOutput:::output_high);
       nSRCLR::settype (AvrInputOutput:::output_high);//不清除

       //移入0xff
       SER::settype (AvrInputOutput:::output_high);
       对于(uint8_t pinNumber = 0;pinNumber < 8;+pinNumber)
       {
           SRCLK::clearPort();
           SRCLK::setPort();
       }
       //清除 SER
       SER:clearPort();
       //显示移入值
       RCLK::clearPort();
       RCLK::setPort();

       //----------
       //现在清除移位寄存器
       nSRCLR::clearPort();

       //<-此处 Q_H'按预期被清除

       //显示已清除
       RCLK::clearPort();
       RCLK::setPort();

       //<-这里按预期清除了 Q_x

       //现在应该被清除,所以清除信号
       nSRCLR::setPort();

       //<-这里、Q_H'再次变为高电平

       //显示已清除
       RCLK::clearPort();
       RCLK::setPort();

       //<-这里所有 Q_x 也都是高电平

    这正是我在上面用文字所写的内容。

    如需完整参考、请参阅[对应于上面第1点]:   github.com/.../src

    可以在此处找到一个按预期工作的经过细微修改的版本[对应于上面的第2点]:  github.com/.../src


    我还将附加生成的汇编器代码[为清楚起见、使用-O3而不是-OS 编译]、以了解下面不起作用的示例[第1点]-但为了理解这一点、首先必须了解以下连接:

    GND        -> D9        -> B1
    nSRCLR -> D11     -> B3
    SRCLK   -> D12     -> B4
    RCLK      -> D13     -> B5
    NOE         -> A0        -> C0
    SER         -> A1        -> C1
    VCC         -> A3       -> C3

    对于 SBI [设置 I/O 寄存器中的位]和 CBI [清除 I/O 寄存器中的位]、寄存器地址如下:

    寄存器| DDR |端口|引脚

    B            |  0x04 | 0x05 |  0x03

    C            |  0x07 | 0x08 | 0x06

    但是,我们可以肯定地看到,编译后的代码执行了我所期望的操作:

    0000007a


     7A:   45 9a          SBI   0x08、5   ;8   <-端口 C5高电平<-启用移位寄存器上的 LED
     7C:   21 9a          SBI   0x04、1   ;4   <- DDR B1高电平<- GND 输出
     7E:   29 98          CBI   0x05、1   ;5   <-端口 B1高电平<- GND 高电平
     80:   3B 9a          SBI   0x07、3   ;7   <- DDR C3 HIGH <- VCC 输出
     82:   43 9a          SBI   0x08、3   ;8   <-端口 C3高电平<- VCC 高电平
     84:   38 9a          SBI   0x07,0   ;7
     86:   40 98          CBI   0x08、0   ;8   <- C0输出低电平<- NOE 低电平    <-输出被启用
     88:   25 9a          SBI   0x04、5   ;4.
     8A:   2D 9a          SBI   0x05、5   ;5   <- B5输出高   电平<- RCLK 高电平
     8C:   24 9a          SBI   0x04、4   ;4.
     8e:   2C 9a          SBI   0x05、4   ;5   <- B4输出高电平    <- SRCLK 高电平
     90:   23 9a          SBI   0x04、3   ;4.
     92:   2B 9a          SBI   0x05、3   ;5   <- B3输出高    电平<- nSRCLR 高电平    <-请勿清除移位寄存器
     94:   39 9a          SBI   0x07,1   ;7.
     96:   41 9a          SBI   0x08、1   ;8   <- C1输出高    电平<- SER 高电平
     98:   2C 98          CBI   0x05、4   ;5   <-端口 B4 低          <- SRCLK 低电平
     9A:   2C 9a          SBI   0x05、4   ;5   <-端口 B4高          <- SRCLK 高电平
     9C:   2C 98          CBI   0x05、4   ;5.
     9E:   2C 9a          SBI   0x05、4   ;5   <-第二次
     A0:   2C 98          CBI   0x05、4   ;5
     A2:   2C 9a          SBI   0x05、4   ;5   <第三次
     A4:   2C 98          CBI   0x05、4   ;5.
     A6:   2C 9a          SBI   0x05、4   ;5   <-第四次
     A8:   2C 98          CBI   0x05、4   ;5.
     AA:   2C 9a          SBI   0x05、4   ;5   <-第五次
     交流:   2C 98          CBI   0x05、4   ;5.
     AE:   2C 9a          SBI   0x05、4   ;5   <第六次
     B0:   2C 98          CBI   0x05、4   ;5
     B2:   2C 9a          SBI   0x05、4   ;5   <-第七次
     B4:   2C 98          CBI   0x05、4   ;5.
     B6:   2C 9a          SBI   0x05、4   ;5   <-第八次--      现在0xff 应该移入
     B8:   41 98          CBI   0x08、1   ;8   <-端口 C1低   电平<- SER 低电平
     BA:   2D 98          CBI   0x05、5   ;5   <-端口 B5低    <- RCLK 低电平
     BC:   2D 9a          SBI   0x05、5   ;5   <-端口 B5高    电平<- RCLK 高电平    --现在在输出 Q_x 上可见、该0xff 在内部
     应为   :2B 98          CBI   0x05、3   ;5   <-端口 B3为低    电平<- nSRCLR 为低    电平<-这应清除移位寄存器
     C0:   2D 98          CBI   0x05、5   ;5   <-端口 B5为低电平
     C2:   2D 9a          SBI   0x05、5   ;5   <-端口 B5高    电平<- RCLK 高电平    --现在可在内部的0x00的输出 Q_x 上看到
     C4:   2B 9a          SBI   0x05、3   ;5   <-端口 B3为高    电平<- nSRCLR 为高电平    <-这应该使移位寄存器保持清零、对吧?
     C6:   2D 98          CBI   0x05、5   ;5   <-端口 B5为低电平
     C8:   2D 9a          SBI   0x05、5   ;5   <-端口 B5高    电平<- RCLK 高电平    --现在在输出 Q_x 上可见、0xff 在内部并且 Q_H'也是高电平
     CA:   80 e0          LDI   R24、0x00   ;0 <- Atmega 328p 正在清理其寄存器...
     CC:   90 e0          LDI   R25,0x00   ;0
     CE:   08 95          转台

    再次感谢您的任何进一步想法。

    您好!

    Johannes

    PS:以可读[.lst] 和可刷写[.hex -例如通过 avrdude]格式附加了为非工作用例生成的汇编代码:

    e2e.ti.com/.../6545.HexAndAssemblerFiles.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的代码看起来正常。 (但在"工作"分支中、SRCLK 应初始化为低电平。)

    我在这里没有595可用于测试、但据我所见、根据数据表、您所描述的内容不可能实现。

    Wild Guess:尝试在您移入任何内容之前重置设备。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、SRCLK 本应初始化为低电平-谢谢。

    感谢您迄今为止的想法。

    也许其他人有595、可以测试他们是否能够再现我经历的行为?

    您好!

    Johannes

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    PS:我想补充的是、所用 Arduino Uno 以16MHz 运行[即每时钟62.5ns]-但是、我尝试在拉低 nSRCLR 引脚后引入超过1秒的延迟-除了延迟之外、没有注意到任何其他影响。 此外、16MHz 远低于595的指定最大工作频率[nSRCLR 为低电平所需的20ns ]。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Johannes、您好!
    您能否提供 HC595和相关连接的原理图? 我不需要查看您的整个电路板、但了解进入器件的所有信号是如何布线的、以及器件上是否有其他任何信号(例如、半米的同轴电缆可能会对信号完整性产生巨大影响)会很有帮助。

    我个人在许多应用中使用过 HC595、我看到许多客户都使用过它。 我看到的最常见错误是时钟引脚输入缓慢或嘈杂(非单调)、这通常是由无源滤波(RC)或相对较长的传输线(>25cm)引起的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Emrys 您好!
    也许我对我之前选择的词语有些含糊-使用"时钟"、我指的是 Arduino 中的时钟- 595本身本身不是"计时"的。 我只想在需要时对相应的引脚应用更改[请参阅上面的代码示例]。
    但要说明的是:我尝试将 SRCLK 设置为高电平,然后等待一秒钟,然后将 SRCLR 设置为低电平,然后等待一秒钟,... -无任何结果。

    此外、与上面工作示例的唯一区别[2]。] 是 SRCLK 为高电平、而不是低电平、同时 SRCLR 为低电平 Q_H'、并且移出的 Q_x 读出为低电平。 因此、我不会怀疑这是一个信号问题。

    如果您仍然认为看到我的试验电路板会以任何方式有所帮助、请这样说、那么我将尝试上传一张照片。 它看起来不是很好-它是一个带有铜线的手接试验电路板、用于连接正确的引脚-但出于我的目的、它确实起作用[至少这是我的想法]。

    感谢您的观看、
    Johannes
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Johannes、您好!
    是的、我理解您的意思。

    595的 SRCLK 引脚也是时钟引脚、RCLK 引脚也是如此-在输入信号的上升沿触发。 当我说"时钟引脚"时、我将讨论595器件的 SRCLK 或 RCLK 引脚。 慢速或高噪声信号可能会导致多个触发器产生不正确的输出。

    显然、"慢速"信号是上升或下降时间大于~100ns 的信号。 这通常是通过测量(信号的示波器截图)或根据原理图值和布局寄生效应进行计算得出的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Johannes、您好!
    我只是想与您联系、看看您是否有任何幸运地在您的最后解决此问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Emrys:
    由于这是一个个人项目、我在最后几天找不到时间。 如果我找到时间、我将上传我的硬件图片-如果您希望电容有问题、甚至可以在示波器上检查信号。
    但现在我选择使用第2点中描述的方法。 在我的第一个帖子中-当 SRCLK 保持低电平时、595会按预期清除。
    您好!
    Johannes
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我完全理解-我在家里还有个人项目、有时会坐在我的工作台上、未经测试、长达数周。

    我现在将此主题标记为 TI 认为已解决 、但如果您有其他信息或其他问题、请随时返回。  该主题将在几周后自动锁定、而不会发布任何帖子、但您可以使用 论坛右上角的"提问"相关问题按钮、稍后继续该主题。