注释
嗯…是否可以将 gcode 缓冲区设置为 1?(不确定它是否在 这样每个命令都需要在下一个命令运行之前完成……
|
我会看一下,但看起来我可能在错误的地方工作,我所做的添加是为了实时执行,并且在 G 代码的正常执行期间监控这些内容。我怀疑我需要将它全部移动到非实时环境中。但是会尝试您的建议。我写的 Mach3 附加功能有一个功能,可以等到机器停止移动后再继续,所以这很容易,但似乎看不到这个 GRBL 中的任何东西可以使用相同的方式。 |
在 gcode.c 中,大多数命令都被缓冲,并传递给规划器执行。如果要在前一个命令完成后才运行 gcode 命令,则需要等待缓冲区清空。首选模式似乎是
|
谢谢 ashelly,我昨天成功地完成了它,现在开始享受了。:) 我遇到的另一个问题是自定义 m 代码运行后它将执行下一个命令然后停止。添加 plan_cycle_reinitialize();对于 ISR 例程,计数器在为 Y 位置正确计数后终止,解决了这个问题。现在要自定义帖子并构建机器 |
我的自定义 M 代码终于可以与 Y 上的距离触发器/计数器一起工作,正如我所希望的那样,单个按钮保持/开始操作完美然而!M 代码一发送到 GRBL 就会立即执行,而不是等待上一个命令完成。
要解决这个问题,我认为我需要检查 STATE_IDLE 是正确的吗?这是在执行并完成 G 代码的每一行之后设置的吗?
ISR 就这样结束了。
ISR(CONTROL_INT_vect) { 如果 (!(WDTCSR & (1<<WDIE))) { WDTCSR |= (1<<WDIE); } }
ISR(WDT_vect) // 看门狗定时器 ISR
{
WDTCSR &= ~(1<<WDIE); // 禁用看门狗定时器。
uint8_t pin = (CONTROL_PIN & CONTROL_MASK);
#ifndef INVERT_CONTROL_PIN
引脚 ^= CONTROL_MASK;
#endif
// 仅当检测到任何控制引脚处于活动状态时才输入。
if (pin) {
// 从第一次点击开始设置定时器溢出 : vangalvin
if (bit_istrue(pin,bit(RESET_BIT))) {
mc_reset();
// 单击一次应该开始循环 需要某种形式的去抖动
}
if (bit_istrue(pin,bit(CYCLE_START_BIT)) && SUSPEND_FLAG == 1 ) {
位真(sys.rt_exec_state,EXEC_FEED_HOLD);
暂停标记 = 0;
}
//另一个点击应该暂停循环需要某种形式的去抖动
否则如果(bit_istrue(pin,bit(CYCLE_START_BIT))&& SUSPEND_FLAG == 0){
bit_true(sys.rt_exec_state,EXEC_CYCLE_START);
暂停标记 = 1;
}
if (bit_istrue(pin,bit(Y_COUNT_BIT)) && (gc_block.modal.dst_count == Y_COUNT_ENABLED)) {
Y_COUNT++;
if(Y_COUNT == gc_state.distance_counter){
printPgmString(PSTR(” Y-DST”));
printFloat_RateValue(gc_state.distance_counter);
Y_COUNT=0;
gc_state.distance_counter = 0;
gc_block.modal.dst_count = Y_COUNT_DISABLE;
位真(sys.rt_exec_state,EXEC_CYCLE_START);
}
}
}
}
我还在 gcode.c案例 66中为自定义 M66 命令添加了这个:
word_bit = MODAL_GROUP_M66;
switch(int_value) {
// 获取 M66,暂停机器,将 y 计数归零并开始计数直到达到值
case 66: gc_block.modal.dst_count = Y_COUNT_ENABLED;
gc_state.distance_counter = gc_block.values.s;
// 需要让最后一个命令在停止前完成
bit_true(sys.rt_exec_state, EXEC_FEED_HOLD);
休息;
}
当我使用 S var 传递所需的点击以等待恢复之前我还添加了这个
if (gc_state.distance_counter != gc_block.values.s
)
}