基于MARIE.JS实现双传感器数据存储与平均值计算方案咨询
MARIE.JS 传感器数据处理程序实现思路
核心流程概述
程序分为三个核心阶段:数据采集存储 → 平均值计算 → 触发式输出,全程基于MARIE的16位指令集和内存操作实现。
1. 初始化:内存与变量规划
先在MARIE内存中预定义关键变量和存储区,建议分配如下(地址可根据实际调整):
Sensor1_Start:传感器1数据存储起始地址(如X100)Sensor2_Start:传感器2数据存储起始地址(如X200)Count1:传感器1的样本计数(初始值0)Count2:传感器2的样本计数(初始值0)Avg1:传感器1的平均值存储地址Avg2:传感器2的平均值存储地址Ptr1:传感器1数据存储指针(初始值等于Sensor1_Start)Ptr2:传感器2数据存储指针(初始值等于Sensor2_Start)
2. 数据采集与存储逻辑
每次读取输入端口数据后,通过位掩码区分传感器并提取有效数据:
- 执行
Input指令,将16位输入数据读入累加器AC - 判断传感器类型:用
AND 0x8000(位15的掩码)与AC做运算:- 若结果为
0(SEL=0),跳转到传感器1存储分支 - 若结果非零(SEL=1),跳转到传感器2存储分支
- 若结果为
- 提取有效数据:执行
AND 0x0FFF,保留位0-11的DATA部分,高位清零 - 存储数据:
- 传感器1分支:执行
Store Ptr1,将有效数据存入当前指针地址;然后Add 1更新Ptr1,Add 1更新Count1 - 传感器2分支:逻辑同上,操作
Ptr2和Count2
- 传感器1分支:执行
- 跳回
Input指令,等待下一组数据输入
3. 平均值计算逻辑
平均值计算需要遍历存储的所有数据累加,再用减法实现除法(MARIE无除法指令):
传感器1平均值计算
- 清零累加和:
Store Sum1(提前定义Sum1变量,初始0) - 加载
Count1到AC,存入临时变量TempCount,加载Sensor1_Start到Ptr1 - 循环累加:
Load Ptr1→Add Sum1→Store Sum1(累加当前数据到总和)Add 1更新Ptr1,Subtract 1更新TempCountJumpIfZero Calc_Avg1(计数为0时跳转到除法步骤)- 跳回循环起始
- 除法求平均值:
- 加载
Sum1到AC,清零Avg1 - 循环减法:
Subtract Count1→JumpIfNegative End_Calc1(不够减时退出) Add 1更新Avg1,跳回减法步骤
- 加载
传感器2平均值计算逻辑完全一致,操作Sum2、TempCount2、Count2、Avg2即可
4. 触发式输出与保持逻辑
需要循环检测输入端口的触发位,满足条件时输出对应平均值:
- 执行
Input读取当前输入状态 - 检测传感器1触发位(位13):
AND 0x2000,若结果非零:Load Avg1→Output(将平均值输出到端口,值会保持直到下一次Output指令)
- 检测传感器2触发位(位14):
AND 0x4000,若结果非零:Load Avg2→Output
- 跳回输入检测步骤,持续监听触发信号
内容的提问来源于stack exchange,提问作者Moisés Abel Díaz Nava
相关产品推荐
相关产品推荐

