[TriEmbed] [OBSOLETE trianglearduino:1095] Problem with AtTiny85 and buttons
R Craig
roncraig007 at yahoo.com
Tue Jul 15 14:29:18 CDT 2014
Doesn't it sort of depend, Rob, on who or what is at the other end?
Without debouncing the button, the IR LED will flash on-off-on-off some number of times before settling down to on. If the other end were just a human looking at the light, then sure, it wouldn't matter because the human would never detect or be confused by the very brief flashes. This being an IR, though, I imagine there is another piece of electronics at the other end, and it might or might not be confused by the IR going on and off a bunch of times with each single button press.
If it is a sensor in a target, it might well register 6 or 8 hits (racking up some serious points in the process) with just a single press of the button. The point of debouncing the button is to ensure your output switches state just *once* with each press. For an IR LED, it might make quite a difference, depending on the circumstances.
Best,
Ron
--------------------------------------------
On Tue, 7/15/14, Robert Mackie <rob at mackies.org> wrote:
Subject: Re: [TriEmbed] [OBSOLETE trianglearduino:1095] Problem with AtTiny85 and buttons
To: "Adam Haile" <email at adamhaile.net>
Cc: "TriEmbed Discussion" <triembed at triembed.org>
Date: Tuesday, July 15, 2014, 2:15 PM
Just to
emphasize, since you weren't doing a toggled state but
were having the light simply show the current pressed state
of the button (bright when switch closed, no light when
switch open) you don't need to worry about
de-bouncing.
However, you do need to take
care of biasing the input as described in Adam's email
or with an external resistor.
Rob.
On Tue, Jul 15, 2014 at 10:32 AM, Adam Haile <email at adamhaile.net>
wrote:
Joe,
Easiest
way to do the mentioned bias resistors is to use the
one's built into the AT chip :)Every IO pin
on the AT series chips have an internal pull-up resistor
ranging from 10k-50k ohm (depending on the chip
model).
To enable it, you set the
pin mode to input and then write a high bit to it. Sounds
weird, but that's just the way the resisters
work:
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
//sets internal pull-up
Then, simply wire your button
to "pull" that pin to ground. i.e. hook one side
of the button to buttonPin and the other to ground. When the
button closes the bias is now ground because it has the
least resistance and your micro will see LOW. See the
following for more: http://arduino.cc/en/Tutorial/DigitalPins
For debouncing, if you aren't too worried
about not doing it the most efficient way try this: http://playground.arduino.cc/code/bounce
At its simplest, you can do something like
this:
uint8_t _oldState = HIGH;uint8_t _curState =
_oldState;long bounceThreshold = 100;//wait
100ms, increase or decrease depending on how sesitive you
want the debouncing
_curState =
digitalRead(buttonPin);
if(_curState != _oldState){ delay(bounceThreshold); if(_curState ==
digitalRead(buttonPin))
{ if(_curState) { // turn LED
on:
} else { // turn LED
off:
} _oldState =
_curState; }}
It's pretty basic, but it gets the job done
in most cases. Note, this should make it so the LED is on
only while the button is actually down. It's not a
toggle (press on/press off). To to that, in the if(_curSate)
section just flip a boolean (ledState != ledState) and then
at the end of that whole if statement do
digitalWrite(ledPin, ledState);
There's many ways to
skin this one... personally I use external interrupts with
buttons... but that's a whole other lesson. Though, side
note. The reason the internal bias resistors are pull-up is
that the chips are set to only be able to be woken from
sleep when the external interrupt goes LOW. You can
configure the interrupts to react to LOW or HIGH, but being
woken from sleep is a special case and it looks like they
simplified the chip circuit by requiring that a wake be a
LOW pulse.
On Tue, Jul 15, 2014 at 10:15 AM,
Glen Smith <mrglenasmith at gmail.com>
wrote:
I'm guessing that
you have 2 problems. One is due to your input switch
bouncing. When a mechanical switch closes it does not simply
change from false to true. For a few milliseconds
(immediately for us slow humans but forever for a
u-processor running this little bit of code) it bounces back
& forth between the two states. Regardless of how fast
or hard you push that switch, the Tiny85 will see many of
these changes.
The other thing you are running into is called
a floating input. When you set the button as an input, you
need to use a resistor to bias the input to return to a
known level. Think of it like a lever, unless a spring
pushes or pulls the lever to a known state, when you let go
of it, the lever will simply stay where you left it. In the
case of your input, you left it high, so the charge on the
input slowly dissipates, and a second or so later the Tiny85
sees it as a low. These biasing resistors are called pull-up
& pull-down resistors.
On Jul 15, 2014 6:58
AM, "Bothari" <bothari at gmail.com>
wrote:
Group,
I've been learning about
hardware for the last couple of months, but I've come up
against a problem with inputs. I put together a little IR
gun with the AtTiny85, but I can't get the trigger to
fire the gun. I've reduced the problem to one AtTiny85
with a resistor and LED, but I still don't understand
what's going on.
With the below code (Blink
from the examples) I can touch the #2 pin high and the light
on pin 3 comes on, but it stays on for like a second or so
before going off. I think it should go off immediately.
I added 3 blinks
on the LED on startup to make sure I know when it resets,
and the fuse bits for the oscillator are set to 8mHz. That
works as expected.
Any
ideas?
Joe
const
int buttonPin = 2; // the number of the pushbutton
pinconst int ledPin = 3; // the number
of the LED pin
//
variables will change:
int buttonState = 0; // variable for
reading the pushbutton status
void setup() { //
initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW); // initialize
the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
//Show that we
rebooted digitalWrite(ledPin, HIGH);
delay(300); digitalWrite(ledPin,
LOW); delay(300);
digitalWrite(ledPin,
HIGH); delay(300);
digitalWrite(ledPin, LOW);
delay(300);
digitalWrite(ledPin,
HIGH); delay(300);
digitalWrite(ledPin, LOW);
delay(300); }
void loop(){ // read
the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is
pressed. // if it is, the buttonState is
HIGH: if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
} else { // turn LED
off: digitalWrite(ledPin,
LOW); }}
--
"There are
only two industries that refer to their customers as
‘users’." - Edward Tufte
--
NOTICE: This list is OBSOLETE. For details about the
replacement TriEmbed list go here:
http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
---
You received this message because you are subscribed to the
Google Groups "trianglearduino" group.
To unsubscribe from this group and stop receiving emails
from it, send an email to trianglearduino+unsubscribe at googlegroups.com.
Visit this group at http://groups.google.com/group/trianglearduino.
For more options, visit https://groups.google.com/d/optout.
_______________________________________________
Triangle, NC Embedded Computing mailing list
TriEmbed at triembed.org
http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
TriEmbed web site: http://TriEmbed.org
_______________________________________________
Triangle, NC Embedded Computing mailing list
TriEmbed at triembed.org
http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
TriEmbed web site: http://TriEmbed.org
-----Inline Attachment Follows-----
_______________________________________________
Triangle, NC Embedded Computing mailing list
TriEmbed at triembed.org
http://mail.triembed.org/mailman/listinfo/triembed_triembed.org
TriEmbed web site: http://TriEmbed.org
More information about the TriEmbed
mailing list