成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

arduino. Shiftout.


在这里,您可以了解Arduino ShiftOut如何工作以及它有多快。你 可以使用该功能来控制许多不同类型的芯片。为了 example control a serial device e.g. BMP280 或创建更多输出。 74HC595..

arduino. Shiftout.是纯粹的 串行输出接口的软件实现;等价物 硬件接口是SPI(尽管ShiftOut()表示该接口的一半I.。数据输出部分)。

arduino. Uno ShiftOut()速度 - 时序图

许多芯片使用串行接口来减少物理的数量 引脚,因此而不是使用并行处理器总线传输数据8或 一次16位,两个信号(时钟和数据)将数据发送到 设备,一次一点。

在16位设备的情况下,"想一想16位ADC", you save 14 别针。这通常意味着设备将适合微小的表面贴装 包,使您可以将更多功能适合PCB上的同一区域。

SPI和Arduino ShiftOut之间的差异

  • spi很快。
  • SPI仅从特定引脚运行。
  • SPI适应不同的时钟类型。通常很高
  • SPI同时传输和接收数据。
  • ShiftOut很慢。
  • ShiftOut只能传输数据。
  • ShiftOut可以从任何数字引脚工作。
  • 转移可以应用于多个引脚。

由于ShiftOut函数不限于特定引脚,因此您可以将不同的设备连接到不同的引脚。

提示: 您可以在不同的引脚上有多个转移实例。

班次起作用

arduino. ShippOut使用两个信号引脚(任何数字输出引脚 - 即大部分 它们!)并使用时钟信号和数据信号 数号() function.

换档源代码

arduino. ShippOut的源代码包含在Wiring_shift.c中。路径是:

C:\ Program Files \ Arduino \硬件\ Arduino \ Avr \ Cores \ Arduino \ wiring_shift.c

注意在Arduino.h中定义LSBFirst等常量,在同一目录中。

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));

		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);
	}
}

ShiftOut()的参数

有四个参数:

  1. 数据引脚(Arduino PIN码)。
  2. 时钟引脚(Arduino PIN码)。
  3. 位顺序(LSBFirst(0)或MSBFirst(1))。
  4. 值:具有8位的类型。

基本操作是使用for-循环循环通过每个位。 然后找出当前位的值,如果设置,则输出高,或 如果重置,则输出低电平。然后脉冲时钟信号高,然后低。

以这种方式,数据线依次设置为每位的值 时钟是脉冲的。接收芯片接受数据线输出 (从ShiftOut DataPin)作为输入。数据被转移到 这芯片上的时钟从低到高。您可以使用 这种方式驱动的过程 74HC595. 串行平行输出芯片。

shifout()代码如何工作?

代码通过使用位移运算符来工作'<<'它将变量中的所有位移到左侧。

假设Bitorder是LSBFirst,然后是第一个循环迭代i 是零,术语(1<<i)将左侧的变量转移到零个位置 即它与值1离开变量。

笔记: 在C临时变量中用于保持中间值。

生成步行'one'

这是零(b0)。

    00000001B

下次循环周围变量保存值1左移一个地方:

    00000010B

这重复了6次
   
    00000100B
    00001000B
    00010000B
    00100000B
    01000000B
    10000000B 

以这种方式走路'1'创建从b0到b7移动。

对于MSBFirst的比特权,索引的值被操纵到 为每一个值从b7移动到b0。所以走路'1' walks in the 从位7开始的方向。

笔记: MSBFirst,代码略微慢,因为发生了8个x减去操作。

提取位值

要弄清楚Val的比特值,这一步一个值是'ANDed' val。这导致每个位的值不同。例如 如果位6中设置为Val,则值输出将是POW(2,6)= 64。 如果未设置,则该值将为零。

纯化位值

两个感叹号看起来像一个不同的数学运算符,但是 事实上,它们实际上只是两个反转动作。感叹号是一个 逻辑反转运算符,而不是位反转运算符。

第一个反转动作会改变'AND' operation 成真或假值。即如果是结果>0 then output false, 如果结果= 0输出为true。

此时,逻辑被反转,因此第二反转运算符 '!' flips it back.

信号输出

然后使用DigitalWrite()使用此值 功能将数据值输出到所选数据纳。

arduino. Shiftout()有多快?

该函数使用DigitalWrite()所以它应该是值的 speed of 数号() - 在该链接脉冲周期(用于Arduino Uno) is 7us.

由于需要8个脉冲,ShiftOut()应该需要大约56us加上比特操纵和循环循环 for-loop.。事实上,ShiftOut中的额外操作()这次加倍(见下文)。

测试Arduino ShiftOut()的示例程序

以下草图在引脚7上输出标记信号(您可以 触发串行数据开始的范围)并备用数据 使用模式0x55和0x99 - 交替数据模式。

// Demonstration code for shiftOut
在 t MARK = 7;
在 t SERCLK = 6;
在 t SERDATA = 5;

void setup() {

   pinMode(MARK, OUTPUT);
   pinMode(SERDATA, OUTPUT);
   pinMode(SERCLK, OUTPUT);
   noInterrupts();
}

void loop() {
static byte d = 0x55;

   digitalWrite(MARK, HIGH);
   shiftOut(SERDATA, SERCLK, MSBFIRST, d);
   digitalWrite(MARK, LOW);

   digitalWrite(SERDATA, LOW);   //  Stop scope output flicker.
   delay(10);
   d = ~d;
}

示波器输出时间实际上 121us(最低信号标记)。时钟信号的时期是:15.2Us(〜66kHz)。

当使用LSB时,标记信号的宽度增加到122us。

但是,您通常会使用标记信号作为芯片选择, 所以它是可实现的时机的代表(CS通常是 倒置使其处于活跃低)。

    顶线显示引脚6上的时钟信号
    接下来是引脚5上的X55(MSB第一)的数据输出。
    接下来是引脚5上0x99(MSB第一)的数据输出(存储图像的覆盖层)。
    接下来是引脚7上的标记(触发信号)。

arduino. Uno ShiftOut()速度 - 时序图

图像显示时钟定时的游标。

移位时钟定时示波器图



新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部