Please check my code
NWCCTV
Posts: 3,629
After designing and building a 2 Pushbutton circuit on a PCB I wrote the attached code to control one or two HB-25 motor controllers/motors. This is a very simple program in that if the first button is pressed motor 1 goes forward and motor 2 goes in reverse. If the second button is pushed motor 1 goes in reverse and motor 2 goes forward. There is no ramping done. The code works fine and everything works as it is suppose to. I was just wondering if someone could take a look at it and let me know if it looks good or needs changing.
' {$STAMP BS2} ' {$PBASIC 2.5} ' -----[ Program Description ]--------------------------------------------- ' This is a simple pushboutton test for one or two HB-25's. There are 2 ' Pushbuttons connected to pins 3 and 4. HB-25 is connected to Pin 15. Pin ' 3 controls forward and pin 4 controls reverse. Future updates for various ' speeds planned. ' -----[ I/O Definitions ]---------------------------------- HB25 PIN 15 ' I/O Pin For HB-25 ' -----[ Initialization ]-------------------------------------------------- DO : LOOP UNTIL HB25 = 1 ' Wait For HB-25 Power Up LOW HB25 ' Make I/O Pin Output/Low PAUSE 5 ' Wait For HB-25 To Initialize PULSOUT HB25, 750 ' Stop Motor 1 PAUSE 1 ' 1 mS Delay PULSOUT HB25, 750 ' Stop Motor 2 (If Connected) ' The Above 2 Lines May Be Removed ' if using only 1 motor ' -----[ Program Code ]----------------------------------------- DO ' Start DO Loop IF (IN3 = 1) THEN ' Checks if Pushbutton on IN3 is pressed, ' If Yes then send pulseout command to Pin PULSOUT HB25, 500 ' 15 to rotate motor 1 forward. PAUSE 1 ' 1 mS Delay For Motor 2 Pulse PULSOUT HB25, 1000 ' send pulsout command to pin 15 ' to rotate motor 2 reverse. PAUSE 10 ' wait 10 ms ELSE ' If no then PULSOUT HB25, 750 ' send pulsout stop command equivelent ' to motor 1. PAUSE 1 ' 1 mS Delay For Motor 2 Pulse PULSOUT HB25, 750 ' send pulsout stop command equivelent ' to motor 2. PAUSE 10 ' wait 10 ms IF (IN4 = 1) THEN ' Checks if Pushbutton on IN4 is pressed, ' If Yes then send pulseout command to Pin PULSOUT HB25, 1000 ' 15 to rotate motor 1 reverse. PAUSE 1 ' 1 mS Delay For Motor 2 Pulse PULSOUT HB25, 500 ' send pulseout command to Pin 15 to ' rotate motor 2 forward. PAUSE 10 ' wait 10 ms ELSE ' If no then PULSOUT HB25, 750 ' send pulsout stop command equivelent ' to motor 1. PAUSE 1 ' 1 mS Delay For Motor 2 Pulse PULSOUT HB25, 750 ' send pulsout stop command equivelent ' to motor 2. PAUSE 10 ' wait 10 ms ENDIF ' Since there are 2 IF statements there ENDIF ' needs TO be 2 ENNDIF's. LOOP ' Continuous loop.
Comments
I don't program the BS2 much but I'd think you'd want the first "ENDIF" before the second "IF".
I also think there's probably a better way of doing this (as I think you're suggesting by asking about the program).
I think you'd want:
Have the button you want to take precedence be the first condition test (if).
I actually forgot about SUB!!!! I know what to do for the STOP command but I am a bit lost on the above code.
Here's the same loop section with proper (IMO) indentation (since Spin has made me think all code should be similarly indented).
(The forum software keeps messing up the indentation. I think the above is pretty close to what I'm after.)
Seeing the code this way makes it clear that "IN4" is checked only if "IN3" doesn't equal 1. Before "IN4" is checked a stop command is sent to both motors and if "IN4" isn't equal to one a second stop command is issued. Since the first stop command is redundant, I think the code would be more efficient like this.
I think this is the way it should be indented, assuming I'm understanding the BS2's if, elseif, else, endif statements. And someone, please correct me if I have the indentation based on the flow of the program incorrect.
Of course I'm sure Tracy's code would be better but I do not know enough about the BS2's case statement to help.
SELECT INA >> 2 ' looking at the state of p3 and p4 as one unit
What that statement does is to grab the state of the input pins p0 to p4 all at once as one binary nibble,
INA -- captures the input binary value, 4 bits, for example % 0100
and then shifts that nibble two bits right to isolate the state of pins p3 and p4 where your buttons are attached.
INA >> 2 -- shifts that value 2 right, for example % 0100 becomes % 0001, p3 is pressed
That becomes the value used by the SELECT CASE command, and there are 4 possible states of those two buttons, 00,01,10 and 11.
CASE 3, binary 11, is not included. But could be. Do you see what will happen if both are pressed at once?
The behavior is a bit different from your program, or Duane's modification. There is not precedence of one button over the other, because the state INA is read all at once at one point in time.