I finally have a question of my own. More specifically, I’m hoping someone can explain IR sensor behaviour that baffles me.
My set up is as basic as can be: Spider board, DP power module, button module (in socket 4), eblock expansion module (in socket 11). IRLED and IR receiver eblocks are plugged into pins 3 and 4, respectively.
The code that runs my program is:
public partial class Program
{
GT.Interfaces.DigitalOutput irLED;
GT.Interfaces.InterruptInput irSensor;
// This method is run when the mainboard is powered up or reset.
void ProgramStarted()
{
// Use Debug.Print to show messages in Visual Studio's "Output" window during debugging.
Debug.Print("Program Started");
irLED = eBlockExpansion.SetupDigitalOutput( GT.Socket.Pin.Three, false );
SetupInterruptIR();
button.ButtonPressed += new Button.ButtonEventHandler( button_ButtonPressed );
button.ButtonReleased += new Button.ButtonEventHandler( button_ButtonReleased );
}
void irSensor_Interrupt( GT.Interfaces.InterruptInput sender, bool value )
{
Debug.Print( "value: " + value + " sender: " + sender.Read() + " irSensor: " + irSensor.Read() );
}
void button_ButtonPressed( Button sender, Button.ButtonState state )
{
Debug.Print( "Button Down. Time: " + System.DateTime.Now );
irLED.Write( true );
}
void button_ButtonReleased( Button sender, Button.ButtonState state )
{
irLED.Write( false );
Debug.Print( "Button Up. Time: " + System.DateTime.Now );
}
void SetupInterruptIR()
{
irSensor = eBlockExpansion.SetupInterruptInput( GT.Socket.Pin.Four, GT.Interfaces.GlitchFilterMode.On, GT.Interfaces.ResistorMode.PullDown, GT.Interfaces.InterruptMode.RisingAndFallingEdge );
irSensor.Interrupt += new GT.Interfaces.InterruptInput.InterruptEventHandler( irSensor_Interrupt );
}
}
While holding the IR LED about an inch over and directly facing the IR sensor, after pressing the button a few times I get the following debug output:
[quote]Using mainboard GHIElectronics-FEZSpider version 1.0
Program Started
Button Down. Time: 01/01/2009 00:08:45
value: False sender: True irSensor: True
value: True sender: True irSensor: True
Button Up. Time: 01/01/2009 00:08:48
value: False sender: True irSensor: True
Button Down. Time: 01/01/2009 00:08:51
value: False sender: False irSensor: False
value: False sender: True irSensor: True
value: False sender: True irSensor: False
value: False sender: True irSensor: True
value: False sender: True irSensor: True
Button Up. Time: 01/01/2009 00:08:54
value: False sender: True irSensor: True
Button Down. Time: 01/01/2009 00:08:57
value: False sender: False irSensor: False
value: True sender: True irSensor: True
value: False sender: True irSensor: True
Button Up. Time: 01/01/2009 00:09:01
value: False sender: True irSensor: True
Button Down. Time: 01/01/2009 00:09:04
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: False
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
Button Up. Time: 01/01/2009 00:09:12
value: False sender: True irSensor: True
Button Down. Time: 01/01/2009 00:09:14
value: False sender: False irSensor: False
value: True sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: True
value: False sender: True irSensor: False
value: False sender: True irSensor: True
value: True sender: True irSensor: True
Button Up. Time: 01/01/2009 00:09:16
value: False sender: True irSensor: True
The program ‘[12] Micro Framework application: Managed’ has exited with code 0 (0x0).
[/quote]
What may not be obvious from this sample output is its semi-randomness. For the most part, the mass of interrupts happens when the button is pressed and stops when the button is released. Sometimes though, I’ll get an odd random interrupt when nothing is supposed to be going on. Sometimes, when the button is pressed nothing happens, but I still get an interrupt when I release it. Sometimes I get a couple of interrupts when I release. At times, I’ll get 5-10 interrupts on button down, then nothing, no matter how long I hold it down.
What’s more confusing to me, are the values I get. I would expect
Debug.Print( "value: " + value + " sender: " + sender.Read() + " irSensor: " + irSensor.Read() );
to return three identical values every single time. But you can see quite a few permutations of the values even from the short sample run I posted.
So, can anybody explain to me, in simple words, why is my h/w and s/w setup producing this output? Why the deluge of interrupts, and why those values during the interrupts?
–Edit–
Oh, and I should mention that in:
irSensor = eBlockExpansion.SetupInterruptInput( GT.Socket.Pin.Four, GT.Interfaces.GlitchFilterMode.On, GT.Interfaces.ResistorMode.PullDown, GT.Interfaces.InterruptMode.RisingAndFallingEdge );
I tried all sorts of permutations with the parameters. Nothing seemed to really influence my outputs in a radical fashion (except InterruptMode, which just confuses me even more).
And I should mention that I tried plugging things into different sockets too. Nothing changed results appreciably.