谁帮我看看这个595三片级联的逻辑分析仪时序是否有问题啊?
本帖最后由 长长牙齿 于 2012-12-6 23:58 编辑话说我用3片595级联,驱动24粒led,然后逐行送入24点阵字模,这样挥舞起来,就可以看到在空中人工扫描的汉字了;
这个是背景;
其中用到latch和shiftout,日前进了一台usbee ax pro的逻辑分析仪,测试了data、clock、latch 的时序,发现点问题
先看图 本帖最后由 长长牙齿 于 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,时序图完全一样啊????
谁能解释这个问题呢???
PS:今天分析仪到手,高兴啊。。。。这个小东西,把很多看不见摸不着的东西都能抓到了,价钱比个逻辑笔贵不了几个钱,买对了! 夜深人静了,自己顶。 长长牙齿 发表于 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 09:10 static/image/common/back.gif
分析仪看着很爽!万用表用户表示羡慕
隐约记得官方的ShiftOut库好像有BUG
你重写了shiftout?好吧,有时间我用你的代码测下时序,呵呵:) 有digitalWrite(latchPin, HIGH);代码贴上来时搞掉了;呵呵;
delay(2)是计算了视觉暂留和挥舞的速度调出来的,和写数据倒是无关; 我用的就是官网的电路搭建,他也是这么写的代码啊。。。。 官网代码如下:
//**************************************************************//
//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);
}
}
别是底层库文件的BUG。。。 这是官网的原理图
http://arduino.cc/es/uploads/Tutorial/ShftOut_Schm1.gif 这个是连线图,我就是按照这个搭建的。
http://arduino.cc/es/uploads/Tutorial/ShftOutExmp1_3.gif 搞了两天,终于明白了不是软件的问题。官网电路搭建中,为了让latch在其他信号准备好的情况下才拉低起效,人为的在latchpin上面加了1μF的电容,正是这个电容,起到了延时的效果。
所以代码才可以毫不犹豫的在shiftout后直接发digitalwrite(latchPin,HIGH)的指令 (595的latchPin是在上升沿起效的),而不用delay一些时间。
经常看到软件换取硬件的简化,这个案例也算是硬件简化软件的一个特别的情况吧。
而且从抓下来的逻辑图看,shiftout的效率还是非常高的,应该足以实现不闪烁的PWM 回头发一个拿掉1μF电容的逻辑图大家看看,生动的体现了电容的延时作用。
页:
[1]