uint32_t last;
uint8_t retry;
+ uint8_t shutdown;
bool connected;
bool changed;
float speed;
switch (index) {
case 0: { // Update direction
uint8_t state = HUANYANG_STOP;
- if (0 < ha.speed) state = HUANYANG_RUN;
- else if (ha.speed < 0) state = HUANYANG_RUN | HUANYANG_REV_FWD;
+ if (!ha.shutdown) {
+ if (0 < ha.speed) state = HUANYANG_RUN;
+ else if (ha.speed < 0) state = HUANYANG_RUN | HUANYANG_REV_FWD;
+ }
_set_command1(HUANYANG_CTRL_WRITE, state);
// Clamp frequency
if (ha.max_freq < freq) freq = ha.max_freq;
if (freq < ha.min_freq) freq = ha.min_freq;
+ if (ha.shutdown) freq = 0;
// Frequency write command
uint16_t f = freq * 100;
_set_command2(HUANYANG_FREQ_WRITE, f >> 8, f);
+ if (1 < ha.shutdown) ha.shutdown--;
+
return true;
}
static void _next_state() {
- if (ha.changed) {
+ if (ha.changed || ha.shutdown) {
ha.next_command_cb = _update;
ha.changed = false;
}
+static void _reset(bool halt) {
+ _set_dre_interrupt(false);
+ _set_txc_interrupt(false);
+ _set_rxc_interrupt(false);
+ _set_write(true); // RS485 write mode
+
+ // Flush USART
+ uint8_t x = HUANYANG_PORT.DATA;
+ x = HUANYANG_PORT.STATUS;
+ x = x;
+
+ // Save settings
+ uint8_t id = ha.id;
+ float speed = ha.speed;
+ bool debug = ha.debug;
+
+ // Clear state
+ memset(&ha, 0, sizeof(ha));
+
+ // Restore settings
+ ha.id = id;
+ ha.speed = speed;
+ ha.debug = debug;
+ ha.changed = true;
+
+ if (!halt) _next_state();
+}
+
+
static void _next_command() {
+ if (ha.shutdown == 1) {
+ _reset(true);
+
+ // Disable USART
+ HUANYANG_PORT.CTRLA = 0;
+ HUANYANG_PORT.CTRLC = 0;
+ HUANYANG_PORT.CTRLB = 0;
+
+ // Float write pins
+ DIRCLR_PIN(RS485_DI_PIN);
+ DIRCLR_PIN(RS485_RW_PIN);
+
+ return;
+ }
+
if (ha.next_command_cb && ha.next_command_cb(ha.command_index++)) {
ha.response_length = _response_length(ha.command[1]);
// Data received interrupt
ISR(HUANYANG_RXC_vect) {
- ha.response[ha.current_offset++] = USARTD1.DATA;
+ ha.response[ha.current_offset++] = HUANYANG_PORT.DATA;
if (ha.current_offset == ha.response_length) {
_set_rxc_interrupt(false);
_set_baud(3325, 0b1101); // 9600 @ 32MHz with 2x USART
// No parity, 8 data bits, 1 stop bit
- USARTD1.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
+ HUANYANG_PORT.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc |
USART_CHSIZE_8BIT_gc;
// Configure receiver and transmitter
- USARTD1.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
+ HUANYANG_PORT.CTRLB = USART_RXEN_bm | USART_TXEN_bm | USART_CLK2X_bm;
ha.id = HUANYANG_ID;
hy_reset();
}
+void hy_deinit() {ha.shutdown = 5;}
+
+
void hy_set(float speed) {
if (ha.speed != speed) {
if (ha.debug) STATUS_DEBUG("huanyang: speed=%0.2f", speed);
}
-void hy_reset() {
- _set_dre_interrupt(false);
- _set_txc_interrupt(false);
- _set_rxc_interrupt(false);
- _set_write(true); // RS485 write mode
-
- // Flush USART
- uint8_t x = USARTD1.DATA;
- x = USARTD1.STATUS;
- x = x;
-
- // Save settings
- uint8_t id = ha.id;
- float speed = ha.speed;
- bool debug = ha.debug;
-
- // Clear state
- memset(&ha, 0, sizeof(ha));
-
- // Restore settings
- ha.id = id;
- ha.speed = speed;
- ha.debug = debug;
- ha.changed = true;
-
- _next_state();
-}
+void hy_reset() {_reset(false);}
void hy_rtc_callback() {
typedef enum {
- SPINDLE_TYPE_HUANYANG,
+ SPINDLE_TYPE_DISABLED,
SPINDLE_TYPE_PWM,
+ SPINDLE_TYPE_HUANYANG,
} spindle_type_t;
} spindle_t;
-static spindle_t spindle = {0};
+static spindle_t spindle = {SPINDLE_TYPE_DISABLED,};
-void spindle_init() {
- pwm_spindle_init();
- hy_init();
-}
+void spindle_init() {}
void spindle_set_speed(float speed) {
if (spindle.reversed) speed = -speed;
switch (spindle.type) {
+ case SPINDLE_TYPE_DISABLED: break;
case SPINDLE_TYPE_PWM: pwm_spindle_set(speed); break;
case SPINDLE_TYPE_HUANYANG: hy_set(speed); break;
}
void spindle_stop() {
switch (spindle.type) {
+ case SPINDLE_TYPE_DISABLED: break;
case SPINDLE_TYPE_PWM: pwm_spindle_stop(); break;
case SPINDLE_TYPE_HUANYANG: hy_stop(); break;
}
if (value != spindle.type) {
float speed = spindle.speed;
- spindle_set_speed(0);
+ switch (spindle.type) {
+ case SPINDLE_TYPE_DISABLED: break;
+ case SPINDLE_TYPE_PWM: pwm_spindle_deinit(); break;
+ case SPINDLE_TYPE_HUANYANG: hy_deinit(); break;
+ }
+
spindle.type = value;
+
+ switch (spindle.type) {
+ case SPINDLE_TYPE_DISABLED: break;
+ case SPINDLE_TYPE_PWM: pwm_spindle_init(); break;
+ case SPINDLE_TYPE_HUANYANG: hy_init(); break;
+ }
+
spindle_set_speed(speed);
}
}
VAR(analog_input, ai, f32, ANALOG, 0, 0, "Analog input pins")
// Spindle
-VAR(spindle_type, st, u8, 0, 1, 1, "PWM=0 or HUANYANG=1")
+VAR(spindle_type, st, u8, 0, 1, 1, "DISABLED=0, PWM=1 or HUANYANG=2")
VAR(spin_reversed, sr, bool, 0, 1, 1, "Reverse spin")
VAR(max_spin, sx, f32, 0, 1, 1, "Maximum spindle speed")
VAR(min_spin, sm, f32, 0, 1, 1, "Minimum spindle speed")