diff --git a/HAL/SPI/SPI.c b/HAL/SPI/SPI.c index 9871c0b..eb37576 100644 --- a/HAL/SPI/SPI.c +++ b/HAL/SPI/SPI.c @@ -150,7 +150,7 @@ void Spi_Init(SPI_TypeDef *SPIx, SPI_Mode mode) // Deselect chip GPIO_SetBits(SPI3_CS_GPIO_PORT, SPI3_CS_PIN); - } + } SPI_CalculateCRC(SPIx, DISABLE); diff --git a/HAL/STM32/stm32f4xx_it.c b/HAL/STM32/stm32f4xx_it.c index 1044908..2281a88 100644 --- a/HAL/STM32/stm32f4xx_it.c +++ b/HAL/STM32/stm32f4xx_it.c @@ -53,8 +53,6 @@ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ -volatile uint8_t DebounceCounterControl = 0; -volatile uint8_t DebounceCounterLimits = 0; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ @@ -87,39 +85,43 @@ void ProcessReceive(char c) // not passed into the main buffer, but these set system state flag bits for realtime execution. switch(c) { - case CMD_RESET: MC_Reset(); break; // Call motion control reset routine. - case CMD_RESET_HARD: NVIC_SystemReset(); // Perform hard reset - case CMD_STATUS_REPORT: System_SetExecStateFlag(EXEC_STATUS_REPORT);break; - case CMD_CYCLE_START: System_SetExecStateFlag(EXEC_CYCLE_START); break; // Set as true - case CMD_FEED_HOLD: System_SetExecStateFlag(EXEC_FEED_HOLD); break; // Set as true - case CMD_STEPPER_DISABLE: Stepper_Disable(1); break; // Set as true + case CMD_RESET: MC_Reset(); break; // Call motion control reset routine. + case CMD_RESET_HARD: NVIC_SystemReset(); // Perform hard reset + case CMD_STATUS_REPORT: System_SetExecStateFlag(EXEC_STATUS_REPORT);break; + case CMD_CYCLE_START: System_SetExecStateFlag(EXEC_CYCLE_START); break; // Set as true + case CMD_FEED_HOLD: System_SetExecStateFlag(EXEC_FEED_HOLD); break; // Set as true + case CMD_STEPPER_DISABLE: Stepper_Disable(1); break; // Set as true default: - if(c > 0x7F) { // Real-time control characters are extended ACSII only. + if(c > 0x7F) + { + // Real-time control characters are extended ACSII only. switch(c) { case CMD_SAFETY_DOOR: System_SetExecStateFlag(EXEC_SAFETY_DOOR); break; // Set as true case CMD_JOG_CANCEL: - if(sys.state & STATE_JOG) { // Block all other states from invoking motion cancel. + if(sys.state & STATE_JOG) + { + // Block all other states from invoking motion cancel. System_SetExecStateFlag(EXEC_MOTION_CANCEL); } break; - case CMD_FEED_OVR_RESET: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_RESET); break; - case CMD_FEED_OVR_COARSE_PLUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_COARSE_PLUS); break; - case CMD_FEED_OVR_COARSE_MINUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_COARSE_MINUS); break; - case CMD_FEED_OVR_FINE_PLUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_FINE_PLUS); break; - case CMD_FEED_OVR_FINE_MINUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_FINE_MINUS); break; - case CMD_RAPID_OVR_RESET: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_RESET); break; - case CMD_RAPID_OVR_MEDIUM: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_MEDIUM); break; - case CMD_RAPID_OVR_LOW: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_LOW); break; - case CMD_SPINDLE_OVR_RESET: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_RESET); break; - case CMD_SPINDLE_OVR_COARSE_PLUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_COARSE_PLUS); break; - case CMD_SPINDLE_OVR_COARSE_MINUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_COARSE_MINUS); break; - case CMD_SPINDLE_OVR_FINE_PLUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_FINE_PLUS); break; - case CMD_SPINDLE_OVR_FINE_MINUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_FINE_MINUS); break; - case CMD_SPINDLE_OVR_STOP: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_STOP); break; - case CMD_COOLANT_FLOOD_OVR_TOGGLE: System_SetExecAccessoryOverrideFlag(EXEC_COOLANT_FLOOD_OVR_TOGGLE); break; + case CMD_FEED_OVR_RESET: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_RESET); break; + case CMD_FEED_OVR_COARSE_PLUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_COARSE_PLUS); break; + case CMD_FEED_OVR_COARSE_MINUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_COARSE_MINUS); break; + case CMD_FEED_OVR_FINE_PLUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_FINE_PLUS); break; + case CMD_FEED_OVR_FINE_MINUS: System_SetExecMotionOverrideFlag(EXEC_FEED_OVR_FINE_MINUS); break; + case CMD_RAPID_OVR_RESET: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_RESET); break; + case CMD_RAPID_OVR_MEDIUM: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_MEDIUM); break; + case CMD_RAPID_OVR_LOW: System_SetExecMotionOverrideFlag(EXEC_RAPID_OVR_LOW); break; + case CMD_SPINDLE_OVR_RESET: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_RESET); break; + case CMD_SPINDLE_OVR_COARSE_PLUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_COARSE_PLUS); break; + case CMD_SPINDLE_OVR_COARSE_MINUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_COARSE_MINUS); break; + case CMD_SPINDLE_OVR_FINE_PLUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_FINE_PLUS); break; + case CMD_SPINDLE_OVR_FINE_MINUS: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_FINE_MINUS); break; + case CMD_SPINDLE_OVR_STOP: System_SetExecAccessoryOverrideFlag(EXEC_SPINDLE_OVR_STOP); break; + case CMD_COOLANT_FLOOD_OVR_TOGGLE: System_SetExecAccessoryOverrideFlag(EXEC_COOLANT_FLOOD_OVR_TOGGLE); break; case CMD_COOLANT_MIST_OVR_TOGGLE: if (BIT_IS_TRUE(settings.flags_ext, BITFLAG_ENABLE_M7)) { @@ -129,7 +131,8 @@ void ProcessReceive(char c) } // Throw away any unfound extended-ASCII character by not passing it to the serial buffer. } - else { + else + { // Write character to buffer FifoUsart_Insert(USART2_NUM, USART_DIR_RX, c); } @@ -245,48 +248,29 @@ void SysTick_Handler(void) * Therefore we just poll them in this 1ms task, which is hopefully fast * enough for critical events. Debouncing pins is also implemented here. */ - uint8_t limits = Limits_GetState(); - if(limits) + uint8_t limits = Limits_GetState(false); + if (limits && (sys.system_flags & BITFLAG_ENABLE_LIMITS)) { - // X-Y-Z Limit - if((DebounceCounterLimits == 0) && (settings.system_flags & BITFLAG_ENABLE_LIMITS)) - { - DebounceCounterLimits = 20; - Limit_PinChangeISR(); - } - } + // X-Y-Z Limit + Limit_PinChangeISR(); + } - uint8_t controls = System_GetControlState(); - if(controls) + uint8_t controls = System_GetControlState(false); + if (controls && (sys.system_flags & BITFLAG_ENABLE_SYSTEM_INPUT)) { - // System control - if(DebounceCounterControl == 0) - { - DebounceCounterControl = 20; - System_PinChangeISR(); - } - } + System_PinChangeISR(); + } - if(DebounceCounterLimits && !limits) - { - DebounceCounterLimits--; - } - if(DebounceCounterControl && !controls) - { - DebounceCounterControl--; - } - - gMillis++; + gMillis++; if(gMillis%16 == 0) { - // Update sync motion - MC_UpdateSyncMove(); + // Update sync motion + MC_UpdateSyncMove(); } - if(gMillis%32 == 0) + if(gMillis%32 == 0) { - // 25ms Task (min 7 RPM) uint16_t cnt = (uint16_t)Encoder_GetValue(); uint32_t cnt_diff = 0; @@ -302,11 +286,14 @@ void SysTick_Handler(void) } // Calculate RPM and smooth it - float rpm = ((cnt_diff * 31.25) / settings.enc_ppr) * 60.0; - rpm_arr[rpm_idx++] = (uint32_t)rpm; - if(rpm_idx > (RPM_FILTER_NUM-1)) + if (settings.enc_ppr > 0) { - rpm_idx = 0; + float rpm = ((cnt_diff * 31.25) / settings.enc_ppr) * 60.0; + rpm_arr[rpm_idx++] = (uint32_t)rpm; + if (rpm_idx > (RPM_FILTER_NUM - 1)) + { + rpm_idx = 0; + } } // Assign smoothed RPM @@ -369,10 +356,10 @@ void TIM4_IRQHandler(void) Encoder_OvfISR(); // Spindle at zero position - if(sys.sync_move && sys.state == STATE_HOLD) + /*if(sys.sync_move && sys.state == STATE_HOLD) { MC_LineSyncStart(); - } + }*/ } } @@ -394,7 +381,8 @@ void EXTI9_5_IRQHandler(void) */ void USART1_IRQHandler(void) { - if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) + { /* Read one byte from the receive data register */ unsigned char c = (USART_ReceiveData(USART1) & 0xFF); @@ -402,22 +390,26 @@ void USART1_IRQHandler(void) FifoUsart_Insert(USART1_NUM, USART_DIR_RX, c); } - if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { + if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) + { char c; - if(FifoUsart_Get(USART1_NUM, USART_DIR_TX, &c) == 0) { + if(FifoUsart_Get(USART1_NUM, USART_DIR_TX, &c) == 0) + { /* Write one byte to the transmit data register */ while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, c); } - else { + else + { // Nothing to transmit - disable interrupt USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } /* If overrun condition occurs, clear the ORE flag and recover communication */ - if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) { + if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) + { (void)USART_ReceiveData(USART1); } } @@ -430,29 +422,34 @@ void USART1_IRQHandler(void) */ void USART2_IRQHandler(void) { - if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { + if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) + { /* Read one byte from the receive data register */ unsigned char c = (USART_ReceiveData(USART2) & 0xFF); ProcessReceive(c); } - if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) { + if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) + { char c; - if(FifoUsart_Get(USART2_NUM, USART_DIR_TX, &c) == 0) { + if(FifoUsart_Get(USART2_NUM, USART_DIR_TX, &c) == 0) + { /* Write one byte to the transmit data register */ while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); USART_SendData(USART2, c); } - else { + else + { // Nothing to transmit - disable interrupt USART_ITConfig(USART2, USART_IT_TXE, DISABLE); } } /* If overrun condition occurs, clear the ORE flag and recover communication */ - if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET) { + if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET) + { (void)USART_ReceiveData(USART2); } } @@ -465,7 +462,8 @@ void USART2_IRQHandler(void) */ void USART6_IRQHandler(void) { - if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET) { + if(USART_GetITStatus(USART6, USART_IT_RXNE) != RESET) + { /* Read one byte from the receive data register */ unsigned char c = (USART_ReceiveData(USART6) & 0xFF); @@ -473,22 +471,26 @@ void USART6_IRQHandler(void) FifoUsart_Insert(USART6_NUM, USART_DIR_RX, c); } - if(USART_GetITStatus(USART6, USART_IT_TXE) != RESET) { + if(USART_GetITStatus(USART6, USART_IT_TXE) != RESET) + { char c; - if(FifoUsart_Get(USART6_NUM, USART_DIR_TX, &c) == 0) { + if(FifoUsart_Get(USART6_NUM, USART_DIR_TX, &c) == 0) + { /* Write one byte to the transmit data register */ while(USART_GetFlagStatus(USART6, USART_FLAG_TC) == RESET); USART_SendData(USART6, c); } - else { + else + { // Nothing to transmit - disable interrupt USART_ITConfig(USART6, USART_IT_TXE, DISABLE); } } /* If overrun condition occurs, clear the ORE flag and recover communication */ - if(USART_GetFlagStatus(USART6, USART_FLAG_ORE) != RESET) { + if(USART_GetFlagStatus(USART6, USART_FLAG_ORE) != RESET) + { (void)USART_ReceiveData(USART6); } } diff --git a/Libraries/Encoder/Encoder.c b/Libraries/Encoder/Encoder.c index 5fac3cb..2af14b9 100644 --- a/Libraries/Encoder/Encoder.c +++ b/Libraries/Encoder/Encoder.c @@ -26,6 +26,7 @@ static uint32_t OvfCnt = 0; static uint32_t CntValue = 0; static uint16_t PulsesPerRev = 360; +static bool isZero = false; void Encoder_Init(uint16_t ppr) @@ -40,6 +41,7 @@ void Encoder_Reset(void) { OvfCnt = 0; CntValue = 0; + isZero = false; } @@ -61,8 +63,20 @@ void Encoder_SetValue(uint32_t val) } +bool Encoder_Zero(void) +{ + if(isZero) + { + isZero = false; + return true; + } + return false; +} + + void Encoder_OvfISR(void) { OvfCnt++; CntValue += PulsesPerRev; + isZero = true; } diff --git a/Libraries/Encoder/Encoder.h b/Libraries/Encoder/Encoder.h index 02705b9..db033d0 100644 --- a/Libraries/Encoder/Encoder.h +++ b/Libraries/Encoder/Encoder.h @@ -3,6 +3,7 @@ #include +#include #ifdef __cplusplus @@ -18,6 +19,8 @@ void Encoder_SetPulsesPerRev(uint16_t ppr); uint32_t Encoder_GetValue(void); void Encoder_SetValue(uint32_t val); +bool Encoder_Zero(void); + void Encoder_OvfISR(void); diff --git a/Makefile b/Makefile index 14fc5dd..05f586e 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ endif # options for code generation #--------------------------------------------------------------------------------- FLAGS := -mfloat-abi=hard -mcpu=cortex-m4 -gdwarf-2 -mfpu=fpv4-sp-d16 -mthumb -Wno-misleading-indentation -CFLAGS := -O2 -g1 -std=c11 -Wall -Wextra $(INCLUDE) -fno-common -fsingle-precision-constant -fdata-sections \ +CFLAGS := -O2 -g1 -std=c17 -Wall -Wextra $(INCLUDE) -fno-common -fsingle-precision-constant -fdata-sections \ -ffunction-sections -fomit-frame-pointer -mlittle-endian -DUSE_STDPERIPH_DRIVER -D__FPU_USED -DARM_MATH_CM4 -Wimplicit-fallthrough=0 CXXFLAGS := $(CFLAGS) diff --git a/grbl/Config.h b/grbl/Config.h index 4b9d5da..f6972dc 100644 --- a/grbl/Config.h +++ b/grbl/Config.h @@ -72,22 +72,22 @@ // used, if they are available per user setup. Also, extended ASCII codes (>127), which are never in // g-code programs, maybe selected for interface programs. // NOTE: If changed, manually update help message in report.c. +#define CMD_STEPPER_DISABLE 0x17 #define CMD_RESET 0x18 // ctrl-x. #define CMD_RESET_HARD 0x19 // ctrl-y. #define CMD_STATUS_REPORT '?' #define CMD_CYCLE_START '~' #define CMD_FEED_HOLD '!' -#define CMD_STEPPER_DISABLE 0x17 // NOTE: All override realtime commands must be in the extended ASCII character set, starting // at character value 128 (0x80) and up to 255 (0xFF). If the normal set of realtime commands, // such as status reports, feed hold, reset, and cycle start, are moved to the extended set // space, RX ISR will need to be modified to accomodate the change. -// #define CMD_RESET 0x80 -// #define CMD_STATUS_REPORT 0x81 -// #define CMD_CYCLE_START 0x82 -// #define CMD_FEED_HOLD 0x83 +// #define CMD_RESET 0x80 +// #define CMD_STATUS_REPORT 0x81 +// #define CMD_CYCLE_START 0x82 +// #define CMD_FEED_HOLD 0x83 #define CMD_SAFETY_DOOR 0x84 #define CMD_JOG_CANCEL 0x85 #define CMD_DEBUG_REPORT 0x86 // Only when DEBUG enabled, sends debug report in '{}' braces. @@ -222,20 +222,6 @@ //#define INVERT_LIMIT_PIN_MASK ((1< MAX_TOOL_NUMBER) @@ -707,16 +734,19 @@ uint8_t GC_ExecuteLine(const char *line) gc_block.values.xyz[X_AXIS] = value; axis_words |= (1<= MOTION_MODE_PROBE_TOWARD) { - Printf("38."); - Printf("%d", gc_state.modal.motion - (MOTION_MODE_PROBE_TOWARD-2)); + Printf("38.%d", gc_state.modal.motion - (MOTION_MODE_PROBE_TOWARD - 2)); } else { Printf("%d", gc_state.modal.motion); } - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", gc_state.modal.coord_select+54); - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", gc_state.modal.plane_select+17); - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", 21-gc_state.modal.units); - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", gc_state.modal.distance+90); - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", 94-gc_state.modal.feed_rate); - report_util_gcode_modes_G(); + Report_UtilGCodeModes_G(); Printf("%d", 98+gc_state.modal.retract); if(gc_state.modal.program_flow) { - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); switch(gc_state.modal.program_flow) { @@ -510,7 +524,7 @@ void Report_GCodeModes(void) Printf("0"); break; - // case PROGRAM_FLOW_OPTIONAL_STOP : Putc('1'); break; // M1 is ignored and not supported. + // case PROGRAM_FLOW_OPTIONAL_STOP : Putc('1'); break; // M1 is ignored and not supported. case PROGRAM_FLOW_COMPLETED_M2: case PROGRAM_FLOW_COMPLETED_M30: Printf("%d", gc_state.modal.program_flow); @@ -521,7 +535,7 @@ void Report_GCodeModes(void) } } - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); switch(gc_state.modal.spindle) { @@ -545,18 +559,18 @@ void Report_GCodeModes(void) { if (gc_state.modal.coolant & PL_COND_FLAG_COOLANT_MIST) { - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); Printf("7"); } if (gc_state.modal.coolant & PL_COND_FLAG_COOLANT_FLOOD) { - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); Printf("8"); } } else { - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); Printf("9"); } } @@ -564,40 +578,35 @@ void Report_GCodeModes(void) #ifdef ENABLE_PARKING_OVERRIDE_CONTROL if(sys.override_ctrl == OVERRIDE_PARKING_MOTION) { - report_util_gcode_modes_M(); + Report_UtilGCodeModes_M(); Printf("%d", 56); } #endif - Printf(" T"); - Printf("%d", gc_state.tool); + Printf(" T%d", gc_state.tool); Printf(" F"); PrintFloat_RateValue(gc_state.feed_rate); Printf(" S"); - //PrintFloat(gc_state.spindle_speed, N_DECIMAL_RPMVALUE); - Printf("%d", Spindle_GetRPM()); + Printf_Float(gc_state.spindle_speed, N_DECIMAL_RPMVALUE); + //Printf(" S%d", Spindle_GetRPM()); - report_util_feedback_line_feed(); + Report_UtilFeedback_LineFeed(); } // Prints specified startup line void Report_StartupLine(uint8_t n, const char *line) { - Printf("$N"); - Printf("%d", n); - Printf("=%s", line); + Printf("$N%d=%s", n, line); Report_LineFeed(); } void Report_ExecuteStartupMessage(const char *line, uint8_t status_code) { - Printf(">"); - Printf("%s", line); - Printf(":"); + Printf(">%s:", line); Report_StatusMessage(status_code); } @@ -606,12 +615,12 @@ void Report_ExecuteStartupMessage(const char *line, uint8_t status_code) void Report_BuildInfo(const char *line) { #ifdef GRBL_COMPATIBLE - Printf("[VER: 1.1, %s: ", GRBL_VERSION_BUILD); + Printf("[VER:1.1h.20240101: "); #else Printf("[VER: %s, %s, GCC %s: ", GRBL_VERSION, GRBL_VERSION_BUILD, __VERSION__); #endif Printf("%s", line); - report_util_feedback_line_feed(); + Report_UtilFeedback_LineFeed(); Printf("[OPT:"); Printf("V"); Printf("N"); @@ -689,7 +698,7 @@ void Report_BuildInfo(const char *line) Printf(",%d", BLOCK_BUFFER_SIZE-1); Printf(",%d", LINE_BUFFER_SIZE); - report_util_feedback_line_feed(); + Report_UtilFeedback_LineFeed(); } @@ -697,16 +706,15 @@ void Report_BuildInfo(const char *line) // and has been sent into protocol_execute_line() routine to be executed by Grbl. void Report_EchoLineReceived(char *line) { - Printf("[echo: "); - Printf("%s", line); - report_util_feedback_line_feed(); + Printf("[echo: %s", line); + Report_UtilFeedback_LineFeed(); } // Prints real-time data. This function grabs a real-time snapshot of the stepper subprogram // and the actual location of the CNC machine. Users may change the following function to their // specific needs, but the desired real-time data report must be as short as possible. This is -// requires as it minimizes the computational overhead and allows grbl to keep running smoothly, +// required as it minimizes the computational overhead and allows grbl to keep running smoothly, // especially during g-code programs with fast, short line segments and high frequency reports (5-20Hz). void Report_RealtimeStatus(void) { @@ -718,7 +726,6 @@ void Report_RealtimeStatus(void) System_ConvertArraySteps2Mpos(print_position, current_position); // Report current machine state and sub-states - // For better syncing purposes Printf("<"); switch(sys.state) @@ -870,13 +877,20 @@ void Report_RealtimeStatus(void) Printf("|FS:"); PrintFloat_RateValue(Stepper_GetRealtimeRate()); Printf(","); - Printf_Float(sys.spindle_speed, N_DECIMAL_RPMVALUE); + if(settings.enc_ppr > 0) + { + Printf_Float(Spindle_GetRPM(), N_DECIMAL_RPMVALUE); + } + else + { + Printf_Float(sys.spindle_speed, N_DECIMAL_RPMVALUE); + } } if (BIT_IS_TRUE(settings.flags_report, BITFLAG_REPORT_FIELD_PIN_STATE)) { - uint8_t lim_pin_state = Limits_GetState(); - uint8_t ctrl_pin_state = System_GetControlState(); + uint8_t lim_pin_state = Limits_GetState(true); + uint8_t ctrl_pin_state = System_GetControlState(true); uint8_t prb_pin_state = Probe_GetState(); if (lim_pin_state | ctrl_pin_state | prb_pin_state) diff --git a/grbl/Report.h b/grbl/Report.h index 7de0b39..44a372c 100644 --- a/grbl/Report.h +++ b/grbl/Report.h @@ -45,6 +45,7 @@ #define STATUS_SETTING_DISABLED_LASER 17 #define STATUS_MACHINE_NOT_HOMED 18 #define STATUS_TLS_NOT_SET 19 +#define STATUS_CHECK_INPUT 20 #define STATUS_GCODE_UNSUPPORTED_COMMAND 20 #define STATUS_GCODE_MODAL_GROUP_VIOLATION 21 @@ -93,6 +94,7 @@ #define MESSAGE_SPINDLE_RESTORE 10 #define MESSAGE_SLEEP_MODE 11 #define MESSAGE_INVALID_TOOL 12 +#define MESSAGE_CHECK_INPUTS 13 // Prints system status messages. diff --git a/grbl/Settings.c b/grbl/Settings.c index ca9e070..b80597b 100644 --- a/grbl/Settings.c +++ b/grbl/Settings.c @@ -61,14 +61,14 @@ void Settings_Init(void) // Method to restore EEPROM-saved Grbl global settings back to defaults. -void Settings_Restore(uint8_t restore_flag) +void Settings_Restore(const uint8_t restore_flag) { sys.state = STATE_BUSY; Report_RealtimeStatus(); if (restore_flag & SETTINGS_RESTORE_DEFAULTS) { - settings.system_flags = DEFAULT_SYSTEM_INVERT_MASK; + settings.input_invert_mask = DEFAULT_SYSTEM_INVERT_MASK; settings.stepper_idle_lock_time = DEFAULT_STEPPER_IDLE_LOCK_TIME; settings.step_invert_mask = DEFAULT_STEPPING_INVERT_MASK; settings.dir_invert_mask = DEFAULT_DIRECTION_INVERT_MASK; @@ -230,12 +230,11 @@ void Settings_Restore(uint8_t restore_flag) if (restore_flag & SETTINGS_RESTORE_PARAMETERS) { - uint8_t idx; float coord_data[N_AXIS]; memset(&coord_data, 0, sizeof(coord_data)); - for (idx = 0; idx <= SETTING_INDEX_NCOORD; idx++) + for (uint8_t idx = 0; idx <= SETTING_INDEX_NCOORD; idx++) { Settings_WriteCoordData(idx, coord_data); } @@ -441,7 +440,7 @@ uint8_t Settings_StoreGlobalSetting(uint8_t parameter, float value) #ifdef MAX_STEP_RATE_HZ if (value*settings.max_rate[parameter] > (MAX_STEP_RATE_HZ*60.0)) { - return(STATUS_MAX_STEP_RATE_EXCEEDED); + return (STATUS_MAX_STEP_RATE_EXCEEDED); } #endif settings.steps_per_mm[parameter] = value; @@ -451,7 +450,7 @@ uint8_t Settings_StoreGlobalSetting(uint8_t parameter, float value) #ifdef MAX_STEP_RATE_HZ if (value*settings.steps_per_mm[parameter] > (MAX_STEP_RATE_HZ*60.0)) { - return(STATUS_MAX_STEP_RATE_EXCEEDED); + return (STATUS_MAX_STEP_RATE_EXCEEDED); } #endif settings.max_rate[parameter] = value; @@ -478,7 +477,7 @@ uint8_t Settings_StoreGlobalSetting(uint8_t parameter, float value) // If axis index greater than N_AXIS or setting index greater than number of axis settings, error out. if ((parameter < AXIS_SETTINGS_INCREMENT) || (set_idx == AXIS_N_SETTINGS)) { - return(STATUS_INVALID_STATEMENT); + return (STATUS_INVALID_STATEMENT); } parameter -= AXIS_SETTINGS_INCREMENT; } @@ -492,7 +491,7 @@ uint8_t Settings_StoreGlobalSetting(uint8_t parameter, float value) switch(parameter) { case 0: - settings.system_flags = int_value & CONTROL_MASK; + settings.input_invert_mask = int_value & CONTROL_MASK; break; case 1: @@ -899,7 +898,7 @@ static void WriteGlobalSettings(void) static uint8_t ReadGlobalSettings(void) { // Check version-byte of eeprom - uint8_t version = Nvm_ReadByte(0); + uint8_t version = Nvm_ReadByte(EEPROM_ADDR_VERSION); if (version == SETTINGS_VERSION) { diff --git a/grbl/Settings.h b/grbl/Settings.h index a1e9b11..25d2f86 100644 --- a/grbl/Settings.h +++ b/grbl/Settings.h @@ -32,12 +32,18 @@ #define SETTINGS_VERSION 8 // NOTE: Check settings_reset() when moving to next version. -// Define bit flag masks for the boolean settings in settings.system_flags +// Define bit flag masks for the boolean settings in settings.input_invert_mask #define BITFLAG_INVERT_RESET_PIN BIT(0) #define BITFLAG_INVERT_FEED_PIN BIT(1) #define BITFLAG_INVERT_CYCLE_PIN BIT(2) #define BITFLAG_INVERT_SAFETY_PIN BIT(3) -#define BITFLAG_ENABLE_LIMITS BIT(4) +#define BITFLAG_INVERT_SPINDLE_PIN BIT(4) +#define BITFLAG_INVERT_FLOOD_PIN BIT(5) +#define BITFLAG_INVERT_MIST_PIN BIT(6) + +// Define bit flag masks for the boolean settings in settings.system_flags +#define BITFLAG_ENABLE_SYSTEM_INPUT BIT(0) +#define BITFLAG_ENABLE_LIMITS BIT(1) // Define bit flag masks for the boolean settings in settings.flags. #define BITFLAG_REPORT_INCHES BIT(0) @@ -85,6 +91,7 @@ // NOTE: Default 1KB EEPROM. The upper half is reserved for parameters and // the startup script. The lower half contains the global settings and space for future // developments. +#define EEPROM_ADDR_VERSION 0U #define EEPROM_ADDR_GLOBAL 1U // +163 #define EEPROM_ADDR_TOOLTABLE 180U // +320 #define EEPROM_ADDR_PARAMETERS 512U // +160 @@ -134,7 +141,7 @@ typedef struct uint8_t tls_valid; // Remaining Grbl settings - uint8_t system_flags; + uint8_t input_invert_mask; uint8_t step_invert_mask; uint8_t dir_invert_mask; uint8_t stepper_idle_lock_time; // If max value 255, steppers do not disable. @@ -166,7 +173,7 @@ extern Settings_t settings; void Settings_Init(void); // Helper function to clear and restore EEPROM defaults -void Settings_Restore(uint8_t restore_flag); +void Settings_Restore(const uint8_t restore_flag); // A helper method to set new settings from command line uint8_t Settings_StoreGlobalSetting(uint8_t parameter, float value); @@ -180,7 +187,7 @@ void Settings_StoreStartupLine(uint8_t n, const char *line); // Stores tool table in EEPROM void Settings_StoreToolTable(const ToolTable_t *table); -void Settings_StoreToolParams(uint8_t tool_nr, const ToolParams_t *params); +//void Settings_StoreToolParams(uint8_t tool_nr, const ToolParams_t *params); // Read tool table uint8_t Settings_ReadToolTable(ToolTable_t *table); diff --git a/grbl/SpindleControl.c b/grbl/SpindleControl.c index d0d4516..143fcd6 100644 --- a/grbl/SpindleControl.c +++ b/grbl/SpindleControl.c @@ -4,7 +4,7 @@ Copyright (c) 2012-2016 Sungeun K. Jeon for Gnea Research LLC Copyright (c) 2009-2011 Simen Svale Skogsrud - Copyright (c) 2017-2020 Patrick F. + Copyright (c) 2017-2024 Patrick F. Grbl-Advanced is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,7 @@ void Spindle_Init(void) GPIO_InitGPIO(GPIO_SPINDLE); TIM1_Init(); - //TIM3_Init(); + if (BIT_IS_TRUE(settings.flags_ext, BITFLAG_LATHE_MODE)) { Encoder_Init(settings.enc_ppr); @@ -65,11 +65,14 @@ void Spindle_Stop(void) TIM1->CCR1 = TIM1_INIT; // Disable PWM. Output voltage is zero. spindle_enabled = 0; -#ifdef INVERT_SPINDLE_ENABLE_PIN - GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#else - GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#endif + if (BIT_IS_TRUE(settings.input_invert_mask, BITFLAG_INVERT_SPINDLE_PIN)) + { + GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } + else + { + GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } } @@ -105,15 +108,18 @@ void Spindle_SetSpeed(uint8_t pwm_value) else { TIM_Cmd(TIM1, ENABLE); // Ensure PWM output is enabled. -#ifdef INVERT_SPINDLE_ENABLE_PIN - GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#else - GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#endif + if (BIT_IS_TRUE(settings.input_invert_mask, BITFLAG_INVERT_SPINDLE_PIN)) + { + GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } + else + { + GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } spindle_enabled = 1; } #else - if(pwm_value == SPINDLE_PWM_OFF_VALUE) + if (pwm_value == SPINDLE_PWM_OFF_VALUE) { TIM1->CCR1 = TIM1_INIT; // Disable PWM. Output voltage is zero. TIM_Cmd(TIM1, DISABLE); // Disable PWM. Output voltage is zero. @@ -202,11 +208,14 @@ void Spindle_SetState(uint8_t state, float rpm) spindle_dir_cw = 0; } -#ifdef INVERT_SPINDLE_ENABLE_PIN - GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#else - GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); -#endif + if (BIT_IS_TRUE(settings.input_invert_mask, BITFLAG_INVERT_SPINDLE_PIN)) + { + GPIO_ResetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } + else + { + GPIO_SetBits(GPIO_SPINDLE_ENA_PORT, GPIO_SPINDLE_ENA_PIN); + } // NOTE: Assumes all calls to this function is when Grbl is not moving or must remain off. if (BIT_IS_TRUE(settings.flags, BITFLAG_LASER_MODE)) diff --git a/grbl/System.c b/grbl/System.c index db88dd4..0295610 100644 --- a/grbl/System.c +++ b/grbl/System.c @@ -51,10 +51,17 @@ volatile uint8_t sys_rt_exec_motion_override; // Global realtime executor bitflag variable for spindle/coolant overrides. volatile uint8_t sys_rt_exec_accessory_override; +//static uint8_t initial_state = 0; +static uint8_t last_state = 0; + void System_Init(void) { GPIO_InitGPIO(GPIO_SYSTEM); + last_state = 0; + + sys.system_flags |= BITFLAG_ENABLE_SYSTEM_INPUT; + System_GetControlState(false); } @@ -67,6 +74,8 @@ void System_Clear(void) sys.f_override = DEFAULT_FEED_OVERRIDE; sys.r_override = DEFAULT_RAPID_OVERRIDE; sys.spindle_speed_ovr = DEFAULT_SPINDLE_SPEED_OVERRIDE; + + sys.system_flags |= BITFLAG_ENABLE_SYSTEM_INPUT; } @@ -80,7 +89,7 @@ void System_ResetPosition(void) // Returns control pin state as a uint8 bitfield. Each bit indicates the input pin state, where // triggered is 1 and not triggered is 0. Invert mask is applied. Bitfield organization is // defined by the CONTROL_PIN_INDEX in the header file. -uint8_t System_GetControlState(void) +uint8_t System_GetControlState(bool held) { uint8_t control_state = 0; uint8_t pin = ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)< +#include #include "util.h" @@ -97,6 +98,7 @@ #define STATE_FEED_DWELL BIT(8) // Dwell #define STATE_TOOL_CHANGE BIT(9) // Tool change in progress #define STATE_BUSY BIT(10) // Writing NVM etc. +#define STATE_ALARM_INPUT BIT(11) // Define system suspend flags. Used in various ways to manage suspend states and procedures. #define SUSPEND_DISABLE 0 // Must be zero. @@ -117,7 +119,7 @@ #define STEP_CONTROL_UPDATE_SPINDLE_PWM BIT(3) // Define control pin index for Grbl internal use. Pin maps may change, but these values don't. -#define N_CONTROL_PIN 4 +#define N_CONTROL_PIN 4 #define CONTROL_PIN_INDEX_SAFETY_DOOR BIT(0) #define CONTROL_PIN_INDEX_RESET BIT(1) #define CONTROL_PIN_INDEX_FEED_HOLD BIT(2) @@ -155,6 +157,8 @@ typedef struct uint8_t is_homed; uint8_t sync_move; float x_pos; // Current x-position of tool (for G96) + + uint8_t system_flags; // Runtime flags } System_t; extern System_t sys; @@ -178,7 +182,7 @@ void System_Clear(void); void System_ResetPosition(void); // Returns bitfield of control pin states, organized by CONTROL_PIN_INDEX. (1=triggered, 0=not triggered). -uint8_t System_GetControlState(void); +uint8_t System_GetControlState(bool held); // Returns if safety door is open or closed, based on pin state. uint8_t System_CheckSafetyDoorAjar(void); diff --git a/grbl/defaults.h b/grbl/defaults.h index 8035d12..0112e5c 100644 --- a/grbl/defaults.h +++ b/grbl/defaults.h @@ -31,32 +31,32 @@ #ifdef DEFAULTS_GENERIC // Grbl generic default settings. Should work across different machines. - #define DEFAULT_X_STEPS_PER_MM 400.0 - #define DEFAULT_Y_STEPS_PER_MM 400.0 - #define DEFAULT_Z_STEPS_PER_MM 400.0 - #define DEFAULT_A_STEPS_PER_DEG 10.0 - #define DEFAULT_B_STEPS_PER_DEG 10.0 - #define DEFAULT_X_MAX_RATE 1000.0 // mm/min - #define DEFAULT_Y_MAX_RATE 1000.0 // mm/min - #define DEFAULT_Z_MAX_RATE 1000.0 // mm/min - #define DEFAULT_A_MAX_RATE 10000.0 // °/min - #define DEFAULT_B_MAX_RATE 10000.0 // °/min - #define DEFAULT_X_ACCELERATION (30.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 - #define DEFAULT_Y_ACCELERATION (30.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 - #define DEFAULT_Z_ACCELERATION (30.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 - #define DEFAULT_A_ACCELERATION (100.0*60*60) // 100*60*60 mm/min^2 = 100 mm/sec^2 - #define DEFAULT_B_ACCELERATION (100.0*60*60) // 100*60*60 mm/min^2 = 100 mm/sec^2 - #define DEFAULT_X_MAX_TRAVEL 400.0 // mm NOTE: Must be a positive value. - #define DEFAULT_Y_MAX_TRAVEL 300.0 // mm NOTE: Must be a positive value. - #define DEFAULT_Z_MAX_TRAVEL 500.0 // mm NOTE: Must be a positive value. - #define DEFAULT_A_MAX_TRAVEL 360.0 // ° - #define DEFAULT_B_MAX_TRAVEL 360.0 // ° - #define DEFAULT_SPINDLE_RPM_MAX 3000.0 // rpm - #define DEFAULT_SPINDLE_RPM_MIN 0.0 // rpm + #define DEFAULT_X_STEPS_PER_MM 400.0 + #define DEFAULT_Y_STEPS_PER_MM 400.0 + #define DEFAULT_Z_STEPS_PER_MM 400.0 + #define DEFAULT_A_STEPS_PER_DEG 100.0 + #define DEFAULT_B_STEPS_PER_DEG 100.0 + #define DEFAULT_X_MAX_RATE 2000.0 // mm/min + #define DEFAULT_Y_MAX_RATE 2000.0 // mm/min + #define DEFAULT_Z_MAX_RATE 2000.0 // mm/min + #define DEFAULT_A_MAX_RATE 10000.0 // °/min + #define DEFAULT_B_MAX_RATE 10000.0 // °/min + #define DEFAULT_X_ACCELERATION (60.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 + #define DEFAULT_Y_ACCELERATION (60.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 + #define DEFAULT_Z_ACCELERATION (60.0*60*60) // 30*60*60 mm/min^2 = 30 mm/sec^2 + #define DEFAULT_A_ACCELERATION (100.0*60*60) // 100*60*60 mm/min^2 = 100 mm/sec^2 + #define DEFAULT_B_ACCELERATION (100.0*60*60) // 100*60*60 mm/min^2 = 100 mm/sec^2 + #define DEFAULT_X_MAX_TRAVEL 400.0 // mm NOTE: Must be a positive value. + #define DEFAULT_Y_MAX_TRAVEL 400.0 // mm NOTE: Must be a positive value. + #define DEFAULT_Z_MAX_TRAVEL 500.0 // mm NOTE: Must be a positive value. + #define DEFAULT_A_MAX_TRAVEL 360.0 // ° + #define DEFAULT_B_MAX_TRAVEL 360.0 // ° + #define DEFAULT_SPINDLE_RPM_MAX 3000.0 // rpm + #define DEFAULT_SPINDLE_RPM_MIN 0.0 // rpm - #define DEFAULT_X_BACKLASH 0.01 // mm - #define DEFAULT_Y_BACKLASH 0.01 // mm - #define DEFAULT_Z_BACKLASH 0.01 // mm + #define DEFAULT_X_BACKLASH 0.01 // mm + #define DEFAULT_Y_BACKLASH 0.01 // mm + #define DEFAULT_Z_BACKLASH 0.01 // mm #define DEFAULT_SYSTEM_INVERT_MASK 0 #define DEFAULT_STEPPING_INVERT_MASK 0 @@ -67,7 +67,7 @@ #define DEFAULT_ARC_TOLERANCE 0.001 // mm #define DEFAULT_REPORT_INCHES 0 // false #define DEFAULT_INVERT_ST_ENABLE 0 // false - #define DEFAULT_INVERT_LIMIT_PINS 0 // false + #define DEFAULT_INVERT_LIMIT_PINS 1 // false #define DEFAULT_SOFT_LIMIT_ENABLE 0 // false #define DEFAULT_HARD_LIMIT_ENABLE 1 // false #define DEFAULT_INVERT_PROBE_PIN 0 // false diff --git a/grbl/util.c b/grbl/util.c index 7758d1f..40a01a1 100644 --- a/grbl/util.c +++ b/grbl/util.c @@ -247,11 +247,6 @@ void Delay_sec(float seconds, uint8_t mode) } } -// Simple hypotenuse computation function. -/*float hypot_f(float x, float y) -{ - return sqrtf(x*x + y*y); -}*/ bool isEqual_f(float a, float b) { diff --git a/grbl/util.h b/grbl/util.h index bf41098..7f23520 100644 --- a/grbl/util.h +++ b/grbl/util.h @@ -81,6 +81,7 @@ #define CONTROL_CYCLE_START_BIT 2 #define CONTROL_SAFETY_DOOR_BIT 3 #define CONTROL_MASK ((1<