长长牙齿 发表于 2012-12-3 23:29:32

谁帮我看看这个595三片级联的逻辑分析仪时序是否有问题啊?

本帖最后由 长长牙齿 于 2012-12-6 23:58 编辑

话说我用3片595级联,驱动24粒led,然后逐行送入24点阵字模,这样挥舞起来,就可以看到在空中人工扫描的汉字了;
这个是背景;

其中用到latch和shiftout,日前进了一台usbee ax pro的逻辑分析仪,测试了data、clock、latch 的时序,发现点问题

先看图

长长牙齿 发表于 2012-12-3 23:30:13

本帖最后由 长长牙齿 于 2012-12-3 23:33 编辑

白色线条是数据,红色是latch,橙色是clock;

核心语句如下:
for ( int row = 0; row < 72; row++){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, ~ilu );// 3rd 595 in hi position
    shiftOut(dataPin, clockPin, LSBFIRST, ~ilu );// 2ed 595 in mid position
    shiftOut(dataPin, clockPin, LSBFIRST, ~ilu );
    delay(2);


怎么会是这种情况呢,难道在前的digitalWrite发的时序,反倒跑到shiftOut的后面去了???
你要说digitalWrite效率低,慢,我把此语句更改为 PORTB = 0x0,时序图完全一样啊????

谁能解释这个问题呢???
   

长长牙齿 发表于 2012-12-3 23:36:02

PS:今天分析仪到手,高兴啊。。。。这个小东西,把很多看不见摸不着的东西都能抓到了,价钱比个逻辑笔贵不了几个钱,买对了!

长长牙齿 发表于 2012-12-3 23:56:29

夜深人静了,自己顶。

幻生幻灭 发表于 2012-12-4 09:10:14

长长牙齿 发表于 2012-12-3 23:30 static/image/common/back.gif
白色线条是数据,红色是latch,橙色是clock;

核心语句如下:


分析仪看着很爽!万用表用户表示羡慕{:3_47:}

隐约记得官方的ShiftOut库好像有BUG
解决方法
1. 可以参考下官方的ShiftOut教程(好像是两片级联)
2. 那个delay(2)是干什么的?
3. 最后面不需要 digitalWrite(latchPin, HIGH);?
4. 参考下我那个的代码吧(不过是两片级联)

长长牙齿 发表于 2012-12-4 11:34:23

幻生幻灭 发表于 2012-12-4 09:10 static/image/common/back.gif
分析仪看着很爽!万用表用户表示羡慕

隐约记得官方的ShiftOut库好像有BUG


你重写了shiftout?好吧,有时间我用你的代码测下时序,呵呵:)

长长牙齿 发表于 2012-12-4 11:36:11

有digitalWrite(latchPin, HIGH);代码贴上来时搞掉了;呵呵;
delay(2)是计算了视觉暂留和挥舞的速度调出来的,和写数据倒是无关;

长长牙齿 发表于 2012-12-4 11:38:31

我用的就是官网的电路搭建,他也是这么写的代码啊。。。。

长长牙齿 发表于 2012-12-4 12:39:23

官网代码如下:

//**************************************************************//
//Name    : shiftOutCode, Hello World                              
//Author: Carlyn Maw,Tom Igoe, David A. Mellis
//Date    : 25 Oct, 2006   
//Modified: 23 Mar 2010                                 
//Version : 2.0                                             
//Notes   : Code for using a 74HC595 Shift Register         //
//          : to count from 0 to 255                           
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}

void loop() {
// count from 0 to 255 and display the number
// on the LEDs
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
}
}

bg5cdu 发表于 2012-12-5 10:24:39

别是底层库文件的BUG。。。

长长牙齿 发表于 2012-12-5 14:42:38

这是官网的原理图

http://arduino.cc/es/uploads/Tutorial/ShftOut_Schm1.gif

长长牙齿 发表于 2012-12-5 14:44:52

这个是连线图,我就是按照这个搭建的。

http://arduino.cc/es/uploads/Tutorial/ShftOutExmp1_3.gif

长长牙齿 发表于 2012-12-6 23:58:11

搞了两天,终于明白了不是软件的问题。官网电路搭建中,为了让latch在其他信号准备好的情况下才拉低起效,人为的在latchpin上面加了1μF的电容,正是这个电容,起到了延时的效果。

所以代码才可以毫不犹豫的在shiftout后直接发digitalwrite(latchPin,HIGH)的指令 (595的latchPin是在上升沿起效的),而不用delay一些时间。

经常看到软件换取硬件的简化,这个案例也算是硬件简化软件的一个特别的情况吧。

而且从抓下来的逻辑图看,shiftout的效率还是非常高的,应该足以实现不闪烁的PWM

长长牙齿 发表于 2012-12-6 23:59:45

回头发一个拿掉1μF电容的逻辑图大家看看,生动的体现了电容的延时作用。
页: [1]
查看完整版本: 谁帮我看看这个595三片级联的逻辑分析仪时序是否有问题啊?