第6部分:优化的Arduino代码
实现前一节中讨论的优化,我们将编写一个修改的ARDIIO草图,并尝试以最大速度扫描矩阵阵列。
注意,我们牺牲了一些可移植性(由于直接的端口操作),代码现在特定于Arduino Uno和具有兼容端口/头映射的板。我们还消除了输出间隔和换行符,因此我们必须创建一个新的接收应用程序(在第8部分中)来理解发送的数据。
性能改进结果显示在下一页。
下载代码:fastmarixarray.zip
代码:
/**********************************************************************************************************
*项目:FastMatrixArray.ino
*签署人:Chris Wittmier@Sensitronics LLC
*上次修订日期:2014年4月22日
*说明:演示Sensitronics的16x10元件电阻直通模式矩阵。扫描
*电子设备包括2个HCT595移位寄存器和2个4051多路复用器,它们连接到Arduino Uno。
*这个草图是Uno特定的,并且优化了速度。
**********************************************************************************************************/
/**********************************************************************************************************
*宏/引脚定义
**********************************************************************************************************/
#定义波特率115200
#定义行计数10
#定义列计数16
#定义PIN_ADC_输入A0
#定义管脚移位寄存器数据2
#定义引脚移位寄存器时钟3
#define PIN_MUX_CHANNEL_04//CHANNEL PIN 0、1、2等必须连接到连续的Arduino PIN
#定义PIN_MUX_CHANNEL_15
#定义PIN_MUX_信道
#define PIN_MUX_INHIBIT_0 7//INHIBIT=active low enable。所有mux IC启用必须连接到连续的Arduino管脚
#定义PIN_MUX_INHIBIT_18
#define SET_SR_DATA_HIGH()端口d |=b0000100
#define SET_SR_DATA_LOW()端口d&=~b0000100
#define SET_SR_CLK_HIGH()端口d |=b0001000
#define SET_SR_CLK_LOW()端口d&=~b0001000
#定义每个MUX 8行
#定义MUX_计数2
#定义通道PINS peru MUX 3
#定义数据包结束字节0xFF
#定义MAX_SEND_VALUE 254//reserve 255(0xFF)以标记数据包结束
#定义压缩极限254
#define MIN_SEND_VALUE 1//低于此阈值的值将被视为零并发送
#ifndef cbi公司
#定义cbi(sfr,位)(sfr字节(sfr)&=~~ BV(位)
#恩迪夫
#ifndef附属履行机构
#定义sbi(sfr,位)(sfr字节(sfr)=BV(位)
#恩迪夫
/**********************************************************************************************************
*全球性的
**********************************************************************************************************/
int current_enabled_mux=mux_COUNT-1;//init to number of last mux so enabled mux increments to first mux on first scan。
int compressed_zero_count=0;
/**********************************************************************************************************
*设置()
**********************************************************************************************************/
无效设置()
{
串行开始(波特率);
pinMode(PIN_ADC_输入,输入);
pinMode(PIN_移位寄存器数据,输出);
pinMode(PIN_移位寄存器时钟,输出);
pinMode(PIN_MUX_CHANNEL_0,输出);
pinMode(PIN_MUX_CHANNEL_1,输出);
pinMode(PIN_MUX_CHANNEL_2,输出);
pinMode(PIN_MUX_INHIBIT_0,输出);
pinMode(PIN_MUX_INHIBIT_1,输出);
sbi(ADCSRA,ADPS2);//ADC预分频器设置为CLK/16
cbi(ADCSRA,ADPS1);
cbi(ADCSRA,ADPS0);
}
/**********************************************************************************************************
*循环()
**********************************************************************************************************/
无效循环()
{
压缩计数=0;
对于(int i=0;i<行计数;i++)
{
刚毛(i);
shiftColumn(真);
对于(int j=0;j<列计数;j++)
{
int raw_reading=模拟读取(PIN_ADC_输入);
字节发送读取=(字节)(低字节(原始读取>>2));
shiftColumn(错误);
发送压缩(发送读取);
}
}
如果(压缩的计数大于0)
{
串行写入((字节)0);
串行写入(字节)压缩计数;
}
串行写入(字节)数据包结束字节;
}
/**********************************************************************************************************
*setRow()-允许单个mux IC和通道读取指定的矩阵行。digitalWrite()尚未
*在这个函数中被替换,因为mux的变化相对较少。
********************************************************************************* |