具有并行输出和串行端口Arduino的多路数据总线显示。
本文介绍了多路复用ATMEL 328P微处理器(Arduino NANO)的端口D的使用的方法,以便为显示器提供备用的字节输出,并通过串行通道进行交换。
我以某种方式组装了一种用于监测不必要元素中一氧化碳(CO)含量的设备-诺基亚N95显示器,Arduino NANO显示器具有不良端口(D3和D11,由于在调试高压发生器时未成功短路至+400伏而损坏),板播放声音叮咬和一氧化碳传感器MQ7。 所有这些细节在某种程度上都是错误的(传感器除外),在任何其他项目中都找不到。 奇怪的是,事实证明该设备在该国使用炉灶时非常有用。 事实证明,2019年夏天不热,我在7月几乎每天都对火炉进行加热,持续了几个星期,将愉快的(冥想中的火焰)与有用的(回收锯切的垃圾树)结合在一起。 事实证明,控制燃烧状态非常容易,对挡板的所有操作都立即反映在设备的读数中,从而可以智能地控制火炉。 本文未介绍该设备; Internet上有很多此类设备可满足您的各种口味。 我的设备的一个显着特征是可以基于对存储的参考曲线的比较并实时获得的结果来连续监测CO传感器的健康状况的功能,以及通过将上一周期中存储的数据与当前数据进行比较而获得的对CO水平变化的高反应率。
本文的重点是通过并行字节数据交换提高处理器和显示器的速度。
该显示器具有并行字节交换功能,尽管使用了我所知的所有方法来提高交换速率,但结果却很慢。 主要原因是需要将数据字节按位输出到不同端口的不同位,因为Arduino Nano没有一个宽度为一个字节的完整端口。 与将字节写入寄存器相比,此输出模式所需的时间大约多8倍。 NANO有一个完整的端口D,但其最低有效位用于硬件串行端口,通过该串行端口,草图可以加载到处理器中,并且可以与主机交换草图。
我发现了一种使用逐行显示输出的相对简单的方法。 此方法包括交替使用端口D将数据输出到显示器和通过串行通道交换数据。
所提出的方法可以显着提高与显示器的整体交换速度(根据我的测量,约为3倍)。 单词“积分”是指在宏级别上执行屏幕渲染操作的总时间。 在原子I / O级别上测量时间可能会带来更大的增益(在相同数量级的区域内)。
按照以下方式在特殊组装的模型(请参见图1)上进行测量:
- 在测试程序中,将时间戳与输出一起放置到主机上。
- 显示器连接到D2-D9引脚,加载了测试程序,其中通过逐位分配字节来输出字节。
- 显示器连接到端子D0-D7,已加载测试程序,其中使用PORTD = data命令输出字节。

