From 1a8345d4f0ab24b5539d9f729defedc2c68f29ca Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 21 Feb 2023 23:01:43 +0300 Subject: [PATCH] some bugs fixed, but found new (e.g. ADC always give 4095) --- F3:F303/Multistepper/adc.c | 23 ++++++-- F3:F303/Multistepper/adc.h | 12 +++-- F3:F303/Multistepper/can.c | 31 ++++++++--- F3:F303/Multistepper/commonproto.c | 53 ++++++++++++++---- F3:F303/Multistepper/commonproto.h | 9 ++++ F3:F303/Multistepper/hashgen/hdr.c | 10 ++++ F3:F303/Multistepper/hashgen/hdr.h | 2 + F3:F303/Multistepper/hashgen/helpcmds.in | 66 +++++++++++------------ F3:F303/Multistepper/hashgen/testdic | 8 ++- F3:F303/Multistepper/multistepper.bin | Bin 25356 -> 26096 bytes F3:F303/Multistepper/proto.c | 10 +++- F3:F303/Multistepper/proto.h | 1 + F3:F303/Multistepper/steppers.c | 2 +- F3:F303/Multistepper/version.inc | 4 +- 14 files changed, 161 insertions(+), 70 deletions(-) diff --git a/F3:F303/Multistepper/adc.c b/F3:F303/Multistepper/adc.c index f9aa6e1..d9e8293 100644 --- a/F3:F303/Multistepper/adc.c +++ b/F3:F303/Multistepper/adc.c @@ -17,6 +17,9 @@ */ #include "adc.h" +#ifdef EBUG +#include "proto.h" +#endif /** * @brief ADCx_array - arrays for ADC channels with median filtering: @@ -25,8 +28,8 @@ * 4 - internal Tsens - ADC1_IN16 * 5 - Vref - ADC1_IN18 * ADC2: - * 6 - AIN4 (ADC2_IN1) - * 7 - AIN5 (ADC2_IN10) + * 6 - AIN4 - vdrive/10 (ADC2_IN1) + * 7 - AIN5 - 5v/2 (ADC2_IN10) */ static uint16_t ADC_array[NUMBER_OF_ADC_CHANNELS*9]; @@ -76,7 +79,7 @@ void adc_setup(){ ADC1->SMPR2 = ADC_SMPR2_SMP16 | ADC_SMPR2_SMP18; // 4 conversions in group: 1->2->3->4->16->18 ADC1->SQR1 = (1<<6) | (2<<12) | (3<<18) | (4<<24) | (NUMBER_OF_ADC1_CHANNELS-1); - ADC1->SQR2 = (16<<6) | (18<<12); + ADC1->SQR2 = (16<<0) | (18<<6); ADC2->SMPR1 = ADC_SMPR1_SMP1; ADC2->SMPR2 = ADC_SMPR2_SMP10; ADC2->SQR1 = (1<<6) | (10<<12) | (NUMBER_OF_ADC2_CHANNELS-1); @@ -121,9 +124,12 @@ uint16_t getADCval(int nch){ PIX_SORT(p[3], p[6]) ; PIX_SORT(p[1], p[4]) ; PIX_SORT(p[2], p[5]) ; PIX_SORT(p[4], p[7]) ; PIX_SORT(p[4], p[2]) ; PIX_SORT(p[6], p[4]) ; PIX_SORT(p[4], p[2]) ; - return p[4]; #undef PIX_SORT #undef PIX_SWAP +#ifdef EBUG + DBG("val: "); printu(p[4]); newline(); +#endif + return p[4]; } // get voltage @input nch (V) @@ -131,6 +137,9 @@ float getADCvoltage(int nch){ float v = getADCval(nch); v *= getVdd(); v /= 4096.f; // 12bit ADC +#ifdef EBUG + DBG("v="); printf(v); newline(); +#endif return v; } @@ -142,6 +151,9 @@ float getMCUtemp(){ temperature *= (110.f - 30.f); temperature /= (float)(*TEMP30_CAL_ADDR - *TEMP110_CAL_ADDR); temperature += 30.f; +#ifdef EBUG + DBG("t="); printf(temperature); newline(); +#endif return(temperature); } @@ -149,5 +161,8 @@ float getMCUtemp(){ float getVdd(){ float vdd = ((float) *VREFINT_CAL_ADDR) * 3.3f; // 3.3V vdd /= getADCval(ADC_VREF); +#ifdef EBUG + DBG("vdd="); printf(vdd); newline(); +#endif return vdd; } diff --git a/F3:F303/Multistepper/adc.h b/F3:F303/Multistepper/adc.h index 32711bd..ded850a 100644 --- a/F3:F303/Multistepper/adc.h +++ b/F3:F303/Multistepper/adc.h @@ -19,8 +19,12 @@ #pragma once #include -#define NUMBER_OF_ADC1_CHANNELS (6) -#define NUMBER_OF_ADC2_CHANNELS (2) +// ADC1 channels +#define NUMBER_OF_ADC1_CHANNELS (6) +// ext ADC channels (ADC_AINx) +#define NUMBER_OF_EXT_ADC_CHANNELS (4) +// ADC2 channels +#define NUMBER_OF_ADC2_CHANNELS (2) // total number of channels - for array #define NUMBER_OF_ADC_CHANNELS ((NUMBER_OF_ADC1_CHANNELS+NUMBER_OF_ADC2_CHANNELS)) @@ -33,8 +37,8 @@ #define ADC_AIN3 (3) #define ADC_TS (4) #define ADC_VREF (5) -#define ADC_AIN4 (6) -#define ADC_AIN5 (7) +#define ADC_VDRIVE (6) +#define ADC_VFIVE (7) // starting index of ADC2 #define ADC2START (9*NUMBER_OF_ADC1_CHANNELS) diff --git a/F3:F303/Multistepper/can.c b/F3:F303/Multistepper/can.c index e8284fb..9dc5069 100644 --- a/F3:F303/Multistepper/can.c +++ b/F3:F303/Multistepper/can.c @@ -22,6 +22,9 @@ #include "hardware.h" #include "strfunc.h" #include "usb.h" +#ifdef EBUG +#include "proto.h" +#endif // PD1 - Tx, PD0 - Rx !!! @@ -53,7 +56,11 @@ CAN_status CAN_get_status(){ static int CAN_messagebuf_push(CAN_message *msg){ //MSG("Try to push\n"); #ifdef EBUG - USB_sendstr("push\n"); + USB_sendstr("push: "); + for(int i = 0; i < msg->length; ++i){ + printuhex(msg->data[i]); USB_putbyte(' '); + } + newline(); #endif if(first_free_idx == first_nonfree_idx){ #ifdef EBUG @@ -80,6 +87,13 @@ CAN_message *CAN_messagebuf_pop(){ first_nonfree_idx = -1; first_free_idx = 0; } +#ifdef EBUG + USB_sendstr("pop: "); + for(int i = 0; i < msg->length; ++i){ + printuhex(msg->data[i]); USB_putbyte(' '); + } + newline(); +#endif return msg; } @@ -304,8 +318,7 @@ uint32_t CAN_speed(){ return oldspeed; } -static void formerr(CAN_message *msg, errcodes err){ - if(msg->length < 4) msg->length = 4; +TRUE_INLINE void formerr(CAN_message *msg, errcodes err){ msg->data[3] = (uint8_t)err; } @@ -317,15 +330,16 @@ static void formerr(CAN_message *msg, errcodes err){ * [CMD][PAR][errcode][VALUE] * CMD - uint16_t, PAR - uint8_t, errcode - one of CAN_errcodes, VALUE - int32_t * `errcode` of incoming message doesn't matter + * all answers have 8 bytes length; incoming data may have variable length */ TRUE_INLINE void parseCANcommand(CAN_message *msg){ - int N = 1000; // we don't check msg here as it cannot be NULL #ifdef EBUG - DBG("Get data"); + DBG("Get data: "); for(int i = 0; i < msg->length; ++i){ USB_sendstr(uhex2str(msg->data[i])); USB_putbyte(' '); } + for(int i = msg->length-1; i < 8; ++i) msg->data[i] = 0; newline(); #endif if(msg->length == 0) goto sendmessage; // PING @@ -356,10 +370,10 @@ TRUE_INLINE void parseCANcommand(CAN_message *msg){ errcodes ec = cancmdlist[Index](par, val); if(ec != ERR_OK){ formerr(msg, ec); - }else{ - msg->length = 8; } sendmessage: + msg->length = 8; + int N = 1000; while(CAN_BUSY == CAN_send(msg->data, msg->length, the_conf.CANID)) if(--N == 0) break; } @@ -369,7 +383,8 @@ static void can_process_fifo(uint8_t fifo_num){ CAN_FIFOMailBox_TypeDef *box = &CAN->sFIFOMailBox[fifo_num]; volatile uint32_t *RFxR = (fifo_num) ? &CAN->RF1R : &CAN->RF0R; #ifdef EBUG - USB_sendstr(u2str(*RFxR & CAN_RF0R_FMP0)); USB_sendstr(" messages in FIFO\n"); + USB_sendstr(u2str(*RFxR & CAN_RF0R_FMP0)); USB_sendstr(" messages in FIFO #"); + USB_sendstr(u2str(fifo_num)); newline(); #endif // read all while(*RFxR & CAN_RF0R_FMP0){ // amount of messages pending diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 3ca156b..68deeb6 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -42,8 +42,12 @@ static errcodes cu_nosuchfn(uint8_t _U_ par, int32_t _U_ *val){ errcodes cu_abspos(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); - stopmotor(n); - return ERR_OK; + errcodes ret = ERR_OK; + if(ISSETTER(par)){ + ret = setmotpos(n, *val); + } + getpos(n, val); + return ret; } errcodes cu_accel(uint8_t _U_ par, int32_t _U_ *val){ @@ -56,10 +60,13 @@ errcodes cu_accel(uint8_t _U_ par, int32_t _U_ *val){ return ERR_OK; } +static const uint8_t extADCchnl[NUMBER_OF_EXT_ADC_CHANNELS] = {ADC_AIN0, ADC_AIN1, ADC_AIN2, ADC_AIN3}; +// V*10 errcodes cu_adc(uint8_t par, int32_t *val){ uint8_t n = PARBASE(par); - if(n > NUMBER_OF_ADC_CHANNELS-1) return ERR_BADPAR; - *val = getADCval(n); + if(n > NUMBER_OF_EXT_ADC_CHANNELS - 1) return ERR_BADPAR; + float v = getADCvoltage(extADCchnl[n])*10.f; + *val = (int32_t)v; return ERR_OK; } @@ -109,12 +116,8 @@ errcodes cu_eswreact(uint8_t _U_ par, int32_t _U_ *val){ errcodes cu_goto(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); - errcodes ret = ERR_OK; - if(ISSETTER(par)){ - ret = setmotpos(n, *val); - } - getpos(n, val); - return ret; + if(ISSETTER(par)) return motor_absmove(n, *val); + return getpos(n, val); } errcodes cu_gotoz(uint8_t _U_ par, int32_t _U_ *val){ @@ -328,6 +331,20 @@ errcodes cu_usartstatus(uint8_t _U_ par, int32_t _U_ *val){ return ERR_BADCMD; } +// V*10 +errcodes cu_vdrive(uint8_t par, int32_t _U_ *val){ + NOPARCHK(par); + float v = getADCvoltage(ADC_VDRIVE)*100.f; + *val = (int32_t)v; + return ERR_OK; +} + +errcodes cu_vfive(uint8_t par, int32_t *val){ + NOPARCHK(par); + float v = getADCvoltage(ADC_VFIVE)*20.f; + *val = (int32_t)v; + return ERR_OK; +} const fpointer cancmdlist[CCMD_AMOUNT] = { // different commands @@ -368,6 +385,13 @@ const fpointer cancmdlist[CCMD_AMOUNT] = { [CCMD_ENCPOS] = cu_nosuchfn, [CCMD_SETPOS] = cu_abspos, [CCMD_GOTOZERO] = cu_gotoz, + [CCMD_MOTMUL] = cu_motmul, + [CCMD_DIAGN] = cu_diagn, + [CCMD_ERASEFLASH] = cu_eraseflash, + [CCMD_UDATA] = cu_udata, + [CCMD_USARTSTATUS] = cu_usartstatus, + [CCMD_VDRIVE] = cu_vdrive, + [CCMD_VFIVE] = cu_vfive // Leave all commands upper for back-compatability with 3steppers }; @@ -399,5 +423,12 @@ const char* cancmds[CCMD_AMOUNT] = { [CCMD_REINITMOTORS] = "motreinit", [CCMD_MOTORSTATE] = "state", [CCMD_SETPOS] = "abspos", - [CCMD_GOTOZERO] = "gotoz" + [CCMD_GOTOZERO] = "gotoz", + [CCMD_MOTMUL] = "motmul", + [CCMD_DIAGN] = "diagn", + [CCMD_ERASEFLASH] = "eraseflash", + [CCMD_UDATA] = "udata", + [CCMD_USARTSTATUS] = "usartstatus", + [CCMD_VDRIVE] = "vdrive", + [CCMD_VFIVE] = "vfive" }; diff --git a/F3:F303/Multistepper/commonproto.h b/F3:F303/Multistepper/commonproto.h index c1463ec..d45ec41 100644 --- a/F3:F303/Multistepper/commonproto.h +++ b/F3:F303/Multistepper/commonproto.h @@ -86,6 +86,13 @@ enum{ ,CCMD_MOTORSTATE // motor state ,CCMD_ENCPOS // position of encoder (independing on settings) ,CCMD_SETPOS // set motor position + ,CCMD_MOTMUL + ,CCMD_DIAGN + ,CCMD_ERASEFLASH + ,CCMD_UDATA + ,CCMD_USARTSTATUS + ,CCMD_VDRIVE + ,CCMD_VFIVE // should be the last: ,CCMD_AMOUNT // amount of common commands }; @@ -129,3 +136,5 @@ errcodes cu_stop(uint8_t par, int32_t *val); errcodes cu_tmcbus(uint8_t par, int32_t *val); errcodes cu_udata(uint8_t par, int32_t *val); errcodes cu_usartstatus(uint8_t par, int32_t *val); +errcodes cu_vdrive(uint8_t par, int32_t *val); +errcodes cu_vfive(uint8_t par, int32_t *val); diff --git a/F3:F303/Multistepper/hashgen/hdr.c b/F3:F303/Multistepper/hashgen/hdr.c index 574f9a5..4896a8b 100644 --- a/F3:F303/Multistepper/hashgen/hdr.c +++ b/F3:F303/Multistepper/hashgen/hdr.c @@ -114,6 +114,10 @@ int fn_udata(_U_ uint32_t hash, _U_ char *args) WAL; // "udata" (2736127636) int fn_usartstatus(_U_ uint32_t hash, _U_ char *args) WAL; // "usartstatus" (4007098968) +int fn_vdrive(_U_ uint32_t hash, _U_ char *args) WAL; // "vdrive" (2172773525) + +int fn_vfive(_U_ uint32_t hash, _U_ char *args) WAL; // "vfive" (3017477285) + static uint32_t hashf(const char *str){ uint32_t hash = 5381; uint32_t c; @@ -291,6 +295,12 @@ int parsecmd(const char *str){ case CMD_USARTSTATUS: return fn_usartstatus(h, args); break; + case CMD_VDRIVE: + return fn_vdrive(h, args); + break; + case CMD_VFIVE: + return fn_vfive(h, args); + break; default: break; } return RET_CMDNOTFOUND; diff --git a/F3:F303/Multistepper/hashgen/hdr.h b/F3:F303/Multistepper/hashgen/hdr.h index d2fd0b9..e3e41c7 100644 --- a/F3:F303/Multistepper/hashgen/hdr.h +++ b/F3:F303/Multistepper/hashgen/hdr.h @@ -65,3 +65,5 @@ int parsecmd(const char *cmdwargs); #define CMD_TMCBUS (1906135955) #define CMD_UDATA (2736127636) #define CMD_USARTSTATUS (4007098968) +#define CMD_VDRIVE (2172773525) +#define CMD_VFIVE (3017477285) diff --git a/F3:F303/Multistepper/hashgen/helpcmds.in b/F3:F303/Multistepper/hashgen/helpcmds.in index d8bb1ae..6b0f843 100644 --- a/F3:F303/Multistepper/hashgen/helpcmds.in +++ b/F3:F303/Multistepper/hashgen/helpcmds.in @@ -1,12 +1,12 @@ - "absposN* - GS absolute position (in steps, setter just changes current value)\n" - "accelN* - GS accel/decel (steps/s^2)\n" - "adcN* - G ADC value (N=0..3)\n" - "button[N]* - G all or given (N=0..6) buttons' state\n" + "absposN - GS absolute position (in steps, setter just changes current value)\n" + "accelN - GS accel/decel (steps/s^2)\n" + "adcN - G ADC value (N=0..3)\n" + "button[N] - G all or given (N=0..6) buttons' state\n" "canerrcodes - G print last CAN errcodes\n" "canfilter - GS can filters, format: bank# FIFO# mode(M/I) num0 [num1 [num2 [num3]]]\n" "canflood - send/clear flood message: ID byte0 ... byteN\n" "canfloodT - GS flood period (>=0ms)\n" - "canid* - GS CAN ID of device\n" + "canid - GS CAN ID of device\n" "canignore - GS ignore list (max 10 IDs), negative to delete\n" "canincrflood - send incremental flood message (ID is last for 'flood', stop by 'flood')\n" "canpause - pause IN packets displaying\n" @@ -15,42 +15,40 @@ "cansend - send data over CAN: send ID byte0 .. byteN (N<8)\n" "canspeed - GS CAN speed (reinit if setter)\n" "canstat - G CAN status\n" - "delignlist* - delete ignore list\n" "diagn[N]* - G DIAG state of motor N (or all)\n" - "dumperr* - dump error codes\n" - "dumpcmd* - dump command codes\n" - "dumpconf* - dump current configuration\n" - "emstop[N]* - emergency stop motor N or all\n" - "encposN* - GS encoder's position\n" - "encrevN* - GS max encoder's pulses per revolution\n" - "encstepmaxN* - GS maximal encoder ticks per step\n" - "encstepminN* - GS minimal encoder ticks per step\n" - "eraseflash* - erase flash data storage\n" - "esw[N]* - G end-switches state\n" - "eswreactN* - GS end-switches reaction (0 - ignore, 1 - stop@any, 2 - stop@zero)\n" - "gotoN* - GS move motor to given absolute position\n" - "gotozN* - find zero position & refresh counters\n" + "dumperr - dump error codes\n" + "dumpcmd - dump command codes\n" + "dumpconf - dump current configuration\n" + "dumpmotflags - dump motor flags' bits\n" + "emstop[N] - emergency stop motor N or all\n" + "eraseflash - erase flash data storage\n" + "esw[N] - G end-switches state\n" + "eswreactN - GS end-switches reaction (0 - ignore, 1 - stop@any, 2 - stop@zero)\n" + "gotoN - GS move motor to given absolute position\n" + "gotozN - find zero position & refresh counters\n" "gpioconfN* - GS GPIO configuration (0 - PUin, 1 - PPout, 2 - ODout), N=0..2\n" "gpioN* - GS GPIO values, N=0..2\n" - "maxspeedN* - GS max speed (steps per sec)\n" - "maxstepsN* - GS max steps (from zero ESW)\n" - "mcut* - G MCU T\n" - "mcuvdd* - G MCU Vdd\n" - "microstepsN* - GS microsteps settings (2^0..2^9)\n" - "minspeedN* - min speed (steps per sec)\n" - "motflagsN* - motorN flags\n" + "maxspeedN - GS max speed (steps per sec)\n" + "maxstepsN - GS max steps (from zero ESW)\n" + "mcut - G MCU T\n" + "mcuvdd - G MCU Vdd\n" + "microstepsN - GS microsteps settings (2^0..2^9)\n" + "minspeedN - min speed (steps per sec)\n" + "motflagsN - motorN flags\n" "motmul* - GS external multiplexer status (<0 - disable, 0..7 - enable and set address)\n" - "motreinit* - re-init motors after configuration changed\n" - "ping* - echo given command back\n" - "relposN* - GS relative move (get remaining)\n" - "relslowN* - GS like 'relpos' but with slowest speed\n" + "motreinit - re-init motors after configuration changed\n" + "ping - echo given command back\n" + "relposN - GS relative move (get remaining)\n" + "relslowN - GS like 'relpos' but with slowest speed\n" "reset - software reset\n" - "saveconf* - save current configuration\n" + "saveconf - save current configuration\n" "screen* - GS screen enable (1) or disable (0)\n" - "speedlimit* - G limiting speed for current microsteps setting\n" - "stateN* - G motor state (0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err)\n" - "stopN* - stop motor with deceleration\n" + "speedlimit - G limiting speed for current microsteps setting\n" + "stateN - G motor state (0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err)\n" + "stopN - stop motor with deceleration\n" "time - G time from start (ms)\n" "tmcbus* - GS TMC control bus (0 - USART, 1 - SPI)\n" "udata* - GS data by usart in slave mode (text strings, '\\n'-terminated)\n" "usartstatus* - GS status of USART1 (0 - off, 1 - master, 2 - slave)\n" + "vdrive - G approx voltage on Vdrive\n" + "vfive - G approx voltage on 5V bus\n" diff --git a/F3:F303/Multistepper/hashgen/testdic b/F3:F303/Multistepper/hashgen/testdic index c3fc849..eace749 100644 --- a/F3:F303/Multistepper/hashgen/testdic +++ b/F3:F303/Multistepper/hashgen/testdic @@ -15,16 +15,12 @@ canresume cansend canspeed canstat -delignlist diagn dumperr dumpcmd dumpconf +dumpmotflags emstop -encpos -encrev -encstepmax -encstepmin eraseflash esw eswreact @@ -54,3 +50,5 @@ time tmcbus udata usartstatus +vdrive +vfive diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 68e9670c5e4f6c9c1206befe8db13f00a990acd5..e9e644e8919cdbf750a0474163f46f9f4baa0c47 100755 GIT binary patch delta 10155 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 diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index cd20c53..dd35300 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -547,7 +547,7 @@ static int canusb_function(uint32_t hash, char *args){ } USB_sendstr("KEY"); USB_putbyte('0'+PARBASE(par)); USB_putbyte('='); USB_sendstr(kstate); - USB_sendstr("KEYTIME="); USB_sendstr(u2str(val)); + USB_sendstr("\nKEYTIME="); USB_sendstr(u2str(val)); newline(); return RET_GOOD; break; @@ -635,6 +635,12 @@ static int canusb_function(uint32_t hash, char *args){ case CMD_USARTSTATUS: e = cu_usartstatus(par, &val); break; + case CMD_VDRIVE: + e = cu_vdrive(par, &val); + break; + case CMD_VFIVE: + e = cu_vfive(par, &val); + break; default: e = ERR_BADCMD; break; @@ -690,6 +696,8 @@ int fn_stop(uint32_t _U_ hash, char _U_ *args) AL; //* "stop" (17184971) int fn_tmcbus(uint32_t _U_ hash, char _U_ *args) AL; //* "tmcbus" (1906135955) int fn_udata(uint32_t _U_ hash, char _U_ *args) AL; //* "udata" (2736127636) int fn_usartstatus(uint32_t _U_ hash, char _U_ *args) AL; //* "usartstatus" (4007098968) +int fn_vdrive(uint32_t _U_ hash, char _U_ *args) AL; // "vdrive" (2172773525) +int fn_vfive(uint32_t _U_ hash, char _U_ *args) AL; // "vfive" (3017477285) /** diff --git a/F3:F303/Multistepper/proto.h b/F3:F303/Multistepper/proto.h index 3d56d91..883e760 100644 --- a/F3:F303/Multistepper/proto.h +++ b/F3:F303/Multistepper/proto.h @@ -26,6 +26,7 @@ #define printu(x) do{USB_sendstr(u2str(x));}while(0) #define printi(x) do{USB_sendstr(i2str(x));}while(0) #define printuhex(x) do{USB_sendstr(uhex2str(x));}while(0) +#define printf(x) do{USB_sendstr(float2str(x, 2));}while(0) extern uint8_t ShowMsgs; // show CAN messages flag diff --git a/F3:F303/Multistepper/steppers.c b/F3:F303/Multistepper/steppers.c index 53abeab..634bacf 100644 --- a/F3:F303/Multistepper/steppers.c +++ b/F3:F303/Multistepper/steppers.c @@ -110,7 +110,7 @@ errcodes setmotpos(uint8_t i, int32_t position){ if(state[i] != STP_RELAX) return ERR_CANTRUN; if(position > (int32_t)the_conf.maxsteps[i] || position < -(int32_t)the_conf.maxsteps[i]) return ERR_BADVAL; // too big position or zero - if(position == stppos[i]) return ERR_OK; + stppos[i] = position; return ERR_OK; } diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index d7eede4..685da40 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "54" -#define BUILD_DATE "2023-02-20" +#define BUILD_NUMBER "56" +#define BUILD_DATE "2023-02-21"