You are correct! I originally started out with constants for the PID gains and QPPS. I'm not sure why, but I couldn't get it to compile and would get an error for R1KP.
BYTE3. Basically it didn't like separating a constant into bytes. (I was going to ask about that one later as I have no need to change PID gains while executing, so I could free up quite a bit of variable space.) To keep things going, I changed them all to long variables and immediately assigned the variable, forgetting that the CLEAR statement was just a few lines below.
Once I encounter a problem, I very rarely try to troubleshoot it in the real program. I'll build a snippet of code that focuses on the problem. Since I'm working with less code, it changes rather rapidly as I try to figure out what is going on. The current code is running channel 2 with all assignments after the CLEAR. This also appears to have corrected the checksum issue. I really can't explain that one. I'm not missing the random 2 anymore though. I am, however, still getting the odd characters on the terminal window. Since I only use the terminal for troubleshooting, I'll say that the roboclaw is working like I want at this point.
FWIW, I tried both 38400 and 19200 bauds before even posting.
Code:
CR CON 13 'Carriage return for debug
R1ADDRESS CON 128 'Serial address for RoboClaw
R1COMMAND VAR BYTE
R1ACCEL VAR LONG 'ROBOCLAW 1 ACCELERATION QP/S^2
R1SPEED VAR SLONG 'ROBOCLAW 1 SPEED (QUAD COUNTS)
R1DIST VAR LONG 'ROBOCLAW 1 DISTANCE (QUAD COUNTS)
R1CRC VAR BYTE 'ROBOCLAW 1 CRC CHECKSUM
R1BUFFER VAR BYTE 'ROBOCLAW 1 BUFFER
R1STATUS VAR BIT 'ROBOCLAW 1 RUNNING STATUS
VERSION VAR BYTE[32]
BYTESPEED VAR BYTE
R1KD VAR LONG
R1KP VAR LONG
R1KI VAR LONG
R1QP VAR LONG
RUNPB VAR IN6
CLEARPB VAR IN8
CLEAR
R1KD = 128
R1KP = 286
R1KI = 256
R1QP = 50000
ENABLEHSERIAL1
SETHSERIAL1 H19200
PAUSE 1000
'READ AND DISPLAY ROBOCLAW VERSION
R1COMMAND = 21
HSEROUT [R1ADDRESS, R1COMMAND]
HSERIN [STR VERSION\32\0, R1CRC]
SEROUT S_OUT, I38400, [0, "VERSION ", STR VERSION\32\0, CR]
SEROUT S_OUT, I38400, ["VERSION CRC ", DEC R1CRC, CR, CR]
PAUSE 10
'SET PID VALUES
R1COMMAND = 29
R1CRC = (R1ADDRESS + R1COMMAND + |
R1KD.BYTE3 + R1KD.BYTE2 + R1KD.BYTE1 + R1KD.BYTE0 + |
R1KP.BYTE3 + R1KP.BYTE2 + R1KP.BYTE1 + R1KP.BYTE0 + |
R1KI.BYTE3 + R1KI.BYTE2 + R1KI.BYTE1 + R1KI.BYTE0 + |
R1QP.BYTE3 + R1QP.BYTE2 + R1QP.BYTE1 + R1QP.BYTE0) & 0x7F
HSEROUT [R1ADDRESS, R1COMMAND, |
R1KD.BYTE3, R1KD.BYTE2, R1KD.BYTE1, R1KD.BYTE0, |
R1KP.BYTE3, R1KP.BYTE2, R1KP.BYTE1, R1KP.BYTE0, |
R1KI.BYTE3, R1KI.BYTE2, R1KI.BYTE1, R1KI.BYTE0, |
R1QP.BYTE3,R1QP.BYTE2, R1QP.BYTE1, R1QP.BYTE0, R1CRC]
PAUSE 10
'CLEAR ENCODER VALUES
CLEARENC
R1COMMAND = 20
R1CRC = (R1ADDRESS + R1COMMAND) & 0x7F
HSEROUT [R1ADDRESS, R1COMMAND, R1CRC]
SEROUT S_OUT, I38400, ["ENCODERS CLEARED", CR]
PAUSE 250
MAIN
IF CLEARPB = 0 THEN CLEARENC
IF RUNPB <> 0 THEN MAIN
' READ AND DISPLAY CURRENT POSITION, VERIFY GOOD READ BY COMPARING CHECKSUMS
R1COMMAND = 17
HSEROUT [R1ADDRESS, R1COMMAND]
HSERIN [R1DIST.BYTE3, R1DIST.BYTE2, R1DIST.BYTE1, R1DIST.BYTE0, R1STATUS, R1CRC]
SEROUT S_OUT, I38400, ["POSITION ", DEC R1DIST, CR]
SEROUT S_OUT, I38400, ["STATUS ", DEC R1STATUS, CR]
SEROUT S_OUT, I38400, ["CHECKSUM ", DEC R1CRC, CR]
R1CRC = (R1ADDRESS + R1COMMAND + R1DIST.BYTE3 + R1DIST.BYTE2 + R1DIST.BYTE1 |
+ R1DIST.BYTE0 + R1STATUS) & 0x7F
SEROUT S_OUT, I38400, ["CRC CALC ", DEC R1CRC, CR, CR]
PAUSE 10
' DRIVE M1 FORWARD SIGNED SPEED AND DISTANCE AND ACCELERATION
R1COMMAND = 45
R1SPEED = 48000
R1DIST = 96000
R1ACCEL = 48000
R1BUFFER = 0
R1CRC = (R1ADDRESS + R1COMMAND + |
R1ACCEL.BYTE3 + R1ACCEL.BYTE2 + R1ACCEL.BYTE1 + R1ACCEL.BYTE0 + |
R1SPEED.BYTE3 + R1SPEED.BYTE2 + R1SPEED.BYTE1 + R1SPEED.BYTE0 + |
R1DIST.BYTE3 + R1DIST.BYTE2 + R1DIST.BYTE1 + R1DIST.BYTE0 + |
R1BUFFER) & 0x7f
HSEROUT [R1ADDRESS, R1COMMAND, |
R1ACCEL.BYTE3, R1ACCEL.BYTE2, R1ACCEL.BYTE1, R1ACCEL.BYTE0, |
R1SPEED.BYTE3, R1SPEED.BYTE2, R1SPEED.BYTE1, R1SPEED.BYTE0, |
R1DIST.BYTE3, R1DIST.BYTE2, R1DIST.BYTE1, R1DIST.BYTE0, |
R1BUFFER, R1CRC]
PAUSE 1000
LOOPER
' READ AND DISPLAY CURRENT SPEED, VERIFY GOOD READ BY COMPARING CHECKSUMS
R1COMMAND = 19
HSEROUT [R1ADDRESS, R1COMMAND]
HSERIN [R1SPEED.BYTE3, R1SPEED.BYTE2, R1SPEED.BYTE1, R1SPEED.BYTE0, R1STATUS, R1CRC]
SEROUT S_OUT, I38400, ["SPEED ", DEC R1SPEED, CR]
SEROUT S_OUT, I38400, ["STATUS ", DEC R1STATUS, CR]
SEROUT S_OUT, I38400, ["CHECKSUM ", DEC R1CRC, CR]
R1CRC = (R1ADDRESS + R1COMMAND + R1SPEED.BYTE3 + R1SPEED.BYTE2 + R1SPEED.BYTE1 |
+ R1SPEED.BYTE0 + R1STATUS) & 0x7F
SEROUT S_OUT, I38400, ["CRC CALC ", DEC R1CRC, CR, CR]
PAUSE 250
' WAIT FOR MOTOR TO STOP
IF R1SPEED <> 0 THEN LOOPER
' READ AND DISPLAY CURRENT POSITION, VERIFY GOOD READ BY COMPARING CHECKSUMS
R1COMMAND = 17
HSEROUT [R1ADDRESS, R1COMMAND]
HSERIN [R1DIST.BYTE3, R1DIST.BYTE2, R1DIST.BYTE1, R1DIST.BYTE0, R1STATUS, R1CRC]
SEROUT S_OUT, I38400, ["POSITION ", DEC R1DIST, CR]
SEROUT S_OUT, I38400, ["STATUS ", DEC R1STATUS, CR]
SEROUT S_OUT, I38400, ["CHECKSUM ", DEC R1CRC, CR]
R1CRC = (R1ADDRESS + R1COMMAND + R1DIST.BYTE3 + R1DIST.BYTE2 + R1DIST.BYTE1 |
+ R1DIST.BYTE0 + R1STATUS) & 0x7F
SEROUT S_OUT, I38400, ["CRC CALC ", DEC R1CRC, CR, CR]
PAUSE 100
GOTO MAIN