<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>8-bit MicrocontrollersのトピックRe: Multiplexed unipolar stepper motor control</title>
    <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163480#M10094</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The following example code shows how the SPI module might be used, as previously proposed.&amp;nbsp; There are two functions, one for frequent execution within the main loop, for processing all six&amp;nbsp;steppers, and another for setting a new destination position for a specific stepper.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;/****************************************************************************** File: Unipolar.h UNIPOLAR STEPPER MOTOR POSITION CONTROL ******************************************************************************/#ifndef _UNIPOLAR_H#define _UNIPOLAR_H#include "derivative.h"// Adjust to suit GPIO pin used.#define STROBE_HI  PTDDD_PTDDD0 = 1; PTDD_PTDD0 = 1#define STROBE_LO  PTDDD_PTDDD0 = 1; PTDD_PTDD0 = 0#define STEP_DELAY 5   // 5ms delay between steps (200 steps/s)// Stepper motor control structure:struct stepctrl {   byte phase;   int  stepcount;   byte timeout;};union SPI_buf {   byte B[3];   // Individual bytes for SPI send   dword D;};/******************************************************************************/// Function prototypes:// Stepper motor control update - to be frequently called within main loopvoid control_update( void);// Setup motor destinationvoid set_destination(     byte id,    // 'A' to 'F' -&amp;gt; motor number 0 - 5, forward direction                 // 'a' to 'f' -&amp;gt; motor number 0 - 5, reverse direction     int steps); // number of steps#endif  /* _UNIPOLAR_H */&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;/****************************************************************************** File: Unipolar.c UNIPOLAR STEPPER MOTOR POSITION CONTROL ******************************************************************************/#include "Unipolar.h"#include "SPI.h"                  // SPI_send() macro definition#include "TPM.h"                  // Declaration for 'tflag'// Static variables:static struct stepctrl motor[6];  // Array of structuresstatic union SPI_buf mcontrol;// Stepper motor control sequence table:const byte motor_phase[] = { 0x09, 0x0A, 0x06, 0x05 };/******************************************************************************/// Stepper motor control update// To be frequently called within the main loop.void control_update( void){  byte i, c, s;  if (tflag) {                              // Ready for further processing    tflag = 0;                              // Clear timing flag    for (i = 0; i &amp;lt; 6; i++) {               // Process each stepper motor      if (motor[i].timeout == 0) {          // Ready for next step        if (motor[i].stepcount) {           // Motor needs to step          motor[i].timeout = STEP_DELAY;    // Delay to next step after this one          if (motor[i].stepcount &amp;gt; 0) {     // Forward step            motor[i].stepcount--;            c = (++motor[i].phase) &amp;amp; 0x03;  // Next phase          }          if (motor[i].stepcount &amp;lt; 0) {     // Reverse step            motor[i].stepcount++;            c = (--motor[i].phase) &amp;amp; 0x03;  // Next phase          }          s = (byte)(4 * i);                    // Shift value          mcontrol.D &amp;amp;= ~(0x0F &amp;lt;&amp;lt; s);           // Clear motor control value          mcontrol.D |= (motor_phase[c] &amp;lt;&amp;lt; s);  // Place new control value        }      }      else  motor[i].timeout--;    }    // Update control for all motors    SPI_send( mcontrol.B[0]);    SPI_send( mcontrol.B[1]);    SPI_send( mcontrol.B[2]);    STROBE_HI;    STROBE_LO;  }}/******************************************************************************/// Setup motor destination// id    - 'A' to 'F' represents motor number 0 - 5, forward direction//       - 'a' to 'f' represents motor number 0 - 5, reverse direction// steps - number of stepsvoid set_destination( byte id, int steps){  if (id &amp;gt;= 'A' &amp;amp;&amp;amp; id &amp;lt;= 'F') {    id -= 'A';                      // Value 0 - 5    motor[id].stepcount += steps;  }  if (id &amp;gt;= 'a' &amp;amp;&amp;amp; id &amp;lt;= 'f') {    id -= 'a';                      // Value 0 - 5    motor[id].stepcount -= steps;  }}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code assumes a 1 millisecond tick rate from the TPM1 module (software output compare mode), and provides 5 millisecond spacing between successive steps.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I do not understand the format of your data packets, particularly how the number of steps is represented.&amp;nbsp; If by a sequence of ASCII digits, these would need to be separately converted to a binary value, for use by the set_destination() function.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I could not work out your intent with the handler for the SCI2 received data.&amp;nbsp; I would tend to place the incoming data into a FIFO buffer, and then parse the packet data from within the buffer, from outside the ISR handler.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;BR /&gt;Mac&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 29 Oct 2020 09:09:48 GMT</pubDate>
    <dc:creator>bigmac</dc:creator>
    <dc:date>2020-10-29T09:09:48Z</dc:date>
    <item>
      <title>Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163477#M10091</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am a newcomer to microcontrollers and have been struggling with the coding for the control of 6 UAG2 unipolar stepper motors that are multiplexed through a 74LS151N using the GT16A &amp;nbsp;microcontroller. I am trying to recive the motor instruction through SCI and in that data it identifies which motor needs to be selected and in which direction it should rotate for x amount of steps. I don't think I am going about this in the correct manner and am desperately in need of help especially since I am guessing I need to use the TPM module&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The wiring diagram is attached and the code is below:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The SCI interrupt to receive the data:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;interrupt 20void SCI_interrupt (void) {&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp; if (SCI2S1_RDRF) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // SCI 2 receive interrupt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (PacketReceiveIndex == 0 &amp;amp;&amp;amp; SCI2D == 0x23&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x41&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x42&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x43&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x44&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x45&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x46&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x61&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x62&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x63&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x64&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x65&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x66) { // ascii f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartReceived = 1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (StartReceived == 1 &amp;amp;&amp;amp; SCI2D == 0x23) {&amp;nbsp;&amp;nbsp; // ascii #&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketReceive[PacketReceiveIndex] = SCI2D;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (PacketReceiveIndex == 15) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // done??&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartReceived = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset for next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketReceiveIndex = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset for next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SCI2C2_TIE = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PiezoMove (PacketReceive);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else PacketReceiveIndex++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // not done, increment index&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (StartReceived == 1 &amp;amp;&amp;amp; SCI2D == 0x41&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x42&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x43&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x44&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x45&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x46&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x61&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x62&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x63&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x64&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x65&amp;nbsp;&amp;nbsp;&amp;nbsp; // ascii e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || SCI2D == 0x66) { // ascii f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketReceive[PacketReceiveIndex] = SCI2D;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (PacketReceiveIndex == 15) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // done??&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartReceived = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset for next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketReceiveIndex = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // reset for next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SCI2C2_TIE = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;and the actual motor control code:&lt;/P&gt;&lt;PRE&gt;void motorStep (unsigned char Data[]) {&amp;nbsp; int loopCount = 0;&amp;nbsp; int i = 0;&amp;nbsp; unsigned char motorData[4];&amp;nbsp; motorData[0] = 0x09;&amp;nbsp; motorData[1] = 0x0A;&amp;nbsp;&amp;nbsp;&amp;nbsp; motorData[2] = 0x06;&amp;nbsp; motorData[3] = 0x05;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (Data[0-7] == 0x41) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 1 forward: ascii A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,0,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x61) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 1 backward: ascii a&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,0,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x42) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 2 forward: ascii B&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x01;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,0,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x62) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 2 backward: ascii b&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x01;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,0,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x43) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 3 forward: ascii C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x02;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,1,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x63) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 3 backward: ascii c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x02;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,1,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x44) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 4 forward: ascii D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x03;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,1,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x64) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 4 backward: ascii d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x03;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 0,1,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x45) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 5 forward: ascii E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x04;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 1,0,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x65) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 5 backward: ascii e&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x04;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 1,0,0 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x46) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 6 forward: ascii F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x05;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 1,0,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i++];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 3) i = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (Data[0-7] == 0x66) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // motor 6 backward: ascii f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // select motor with multiplexer&amp;nbsp;&amp;nbsp;&amp;nbsp; PTBD = 0x05;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Send 1,0,1 to mux&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (loopCount = 0; loopCount &amp;lt;= Data[8-15]; loopCount++) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PTDD = motorData[i--];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; loopCount++;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm ("nop");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (i == 0) i = 3;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; }&amp;nbsp; }&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:09:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163477#M10091</guid>
      <dc:creator>woohoo</dc:creator>
      <dc:date>2020-10-29T09:09:47Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163478#M10092</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Well, there seems to be many potential problems, one big one being that it seems you are try to step the motors way too fast.&lt;/P&gt;&lt;P&gt;You need to use a timer and step the motors at an adjustable rate. I say adjustable, because in my experience different steppers respond differently to step rates.&lt;/P&gt;&lt;P&gt;Also, you should probably save the last step state for each motor and resume from that state, or you will get odd stepping behavior.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 30 Aug 2011 23:36:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163478#M10092</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2011-08-30T23:36:54Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163479#M10093</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;You would definitely need to latch the current state of each motor.&amp;nbsp; Additionally, it is inappropriate to switch the ground pin of&amp;nbsp;each ULN2003 driver, using the 74LS151.&amp;nbsp; The full motor current will flow through the ground pin, and this will overload the multiplexer device.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To accomplish your aims, I might consider using the SPI module in conjunction with a "daisy-chain" of three 74HC595 shift register devices.&amp;nbsp; These will provide for&amp;nbsp;the&amp;nbsp;latching of 24 output lines.&amp;nbsp; You will still need to follow with the ULN2003's to provide a buffer for each motor winding.&amp;nbsp; The output&amp;nbsp;latch strobe (RCK)&amp;nbsp;input to&amp;nbsp;each '595 would be paralleled, and directly controlled with a further output line from the MCU.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;From a firmware perspective, the current state of the six motors&amp;nbsp;would be&amp;nbsp;represented by a sequence of three bytes, with each byte controlling&amp;nbsp;two motors.&amp;nbsp; Whenever one or more motors is incremented or decremented&amp;nbsp;to the next state, the three byte sequence would be updated, and then sent via the SPI.&amp;nbsp; After the three bytes have been sent, the output latches would then&amp;nbsp;be strobed.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;To determine the next state in the stepping sequence, you might consider using a lookup table to represent the stepping mode you are using.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Yes, you would also need to control the minimum period between each update, to be consistent with the maximum stepping rate for the motors.&amp;nbsp; After each update you would set a timout period, and prior to each update you would test whether the previous timeout period had already expired.&amp;nbsp; Here I assume that the primary requirement is for&amp;nbsp;position control, rather than motor speed control.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Mac&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 31 Aug 2011 02:47:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163479#M10093</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2011-08-31T02:47:23Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163480#M10094</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The following example code shows how the SPI module might be used, as previously proposed.&amp;nbsp; There are two functions, one for frequent execution within the main loop, for processing all six&amp;nbsp;steppers, and another for setting a new destination position for a specific stepper.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;/****************************************************************************** File: Unipolar.h UNIPOLAR STEPPER MOTOR POSITION CONTROL ******************************************************************************/#ifndef _UNIPOLAR_H#define _UNIPOLAR_H#include "derivative.h"// Adjust to suit GPIO pin used.#define STROBE_HI  PTDDD_PTDDD0 = 1; PTDD_PTDD0 = 1#define STROBE_LO  PTDDD_PTDDD0 = 1; PTDD_PTDD0 = 0#define STEP_DELAY 5   // 5ms delay between steps (200 steps/s)// Stepper motor control structure:struct stepctrl {   byte phase;   int  stepcount;   byte timeout;};union SPI_buf {   byte B[3];   // Individual bytes for SPI send   dword D;};/******************************************************************************/// Function prototypes:// Stepper motor control update - to be frequently called within main loopvoid control_update( void);// Setup motor destinationvoid set_destination(     byte id,    // 'A' to 'F' -&amp;gt; motor number 0 - 5, forward direction                 // 'a' to 'f' -&amp;gt; motor number 0 - 5, reverse direction     int steps); // number of steps#endif  /* _UNIPOLAR_H */&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;/****************************************************************************** File: Unipolar.c UNIPOLAR STEPPER MOTOR POSITION CONTROL ******************************************************************************/#include "Unipolar.h"#include "SPI.h"                  // SPI_send() macro definition#include "TPM.h"                  // Declaration for 'tflag'// Static variables:static struct stepctrl motor[6];  // Array of structuresstatic union SPI_buf mcontrol;// Stepper motor control sequence table:const byte motor_phase[] = { 0x09, 0x0A, 0x06, 0x05 };/******************************************************************************/// Stepper motor control update// To be frequently called within the main loop.void control_update( void){  byte i, c, s;  if (tflag) {                              // Ready for further processing    tflag = 0;                              // Clear timing flag    for (i = 0; i &amp;lt; 6; i++) {               // Process each stepper motor      if (motor[i].timeout == 0) {          // Ready for next step        if (motor[i].stepcount) {           // Motor needs to step          motor[i].timeout = STEP_DELAY;    // Delay to next step after this one          if (motor[i].stepcount &amp;gt; 0) {     // Forward step            motor[i].stepcount--;            c = (++motor[i].phase) &amp;amp; 0x03;  // Next phase          }          if (motor[i].stepcount &amp;lt; 0) {     // Reverse step            motor[i].stepcount++;            c = (--motor[i].phase) &amp;amp; 0x03;  // Next phase          }          s = (byte)(4 * i);                    // Shift value          mcontrol.D &amp;amp;= ~(0x0F &amp;lt;&amp;lt; s);           // Clear motor control value          mcontrol.D |= (motor_phase[c] &amp;lt;&amp;lt; s);  // Place new control value        }      }      else  motor[i].timeout--;    }    // Update control for all motors    SPI_send( mcontrol.B[0]);    SPI_send( mcontrol.B[1]);    SPI_send( mcontrol.B[2]);    STROBE_HI;    STROBE_LO;  }}/******************************************************************************/// Setup motor destination// id    - 'A' to 'F' represents motor number 0 - 5, forward direction//       - 'a' to 'f' represents motor number 0 - 5, reverse direction// steps - number of stepsvoid set_destination( byte id, int steps){  if (id &amp;gt;= 'A' &amp;amp;&amp;amp; id &amp;lt;= 'F') {    id -= 'A';                      // Value 0 - 5    motor[id].stepcount += steps;  }  if (id &amp;gt;= 'a' &amp;amp;&amp;amp; id &amp;lt;= 'f') {    id -= 'a';                      // Value 0 - 5    motor[id].stepcount -= steps;  }}&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code assumes a 1 millisecond tick rate from the TPM1 module (software output compare mode), and provides 5 millisecond spacing between successive steps.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I do not understand the format of your data packets, particularly how the number of steps is represented.&amp;nbsp; If by a sequence of ASCII digits, these would need to be separately converted to a binary value, for use by the set_destination() function.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I could not work out your intent with the handler for the SCI2 received data.&amp;nbsp; I would tend to place the incoming data into a FIFO buffer, and then parse the packet data from within the buffer, from outside the ISR handler.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;BR /&gt;Mac&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 29 Oct 2020 09:09:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163480#M10094</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2020-10-29T09:09:48Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163481#M10095</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;BTW - I think you &amp;nbsp;meant to use a a 74LS138 1 of 8 decoder, not 74LS151 8 input multiplexer.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 01 Sep 2011 20:42:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163481#M10095</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2011-09-01T20:42:46Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163482#M10096</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for the help so far&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I now realise that the motors are going to need a time delay between each step ans that the 74LS151 would not have been able to handle the current and also the 74LS138 is the correct IC to use, however I can't use SPI as bigmac suggested as I am using it to communicate with a CAu10 piezo amplifier, so instead I used another ULN2003A transistor array to suply the current as shown in the attached diagram.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 01 Sep 2011 23:00:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163482#M10096</guid>
      <dc:creator>woohoo</dc:creator>
      <dc:date>2011-09-01T23:00:17Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163483#M10097</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Well, you will need inverters on the outputs of the&amp;nbsp;74LS138﻿, as they are low true and the ULN2003 is inverting.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"The decoder accepts three binary weighted inputs (A0, A1, A2)and when enabled provides eight mutually exclusive active LOW Outputs (O0 – O7).﻿"&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 02 Sep 2011 00:32:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163483#M10097</guid>
      <dc:creator>JimDon</dc:creator>
      <dc:date>2011-09-02T00:32:35Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163484#M10098</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;BLOCKQUOTE&gt;&lt;HR /&gt;woohoo wrote:&lt;BR /&gt;&lt;P&gt;however I can't use SPI as bigmac suggested as I am using it to communicate with a CAu10 piezo amplifier,&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;Provided the SPI communications with&amp;nbsp;the piezo amplifier is not time critical, the same SPI module and its associated bus,&amp;nbsp;may be easily shared between the two slave devices.&amp;nbsp; If the SPI communications for the amplifier is done within the main loop, this is very&amp;nbsp;likely to be so.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The amplifier has a /SYNC input &amp;nbsp;line, and will be insensitive to bus activity unless this is set to active low.&amp;nbsp; Similarly, the shift register outputs would not be updated until a strobe pulse occurs.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Mac&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 02 Sep 2011 11:56:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163484#M10098</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2011-09-02T11:56:36Z</dc:date>
    </item>
    <item>
      <title>Re: Multiplexed unipolar stepper motor control</title>
      <link>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163485#M10099</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Some further observations on your proposed method -&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;The use of LS logic devices is incompatible with the 9s08GT16 MCU.&amp;nbsp; The LS devices require a supply voltage within the limits 4.5 to 5.5 volts.&amp;nbsp; You will need to substitute equivalent HC devices, that are capable of operation at 3 volts.&lt;/LI&gt;&lt;LI&gt;The 74HC237 device is an alternative&amp;nbsp;3-to-8 line decoder that has active high outputs.&lt;/LI&gt;&lt;LI&gt;Since the individual sections of the&amp;nbsp;ULN2003 are Darlington transistors, their saturation voltage will be quite high, say more than 1 volt.&amp;nbsp; Since two transistors are effectively series connected, this will reduce the voltage applied to the motor by more than 2 volts.&amp;nbsp; A further sideeffect is that the "upper" transistor that connects to the motor winding may not fully turn on.&amp;nbsp; The switching voltage level would be equivalent to the normal switching voltage &lt;U&gt;plus&lt;/U&gt; the saturation voltage of the lower transistor.&amp;nbsp; This may possibly exceed&amp;nbsp;the 3 volt level available at the MCU output.&lt;/LI&gt;&lt;LI&gt;It seems that your intent is that the motor windings should be de-energised when not stepping (relying on the low indent torque to maintain the last position).&amp;nbsp; If so, I would think that the previous winding currents would need to be re-established, before then commencing to step.&lt;/LI&gt;&lt;LI&gt;Your method seems implicit that only one motor may move at any time, and the stepping needs to&amp;nbsp;complete before another motor may commence movement.&amp;nbsp; This restriction does not apply to the SPI approach.&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Mac&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 02 Sep 2011 15:17:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/8-bit-Microcontrollers/Multiplexed-unipolar-stepper-motor-control/m-p/163485#M10099</guid>
      <dc:creator>bigmac</dc:creator>
      <dc:date>2011-09-02T15:17:47Z</dc:date>
    </item>
  </channel>
</rss>