图1.用于测试输出多路复用的布局照片程序完全相同,通过将SendDat和SendCom例程的名称分别更改为SendDat1和SendCom1来切换输出方法。
程序到内置系列监视器的输出记录在OneNote中并进行了分析。
图2.测量在字节输出模式下显示所需的时间
图3.位输出模式下屏幕时间的测量测量结果总结在表1中。
表1.汇率综合收益所提出的方法的缺点是需要使用附加命令来切换显示模式和通过串行端口进行交换。
在从主机接收数据时,您也可能会遇到一些困难,只有明确包含串行通道模式才能进行接收,这需要草图中基于时间的清晰组织。
处理器手册的研究提供了以下信息:串行端口模式的包含在硬件级别拦截了对支路D0和D1的控制。 这意味着尝试从草图控制支腿将无法获得理想的结果。
对该问题的进一步研究表明,如果您未在草图中使用Serial.open()命令包括串行端口,则整个端口D仍由用户使用。 您可以使用DDRD = 0xFF命令在所有分支上将端口置于输出模式,并使用PORTD = data命令同时输出整个字节,其中data变量包含输出数据。
将端口D置于输出模式一次就足够了(在Setup中)。 随后的串行通信模式的开-关不影响端口D模式-它保持在8位并行输出模式。 当串行交换模式打开时,端子D0和D1将分别进入接收和发送模式。 无论D1位的先前状态如何,“ 1”将出现在D1引脚上,并且在串行传输模式开启时,除符号传输的时刻外,“ 1”将始终在该引脚上。 当关闭串行传输模式时,输出D0和D1将进入输出状态,并且来自输出寄存器的信号将出现在它们上。 如果在输出寄存器中代替D1的位置为“ 0”,则将在输出端生成一个负沿,这将导致伪字符传输到串行通道。
现在让我们考虑一下问题-但是端口D的这种使用会阻止下载程序吗? 当程序加载时,当设置DTR信号时,FT232RL USB端口控制器(或其模拟CH340)产生的脉冲将处理器复位。 DTR信号从1变为0,并且通过电容器的负压降会使处理器复位。 重置后,处理器打开串行端口,启动引导加载程序,并接收程序代码。 因此-更改端口D的操作模式不会干扰草图的正常加载。
如果草图需要输出到串行端口,那么在输出命令之前,使用Serial.open()命令就足够了。
但是,有一些微妙之处。 这是因为FT232RL芯片的RxD输入保持连接到TxD输出,并且去往显示器的数据被接收并进一步发送到主机。 这些数据看起来像噪音,尽管实际上并非如此(图4)。
图4.无阻塞的字节输出模式下的屏幕视图有两种方法可以处理这种不必要的信号。
第一种方法是软件。 它包含以下事实:输出之前的草图使用Serial.println()命令在输出有用信息之前创建新行。 这将使主机更容易分析输入的行并突出显示草图中的有用信息。
第二种方法是硬件。 FT232RL的RxD输入通过1kΩ电阻连接到TxD输出。 要阻止信息传输,只需将输入RxD FT232RL连接到“ 1”即可。 使其成为最简单的方法是Arduino的免费结论之一。 我使用了D8的输出。 为了执行此操作,我将标称值为1 kOhm的RP1B电阻器的端子7焊接到了末端,并在其末端带有连接器,使之穿过板上的孔进行机械固定。 在图5中,该连接用红线显示,图6显示了焊接点的照片。
图5. Arduino Nano电路的一部分
图6.在Arduino NANO中焊接额外导线的位置此机制的工作原理如下:重置后,D8引脚处于高阻抗输入模式,并且Arduino开发板不会干扰程序加载到该板上的程序的正常运行。
当需要开始控制草图中的显示时,将D8引脚切换到活动引脚模式,将其设置为“ 1”(这将阻止数据从TxD Atmel328P引脚传输到RxD FT232RL引脚),然后执行Serial.end();命令。 该过程很重要,因为在关闭串行传输模式之后,Dx位出现在TxD引脚上,该位置从该端口的前一个字节记录存储在端口D的输出寄存器中。 如果位D1为“ 0”,则当串行传输模式关闭时,处理器支路将从“ 1”切换为“ 0”,这将在串行通道上产生寄生字符传输。
在调试过程中,事实证明,在阻塞串行通道之前,我们必须等待整个缓冲区到主机的传输结束,否则会丢失一些传输的数据。
当草图需要通过串行端口进行数据传输时,有必要通过设置引脚D8上的读取模式来打开串行传输模式并关闭对串行数据传输的阻止。
为了执行这些任务,向草图添加了两个例程:
void s_begin() { Serial.begin(115200); // TxD USART. TxD "1", RxD pinMode(8, INPUT); // RxD FT232RL "1", RxD FT232RL }
void s_end() { Serial.flush(); // pinMode(8, OUTPUT); // FT232RL "1" . D8_High; // Serial.end(); // . TxD RxD D0(RxD) D1(TxD) D }
完整的测试程序可以在
这里进行 。