Does anyone know a way to do a debounce (sketch) without a delay?

I've been trying to mod an xbox 360 controller with an arduino. Unfortunately the switch I have bounces allot and has really been screwing with my sketch. Long story short I've tried allot of different debounces but as soon as i put a delay (); in anywhere in the sketch the controller just shuts down. I don't know why but i think the people who make the game may have some ant-hacking built into the game. Any help is appreciated. Thanks in advance.   

sort by: active | newest | oldest
Funnily enough, I'm working on a boucing issue in code for my work right now, and I shall be fixing it today with my usual routines.

I suspect that the xbox is constantly handshaking with the controller, and expects a message back every few milliseconds- what's in your message doesn't have to be changed every time- so you can still contain bounce code.
Zaphod Beetlebrox (author)  steveastrouk5 years ago
I'm not quite sure what your saying. I'm using an if statement triggered by the button being high, then righting high then low quickly. if (button =HIGH) { DigitalWrite (shoot,HIGH);
DigitalWrite (shoot,LOW);
}
I've tried to put a delay above, below and in the if statement all disable the trigger's actions. I'm not sure what "my message" is. Thanks for you're help, sorry I'm a bit of a noob.
Where's your deboucing ? a delay isn't a debounce.

Do you mean digitalwrite never changes state ? How do you know ?

Steve
Zaphod Beetlebrox (author)  steveastrouk5 years ago
I mean debounce when I said delay. I said delay because the delay is the part causing problems.  The digitalWrite works because the rapid fire is working it's just that it stops 5-6 seconds after the button is released. The handshake thing is correct the max delay I can put in is delayMicroseconds (10). Thanks for your help, I think I should just find a better switch and live with it. 

Post your whole code. I can't work on a snippet of a snippet. Let me see what you are trying to do. Make sure the code is commented. The secret is to have a task watching the keys, and a separate task sending the handshake.
Zaphod Beetlebrox (author)  steveastrouk5 years ago
Sorry I thought about posting it in the last comment but thought it would be to long for a comment (no 140 character limit here). First off I am in no way a programmer and just started like two weeks ago.
int val = 0; // stores values of the digitalread of the button
int button = 4; // positive leg of buttton connected fromm 3.3v to pin 4
int shoot = 2; // positive wire comming form the trigger/button on xbox controller

void setup() { // setting pinmode and starting serial connection
Serial.begin (9600);
pinMode ( button, INPUT);
pinMode (shoot,OUTPUT);
}
void loop() {
val = digitalRead (button); // reading button storing value
Serial.println (val); // just checking make sure button works
if (val == HIGH) { // if button is pressed
digitalWrite (shoot,HIGH); // needs to go high then low inorder
digitalWrite (shoot,LOW);// to fool conntroller
}
val = LOW; // resting val
}

Thanks for all your help
UPDATE: also tried a analogread but it was to slow. Also sped it up and it was still to slow for the Xbox LINK. Don't know if that helps but tried it too. Thanks for you're help. 
You probably need to have a separate process that deals with the messaging, whilst your keyscan is in the main loop.

Steve
Zaphod Beetlebrox (author)  steveastrouk5 years ago
Thanks got it working allot better. Publish the instructable soon. Thanks for your help.
https://www.instructables.com/id/Mod-Xbox-360-Controller-Using-Arduino-MW3/
the Instructable.
iceng5 years ago
Use mercury whetted switches they don't bounce.

or this very simple logic.  .  .  .   A
classic_debounce.gif
Zaphod Beetlebrox (author)  iceng5 years ago
Thanks, but the project is already vary bulky i'm not sure i want to add another circuit to it and breadboard. I was thinking if there was any way to do this more in the programming sense. Maybe i'll just try some other types of switches. Thanks for the speedy response.