SW Exp #14: Scanning and Deboucing Multiple Inputs
playinmyblues_nscc
Posts: 38
Hi. I am hoping somebody can explain a section of program in StampWorks Experiment #14, page 94 of the book. I have an edited program in addition to the original program. In both programs I do not understand why the buttons have to be held down for the whole period of the FOR NEXT loop. I understand that that is what happens. In my program, I wrote a preceding loop to let me know when the time was approaching where I have to hold down the button. I also extended the time that the button must be held down so I can experiment with the time it is held down. For example, the first loop lets me know when the hold-down time is approaching so I hold down the button. The FOR NEXT loop counts for the debounce. I hold the button down prior to the loop and when the count is part way through I release the button and press it again before the time is up and I hold the button down until the loop is over.
The effect is I know for sure that the original program functions as it should and my program functions as it should. However, I do not understand why. The reason I do not understand why is that at the end of the count for which the button must be pressed, the boolean expression: btns = btns & ~BtnBus would equal a 1 or 1's at the appropriate place for the last count, or so I would think. Why is this not true?
Original program:
My program:
The effect is I know for sure that the original program functions as it should and my program functions as it should. However, I do not understand why. The reason I do not understand why is that at the end of the count for which the button must be pressed, the boolean expression: btns = btns & ~BtnBus would equal a 1 or 1's at the appropriate place for the last count, or so I would think. Why is this not true?
Original program:
' {$STAMP BS2} ' {$PBASIC 2.5} ' -- Program: SW21-EX14-Debounce.bs2 ' -- Purpose: This program demonstrates the simultaneous debouncing of multiple inputs. The input subroutine is easily adjusted to handle ' any number of of inputs. ' -- I/O Definitions -- BtnBus VAR INA ' four inputs, P0 - P3 ' -- Variables -- btns VAR Nib ' deboucned inputs idx VAR Nib ' loop counter ' -- Program Code -- Main: DO GOSUB Get_Buttons ' get deboucned inputs DEBUG HOME, "Inputs = ", IBIN4 btns ' display in binary mode PAUSE 50 LOOP ' -- Subroutines -- Get_Buttons: btns = %1111 ' enable all four inputs FOR idx = 1 TO 5 btns = btns & ~BtnBus ' test inputs PAUSE 5 NEXT RETURN******************************************************************
My program:
' {$STAMP BS2} ' {$PBASIC 2.5} ' -- Program: SW21-EX14-Debounce-Edit8Btns.bs2 ' -- Purpose: This program demonstrates the simultaneous debouncing of multiple inputs. The input subroutine is easily adjusted to handle ' any number of of inputs. ' -- I/O Definitions -- BtnBus VAR INL ' four inputs, P0 - P7 ' -- Variables -- btns VAR Byte ' deboucned inputs idx VAR Byte ' loop counter flip VAR Bit ' a bit sized counter to flip from 1 to 0 to 1 to alternate a DEBUG statement idy VAR Word ' variable used to count the PAUSE ' -- Program Code -- ' -- Initialize Variable -- flip = 0 Main: DO GOSUB Get_Buttons ' get deboucned inputs DEBUG HOME, "Inputs = ", IBIN8 btns, CR ' display in binary mode flip = flip + 1 IF (flip = 1) THEN DEBUG "Paws1", CR ELSEIF (flip = 0) THEN DEBUG "Paws2", CR ENDIF ' PAUSE 5000 FOR idy = 1 TO 500 ' This FOR NEXT loop is used to let the user know when the next opportunity to press the button is DEBUG CRSRXY, 0, 3 ' coming up. Otherwise, the user cannot know when to time the button press as the time is too short DEBUG DEC4 idy ' unless the FOR NEXT loop below is extended to something like 100. NEXT idy = 0 LOOP ' -- Subroutines -- Get_Buttons: btns = %11111111 ' enable all eight inputs FOR idx = 1 TO 50 ' the FOR loop is the debounce mechanism. It allows for the mechanical bouncing of the contacts to stop ' and then it exits the loop and returns to the DEBUG statement in the Main part of the program. ' Using a higher value for the upper limit of the FOR NEXT loop allows the person to experiment with ' timing of the button press. If the button is released before the end of the loop occurs, the button ' will show as not being pressed. btns = btns & ~BtnBus ' test inputs ' DEBUG CRSRXY, 0, 1, "idx: ", DEC1 idx DEBUG CRSRXY, 4, 4, DEC2 idx ' this line gives a number that changes in one position on the DEBUG terminal PAUSE 5 NEXT RETURNSorry for the poor code posting - recently fixed.
Comments
When a button is pressed, its bit in inA goes to 0. The ~inA operator inverts that, a pressed button comes out as 1. The % 1111 starts by assuming all buttons are 1=pressed. If a button stays pressed for all 5 scans, then its bit stays at 1&1&1&1&1 = 1. But if a button is let up even once during the scan, then the result is, e.g. 1&1&0&0&1 = 0. Debounced result is, "not pressed". Does that help?
Thanks again!