From 3e8bedd15ff42aa10b500827899284cd2713a1ce Mon Sep 17 00:00:00 2001 From: Jake <jake.read@cba.mit.edu> Date: Mon, 12 Mar 2018 18:16:08 -0400 Subject: [PATCH] ready to drum on things, probably almost --- circuit/mkstepper/eagle.epf | 4 +- .../.vs/mkstepper-v011/v14/.atsuo | Bin 93696 -> 93696 bytes .../mkstepper-v011/Debug/Makefile | 18 ++- .../mkstepper-v011/Debug/makedep.mk | 4 + .../mkstepper-v011/apahandler.c | 87 +++++++++++++++ .../mkstepper-v011/apahandler.h | 24 ++++ .../mkstepper-v011/mkstepper-v011/apaport.c | 104 ++++++++++++++++++ .../mkstepper-v011/mkstepper-v011/apaport.h | 50 +++++++++ .../mkstepper-v011/mkstepper-v011/hardware.h | 25 ++++- embedded/mkstepper-v011/mkstepper-v011/main.c | 87 ++++++++------- .../mkstepper-v011/mkstepper-v011.cproj | 12 ++ .../mkstepper-v011/ringbuffer.c | 16 +-- .../mkstepper-v011/mkstepper-v011/stepper.c | 21 +++- .../mkstepper-v011/mkstepper-v011/stepper.h | 4 + .../mkstepper-v011/mkstepper-v011/tmc26.c | 2 +- .../mkstepper-v011/mkstepper-v011/uartport.c | 33 +++--- .../mkstepper-v011/mkstepper-v011/uartport.h | 13 ++- 17 files changed, 426 insertions(+), 78 deletions(-) create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apahandler.c create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apahandler.h create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apaport.c create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apaport.h diff --git a/circuit/mkstepper/eagle.epf b/circuit/mkstepper/eagle.epf index 443d625..b7746cf 100644 --- a/circuit/mkstepper/eagle.epf +++ b/circuit/mkstepper/eagle.epf @@ -136,7 +136,7 @@ Loc="0 0 1919 1016" State=1 Number=2 File="mkstepper.brd" -View="1.28827 14.4541 62.3512 59.9496" +View="0.634931 11.1659 35.9723 37.4943" WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524" PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0" PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6" @@ -183,7 +183,7 @@ State=1 Number=0 [Desktop] -Screen="1920 1080" +Screen="3840 1080" Window="Win_1" Window="Win_2" Window="Win_3" diff --git a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo index 7fe5d562843ce2d6165dffb2b5051d7c2e912c9c..2a163195ec2d360f156b89f2e032ad41f585a747 100644 GIT binary patch delta 698 zcmZp;!`g6%bwdsl>j!arDWlDWZ2gRrSVTg(85kJ;LjeyGTLj291!5K;76M{nAcm>q z0J5ck*bs>MfmjKM{{kiXfV4CaZ=O6+L4I-viw6rx$L1?6GZ<MnyqgTRbv0uo7f=aE zLJ&xUtO2n>fDOn7StSF+|A2e}Ak7KHAUSMS$wB2n^0GiS$Xa2LwG(4FHs9dL=Hz5h z2MTKf@npFerO5_NY^=>d&W*{HLSCGVAZ=R6a_vCQy~#g?ye1!JGGy%r@*YgC6!xC% zB5W}Ei?H5gB_TBy6b&%L>KQ@Wyg5KNX(O8mGXr8`Kgh(*KOMapIdp(bP$<IOHMzvO zXOoi)BL_%3n#8)vN?A%AAlK?5>DXN2(8IV$hGmk)0me;}4@#|+E?~%H$YaoBNM?w) zd#k^(U2;}WyrfI|de;VqiGk9S7f35iGIf|_=fVLph8x8wy9<mQ8bA>P6w$0TjGGli z7BfyhENsYK50ttC#6U3pp$((r<OI{Yi3Kc^7iq{%K47+HdQJwT+2%!>aeR|h1U3s; zd|;gZ$c9k?o2to+%uh_tk`@roV9=D;l@!gomz?;q(7*eWZWz#^!kZVEB`^XFX%?{C KE?~#_K_39&ncwyR delta 712 zcmZp;!`g6%bwdslo5Kmw`ei#e7cnhj3{_xYVE7LOCO|d^l+OaBg`sRtApIAph6hOh zgQ}GRvJIi~N>G{)NDBh-=81vgEFwV0<Q5hm7E_SO6_y!{tPGmzl?s~+*;X?KDgXsx z)(Ro9*??>=BtA$D$XPJ!q=9UZbs*<}tdjxa%|I+Xd7^<Z+)h@Io&Ppp<;dgYWK;*T zHGz1tT#V9W112`sW+3Om<Vulx#z&KXig-^xB5c6g4HSDcxl$O&lQNk6MObgMlG;MX z$%kD{8E<X=sd@^+ytDbIG&|E|2a__vEA^XRdD?zeR^K6*@^0sAPKJqr!c4*Jo99@h zFfNi|nHZumS;Jrsqrm2)2G)$zC#Ev`Z1&M9VPxDg`JlP~^o6O6HgLYC<76fgHx|;| z$kq??1;gZD@&&3H42cXy3@HrdU^<mSk0FEMLh$4%pM$D-d6k*8#eG#8LGGKpNJEZs z&*Xy&D^*LuN=q0D81jKyOMqIE87@4Q)tful%l`<sP)OUs<=!AIn-^)u@l8_9+MH!E zjd7BNz+?e26DDqk$q!5vfMLluxkN00LjdR!P`tnbm`w-Bc@jAJmzWm^DE>gn2qrhV wMBJZ~K?^7XN>ngWHdP?!3e)6Yt`HrPNOGG?+<F)%DY-Pe*ll;QW89+;0Lj7c&Hw-a diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile index c1f9222..b582b1c 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile +++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile @@ -38,6 +38,8 @@ SUBDIRS := \ # Add inputs and outputs from these tool invocations to the build variables C_SRCS += \ +../apahandler.c \ +../apaport.c \ ../Device_Startup/startup_samd51.c \ ../Device_Startup/system_samd51.c \ ../main.c \ @@ -56,6 +58,8 @@ ASM_SRCS += OBJS += \ +apahandler.o \ +apaport.o \ Device_Startup/startup_samd51.o \ Device_Startup/system_samd51.o \ main.o \ @@ -67,6 +71,8 @@ tmc26.o \ uartport.o OBJS_AS_ARGS += \ +apahandler.o \ +apaport.o \ Device_Startup/startup_samd51.o \ Device_Startup/system_samd51.o \ main.o \ @@ -78,6 +84,8 @@ tmc26.o \ uartport.o C_DEPS += \ +apahandler.d \ +apaport.d \ Device_Startup/startup_samd51.d \ Device_Startup/system_samd51.d \ main.d \ @@ -89,6 +97,8 @@ tmc26.d \ uartport.d C_DEPS_AS_ARGS += \ +apahandler.d \ +apaport.d \ Device_Startup/startup_samd51.d \ Device_Startup/system_samd51.d \ main.d \ @@ -134,14 +144,18 @@ LINKER_SCRIPT_DEP+= \ -Device_Startup/%.o: ../Device_Startup/%.c + + + + +./%.o: .././%.c @echo Building file: $< @echo Invoking: ARM/GNU C Compiler : 6.3.1 $(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE) -x c -mthumb -D__SAMD51J18A__ -DDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include" -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" @echo Finished building: $< -./%.o: .././%.c +Device_Startup/%.o: ../Device_Startup/%.c @echo Building file: $< @echo Invoking: ARM/GNU C Compiler : 6.3.1 $(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE) -x c -mthumb -D__SAMD51J18A__ -DDEBUG -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include" -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<" diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk index 7dc1a30..1e1e106 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk +++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk @@ -2,6 +2,10 @@ # Automatically-generated file. Do not edit or delete the file ################################################################################ +apahandler.c + +apaport.c + Device_Startup\startup_samd51.c Device_Startup\system_samd51.c diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c new file mode 100644 index 0000000..ac9c4b8 --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c @@ -0,0 +1,87 @@ +/* + * apahandler.c + * + * Created: 3/12/2018 11:55:30 AM + * Author: Jake + */ + +#include "hardware.h" +#include "apahandler.h" +#include "stepper.h" + +void apa_handle_packet(uint8_t *packet, uint8_t length){ + // dirty debug reply + uart_sendchars_buffered(&up0, packet, length); + // through packet + int i = 0; + int apa_handler_state = APA_HANDLER_OUTSIDE; + + while(i < length){ // prep for the messy double switch :| + pin_clear(&stlr); + switch (apa_handler_state){ + case APA_HANDLER_OUTSIDE: + if (packet[i] == APA_END_ADDR_DELIMITER){ + apa_handler_state = APA_HANDLER_INSIDE; + } else { + // + } + i ++; + break; + + case APA_HANDLER_INSIDE: + switch (packet[i]){ + case DELIM_KEY_POSITION_FLOAT: + if(i + 5 < length){ + break; // broken data + } else { + float position = 0; + position = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb + stepper_targetposition_float(&stepper, position); + i += 5; // bring packet ptr to next key (should) + break; + } + + case DELIM_KEY_POSITION_STEPS: + if(i + 5 < length){ + break; // broken data + } else { + int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb + stepper_targetposition_steps(&stepper, steps); + i += 5; // bring packet ptr to next key (should) + break; + } + + case DELIM_KEY_SPEED_FLOAT: + if(i + 5 < length){ + break; // broken data + } else { + float speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb + stepper_targetspeed_float(&stepper, speed); + i += 5; // bring packet ptr to next key (should) + break; + } + + case DELIM_KEY_SPEED_STEPS: + if(i + 5 < length){ + break; // broken data + } else { + int32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb + stepper_targetspeed_steps(&stepper, speed); + i += 5; // bring packet ptr to next key (should) + break; + } + + default: + // probably an error + break; + } // end interior switch + i ++; + break; + + default: + // throw err + break; + } // end y/n switch + } + pin_set(&stlr); +} \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h new file mode 100644 index 0000000..fbda15f --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h @@ -0,0 +1,24 @@ +/* + * apahandler.h + * + * Created: 3/12/2018 11:55:40 AM + * Author: Jake + */ + + +#ifndef APAHANDLER_H_ +#define APAHANDLER_H_ + +#include "sam.h" + +#define APA_HANDLER_OUTSIDE 0 +#define APA_HANDLER_INSIDE 1 + +#define DELIM_KEY_POSITION_FLOAT 127 // is 32 bit float +#define DELIM_KEY_SPEED_FLOAT 128 // is 32 bit float +#define DELIM_KEY_POSITION_STEPS 129 // is 32 bit int +#define DELIM_KEY_SPEED_STEPS 130 // is 32 bit int + +void apa_handle_packet(uint8_t *packet, uint8_t length); + +#endif /* APAHANDLER_H_ */ \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.c b/embedded/mkstepper-v011/mkstepper-v011/apaport.c new file mode 100644 index 0000000..40a6e26 --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/apaport.c @@ -0,0 +1,104 @@ +/* + * apaport.c + * + * Created: 2/23/2018 9:17:48 AM + * Author: Jake + */ + +#include "apaport.h" +#include "hardware.h" + +void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, uartport_t **uarts, uint8_t numports, pin_t *stlr, pin_t *stlb){ + apap->uart = uart; + apap->uarts = uarts; + apap->portnum = portnum; + apap->numports = numports; + apap->stlr = stlr; + apap->stlb = stlb; +} + +void apaport_reset(apaport_t *apap){ + apap->packet_num = 0; + apap->packets_ready = 0; + apap->packet_state = APAPORT_OUTSIDE_PACKET; + apap->packet_position = 0; + + pin_set(apap->stlr); + pin_set(apap->stlb); +} + +void apaport_scan(apaport_t *apap, uint32_t maxpackets){ + // scan through for completely received packets + while(apap->packets_ready <= maxpackets){ + // check that we have bytes to read out of the buffer + if(rb_empty(apap->uart->rbrx)){ + //pin_set(apap->stlr); + break; + } + // pull bytes out of buffer into the packet structure + apap->packets[apap->packet_num][apap->packet_position] = rb_get(apap->uart->rbrx); + apap->packet_position ++; + // now segment, point to them + if(apap->packet_position >= apap->packets[apap->packet_num][0]){ + // length is 1st byte, like array[n] not array[n-1] + // now volley for next pass + // packet_num is index of head of packet buffer (just an array) + apap->packet_num = (apap->packet_num + 1) % APAPORT_NUM_STATIC_PACKETS; // inc. and loop + // packets_ready is the number of ready-state packets in that buffer (array) + apap->packets_ready ++; + // the position, in bytes, where we are currently operating. + // at this point, we have come to the end, so we're resetting counter for the next + apap->packet_position = 0; + } + } + // end 1st scan for packets, now we know we have apaport->packet_num packets completely received + // now we handle those packets + while(apap->packets_ready > 0){ + // the particular packet index + uint32_t p = (apap->packet_num + APAPORT_NUM_STATIC_PACKETS - apap->packets_ready) % APAPORT_NUM_STATIC_PACKETS; + // now to handle + // [p][0] is length of packet + if(apap->packets[p][1] == APA_ADDR_POINTER){ + apa_handle_packet(apap->packets[p], apap->packets[p][0]); + } else if(apap->packets[p][1] == APA_ADDR_FLOOD){ + // loop through bytes to find pointer and increment + apapacket_increment_pointer(apap->packets[p], apap->portnum); + // now ship it out on all ports + for(int i = 0; i < APAPORT_NUM_PORTS; i ++){ + if(i == apap->portnum){ + // don't flood back + } else { + uart_sendchars_buffered(apap->uarts[i], apap->packets[p], apap->packets[p][0]); + } + } + } else { + // packet is for a particular port, + // we pull that out of the packet now in case the pointer decrements into [1] + uint8_t port = apap->packets[p][1]; + // and check that we're sending it out on a port that exists + if (port >= APAPORT_NUM_PORTS){ + port = APAPORT_NUM_PORTS - 1; + } + // now we can increment, safely moving pointer + apapacket_increment_pointer(apap->packets[p], apap->portnum); + // send on next port + // HERE: failing on send to other ports? + // double / triple check pointer to pointer + uart_sendchars_buffered(apap->uarts[port], apap->packets[p], apap->packets[p][0]); + } + // debug reply (at the moment, reply is handled in apa_handle_packet + // uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]); + apap->packets_ready --; + } +} + +void apapacket_increment_pointer(uint8_t *packet, uint8_t portnum){ + for(int i = 2; i < packet[0]; i ++){ + // loop through bytes to find pointer and increment + if(packet[i] == APA_ADDR_POINTER){ + packet[i-1] = APA_ADDR_POINTER; // increment pointer forwards + packet[i] = portnum; // port received on is this one + break; // we can finish scan now, not looping senselessly through rest of packet + } + } +} \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.h b/embedded/mkstepper-v011/mkstepper-v011/apaport.h new file mode 100644 index 0000000..248733a --- /dev/null +++ b/embedded/mkstepper-v011/mkstepper-v011/apaport.h @@ -0,0 +1,50 @@ +/* + * apaport.h + * + * Created: 2/23/2018 9:17:34 AM + * Author: Jake + */ + + +#ifndef APAPORT_H_ +#define APAPORT_H_ + +#include "apahandler.h" +#include "uartport.h" +#include "pin.h" + +#define APAPORT_NUM_STATIC_PACKETS 4 +#define APAPORT_NUM_PORTS 5 + +#define APAPORT_OUTSIDE_PACKET 0 +#define APAPORT_INSIDE_PACKET 1 + +#define APA_END_ADDR_DELIMITER 255 +#define APA_ADDR_POINTER 254 +#define APA_ADDR_FLOOD 253 + +typedef struct{ + uartport_t *uart; + uartport_t **uarts; // ptr to array of ptrs ? + pin_t *stlr; + pin_t *stlb; + + uint8_t portnum; // which port are we + uint8_t numports; // how many in the array we got + + uint32_t packet_num; + uint32_t packet_position; + uint32_t packets_ready; + uint32_t packet_state; + uint8_t packets[APAPORT_NUM_STATIC_PACKETS][256]; // packets for handling by app +}apaport_t; + +void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, uartport_t **uarts, uint8_t numports, pin_t *stlr, pin_t *stlb); + +void apaport_reset(apaport_t *apap); + +void apaport_scan(apaport_t *apap, uint32_t maxpackets); + +void apapacket_increment_pointer(uint8_t *packet, uint8_t portnum); + +#endif /* APAPORT_H_ */ \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/hardware.h b/embedded/mkstepper-v011/mkstepper-v011/hardware.h index c86c98a..d78aa62 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/hardware.h +++ b/embedded/mkstepper-v011/mkstepper-v011/hardware.h @@ -11,27 +11,42 @@ #include "pin.h" #include "uartport.h" +#include "apaport.h" #include "spiport.h" #include "ringbuffer.h" #include "tmc26.h" #include "stepper.h" +// LIGHTS + pin_t stlr; pin_t stlb; +// PORTS + +pin_t up0_stlr; +pin_t up0_stlb; +pin_t up1_stlr; +pin_t up1_stlb; + +ringbuffer_t up0_rbrx; +ringbuffer_t up0_rbtx; ringbuffer_t up1_rbrx; ringbuffer_t up1_rbtx; -ringbuffer_t up2_rbrx; -ringbuffer_t up2_rbtx; +uartport_t up0; uartport_t up1; -uartport_t up2; // array of ptrs to uartports // inits in main.c #define NUM_UPS 2 uartport_t *ups[NUM_UPS]; +apaport_t apap0; +apaport_t apap1; + +// TMC26x + spiport_t spi_tmc; pin_t step_pin; @@ -41,6 +56,8 @@ pin_t sg_pin; tmc26_t tmc; +// TIMERS + uint32_t overflows; uint32_t blindcounter; @@ -51,6 +68,8 @@ uint32_t blindcounter; #define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC) #define TICKER (TC0->COUNT32.COUNT.reg) +// STEPPER + stepper_t stepper; #endif /* HARDWARE_H_ */ \ No newline at end of file diff --git a/embedded/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c index ec3e8d7..25747e0 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/main.c +++ b/embedded/mkstepper-v011/mkstepper-v011/main.c @@ -10,6 +10,7 @@ #include "pin.h" #include "uartport.h" #include "spiport.h" +#include "apaport.h" #include "hardware.h" @@ -76,6 +77,7 @@ void clock_init(void){ OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK | OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM; while(!OSCCTRL->STATUS.bit.DFLLRDY); + // this is generating a reference for our 120mhz GCLK->GENCTRL[5].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV(24u); while(GCLK->SYNCBUSY.bit.GENCTRL5); @@ -159,7 +161,7 @@ int main(void) /* Initialize the SAM system */ SystemInit(); clock_init(); - SysTick_Config(5000000); + SysTick_Config(12000000); pin_t clockpin = pin_new(&PORT->Group[1], 2); pin_output(&clockpin); @@ -182,20 +184,26 @@ int main(void) NVIC_EnableIRQ(TC2_IRQn); // ringbuffers (for uart ports) + rb_init(&up0_rbrx); + rb_init(&up0_rbtx); rb_init(&up1_rbrx); rb_init(&up1_rbtx); - rb_init(&up2_rbrx); - rb_init(&up2_rbtx); // uarts (ports) - // TODO: have used PMUXO and PMUXE incorrectly: only set one of these, based on whether / not pin is even / odd ! - - up1 = uart_new(SERCOM4, &PORT->Group[0], &up1_rbrx, &up1_rbtx, 12, 13, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); + // there's some chance we should really be using one gclk channel for all of the peripherals + // and running that at 100MHz or so + up0 = uart_new(SERCOM4, &PORT->Group[0], &up0_rbrx, &up0_rbtx, 12, 13, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM4; - uart_init(&up1, 6, SERCOM4_GCLK_ID_CORE, 63018); // baud: 45402 for 921600, 63018 for 115200 - up2 = uart_new(SERCOM5, &PORT->Group[1], &up2_rbrx, &up2_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); + uart_init(&up0, 6, SERCOM4_GCLK_ID_CORE, 62675); // baud: 45402 for 921600, 63018 for 115200 + up1 = uart_new(SERCOM5, &PORT->Group[1], &up1_rbrx, &up1_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5; - uart_init(&up2, 7, SERCOM5_GCLK_ID_CORE, 63018); + uart_init(&up1, 7, SERCOM5_GCLK_ID_CORE, 62675); + + ups[0] = &up0; + ups[1] = &up1; + + apaport_build(&apap0, 0, &up0, ups, 2, &up0_stlr, &up0_stlb); + apaport_reset(&apap0); // SPI // TMC_MOSI PA07 / SER0-3 @@ -237,75 +245,72 @@ int main(void) pin_output(&dir_pin); stepper = stepper_new(&step_pin, &dir_pin, 360.0, 64); - - stepper_goto(&stepper, 360, 360); // should do 5 turns in 10 seconds + + stepper_targetspeed_steps(&stepper, 400); + + uint8_t lpcnt = 0; + uint8_t stpcnt = 0; while (1) { - pin_toggle(&clockpin); + apaport_scan(&apap0, 2); + lpcnt ++; + pin_toggle(&stlb); + + if(stepper.position_ticks_target == stepper.position_ticks){ + stpcnt ++; + //stepper_targetposition_steps(&stepper, 1000 * (stpcnt %2)); + //stepper_targetspeed_steps(&stepper, 10000); + //stepper_goto(&stepper, 360 * (stpcnt % 2), 1200); + } } } /* next steps (haha) -- poll uart receive line, look for network packets -- on finding position / time period packets, parse, put into buffer of step moves -- roll through buffer of step moves, do them +- plug into mods +- do float positions / conversions +- make sure you can run -ve positions +- mostly, build the thing, put it together so that you can test further reading: - quadratic interpolation for position @ time w/ velocity @ endpoint step commands minors: -- inverting direction -- get up to 120MHz for very happy stepping - bring baud rate to 1M, at least! what the heck, FTDI! */ -uint8_t lpcnt = 0; -uint8_t stpcnt = 0; void SysTick_Handler(void){ - // slow ticker + /* lpcnt ++; pin_toggle(&stlb); - /* - while(!rb_empty(up1.rbrx)){ - uart_sendchar_buffered(&up1, rb_get(up1.rbrx)); - } - */ - int32_t watch = stepper.position_ticks; - uint8_t w1 = watch >> 24; - uint8_t w2 = watch >> 16; - uint8_t w3 = watch >> 8; - uint8_t w4 = watch; - /* - uart_sendchar_buffered(&up1, w1); - uart_sendchar_buffered(&up1, w2); - uart_sendchar_buffered(&up1, w3); - uart_sendchar_buffered(&up1, w4); - */ + if(stepper.position_ticks_target == stepper.position_ticks){ stpcnt ++; - stepper_goto(&stepper, 360 * (stpcnt % 2), 1200); + stepper_targetposition_steps(&stepper, 500 * (stpcnt %2)); + //stepper_targetspeed_steps(&stepper, 10000); + //stepper_goto(&stepper, 360 * (stpcnt % 2), 1200); } + */ } void SERCOM4_0_Handler(void){ - uart_txhandler(&up1); + uart_txhandler(&up0); } void SERCOM4_2_Handler(void){ - uart_rxhandler(&up1); + uart_rxhandler(&up0); } void SERCOM5_0_Handler(void){ - uart_txhandler(&up2); + uart_txhandler(&up1); } void SERCOM5_2_Handler(void){ - uart_rxhandler(&up2); + uart_rxhandler(&up1); } void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker diff --git a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj index 87125a9..c32fc67 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj +++ b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj @@ -160,6 +160,18 @@ </ToolchainSettings> </PropertyGroup> <ItemGroup> + <Compile Include="apahandler.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="apahandler.h"> + <SubType>compile</SubType> + </Compile> + <Compile Include="apaport.c"> + <SubType>compile</SubType> + </Compile> + <Compile Include="apaport.h"> + <SubType>compile</SubType> + </Compile> <Compile Include="Device_Startup\startup_samd51.c"> <SubType>compile</SubType> </Compile> diff --git a/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c b/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c index c7743e4..fb87a8c 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c +++ b/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c @@ -47,16 +47,18 @@ uint8_t rb_putchar(ringbuffer_t *rb, uint8_t data){ } uint8_t rb_putdata(ringbuffer_t *rb, uint8_t *data, uint8_t size){ - if(rb_freespace(rb) <= size){ + /* + if(rb_freespace(rb) >= size){ + // rb_freespace, not working? return 0; } else { - uint8_t i = 0; - while(i < size){ - rb_putchar(rb, data[i]); - i ++; - } - return 1; + */ + for(int i = 0; i < size; i ++){ + rb_putchar(rb, data[i]); } + + return 1; + //} } uint8_t rb_get(ringbuffer_t *rb){ diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c index df2466e..eabea0c 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c @@ -44,10 +44,23 @@ void stepper_goto(stepper_t *stepper, float position, float speed){ // in 3rds of microseconds (a result of timer settings) stepper->speed_period = 3000000 / discrete_speed; // in steps pulses - stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps;; - - TICKER_SYNC; - stepper->last_time = TICKER; + stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps; +} + +void stepper_targetposition_float(stepper_t *stepper, float position){ + // do the business +} + +void stepper_targetposition_steps(stepper_t *stepper, int32_t position){ + stepper->position_ticks_target = position; +} + +void stepper_targetspeed_float(stepper_t *stepper, float speed){ + // do more business +} + +void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed){ + stepper->speed_period = 3000000 / ((speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps); } void stepper_update(stepper_t *stepper){ diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h index 63f31c2..e9462d1 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h +++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h @@ -38,6 +38,10 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_st void stepper_reset(stepper_t *stepper); void stepper_goto(stepper_t *stepper, float position, float speed); +void stepper_targetposition_steps(stepper_t *stepper, int32_t steps); +void stepper_targetposition_float(stepper_t *stepper, float position); +void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed); +void stepper_targetspeed_float(stepper_t *stepper, float speed); void stepper_update(stepper_t *stepper); diff --git a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c index 13687c7..ab25078 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c +++ b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c @@ -41,7 +41,7 @@ void tmc26_init(tmc26_t *tmc){ uint32_t sgthresh_mask = 0b00000111111100000000; int32_t sgthres_val = 60; uint32_t cscale_mask = 0b00000000000000011111; - uint32_t cscale_val = 12; + uint32_t cscale_val = 28; uint32_t sgcsconf = 0b11010000000000000000 | ((sgthres_val << 8) & sgthresh_mask) | (cscale_val & cscale_mask); tmc26_write(tmc, sgcsconf); diff --git a/embedded/mkstepper-v011/mkstepper-v011/uartport.c b/embedded/mkstepper-v011/mkstepper-v011/uartport.c index 3ecefeb..b20889a 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/uartport.c +++ b/embedded/mkstepper-v011/mkstepper-v011/uartport.c @@ -16,10 +16,10 @@ uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer uart.rbrx = rbrx; uart.rbtx = rbtx; - uart.rx_pin = rx_pin; - uart.rx_bm = (uint32_t)(1 << rx_pin); - uart.tx_pin = tx_pin; - uart.tx_bm = (uint32_t)(1 << tx_pin); + uart.pinrx = rx_pin; + uart.pinrx_bm = (uint32_t)(1 << rx_pin); + uart.pintx = tx_pin; + uart.pintx_bm = (uint32_t)(1 << tx_pin); uart.apbx = apbx; uart.peripheral = peripheral; // add ringbuffers @@ -28,20 +28,20 @@ uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t baud){ // rx pin setups - uart->port->DIRCLR.reg = uart->rx_bm; - uart->port->PINCFG[uart->rx_pin].bit.PMUXEN = 1; - if(uart->rx_pin % 2){ // yes if odd - uart->port->PMUX[uart->rx_pin >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral); + uart->port->DIRCLR.reg = uart->pinrx_bm; + uart->port->PINCFG[uart->pinrx].bit.PMUXEN = 1; + if(uart->pinrx % 2){ // yes if odd + uart->port->PMUX[uart->pinrx >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral); } else { - uart->port->PMUX[uart->rx_pin >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral); + uart->port->PMUX[uart->pinrx >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral); } // tx pin setups - uart->port->DIRSET.reg = uart->tx_bm; - uart->port->PINCFG[uart->tx_pin].bit.PMUXEN = 1; - if(uart->tx_pin % 2){ // yes if odd - uart->port->PMUX[uart->tx_pin >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral); + uart->port->DIRSET.reg = uart->pintx_bm; + uart->port->PINCFG[uart->pintx].bit.PMUXEN = 1; + if(uart->pintx % 2){ // yes if odd + uart->port->PMUX[uart->pintx >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral); } else { - uart->port->PMUX[uart->tx_pin >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral); + uart->port->PMUX[uart->pintx >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral); } // unmask the clock @@ -83,6 +83,11 @@ void uart_sendchar_buffered(uartport_t *uart, uint8_t data){ uart->com->USART.INTENSET.bit.DRE = 1; // set up the volley } +void uart_sendchars_buffered(uartport_t *uart, uint8_t *data, uint8_t length){ + rb_putdata(uart->rbtx, data, length); + uart->com->USART.INTENSET.bit.DRE = 1; +} + void uart_rxhandler(uartport_t *uart){ uint8_t data = uart->com->USART.DATA.reg; rb_putchar(uart->rbrx, data); diff --git a/embedded/mkstepper-v011/mkstepper-v011/uartport.h b/embedded/mkstepper-v011/mkstepper-v011/uartport.h index 9551ce3..d92c97c 100644 --- a/embedded/mkstepper-v011/mkstepper-v011/uartport.h +++ b/embedded/mkstepper-v011/mkstepper-v011/uartport.h @@ -10,6 +10,7 @@ #include "sam.h" #include "ringbuffer.h" +#include "pin.h" #define HARDWARE_IS_APBA 0 #define HARDWARE_IS_APBB 1 @@ -25,13 +26,16 @@ typedef struct{ Sercom *com; PortGroup *port; + uint32_t pinrx; + uint32_t pinrx_bm; + uint32_t pintx; + uint32_t pintx_bm; + ringbuffer_t *rbrx; ringbuffer_t *rbtx; - uint32_t rx_pin; - uint32_t rx_bm; - uint32_t tx_pin; - uint32_t tx_bm; + pin_t *stlr; + pin_t *stlb; uint32_t apbx; uint32_t peripheral; @@ -44,6 +48,7 @@ void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t void uart_sendchar_polled(uartport_t *uart, uint8_t data); void uart_sendchar_buffered(uartport_t *uart, uint8_t data); +void uart_sendchars_buffered(uartport_t *uart, uint8_t *data, uint8_t length); void uart_rxhandler(uartport_t *uart); void uart_txhandler(uartport_t *uart); -- GitLab