This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
en:examples:digi:switch [2015/11/05 08:24] – heikopikner | en:examples:digi:switch [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Switch ====== | ====== Switch ====== | ||
- | //Neccesary knowledge: [HW] [[en: | + | //Neccesary knowledge: |
+ | [HW] [[en: | ||
+ | [AVR] [[en: | ||
+ | [LIB] [[en: | ||
+ | [PRT] [[en: | ||
===== Theory ===== | ===== Theory ===== | ||
Line 12: | Line 16: | ||
- | ^ Push button switch ^ Toggle switch ^ Rocker | + | ^ Push button switch ^ Toggle switch ^ Rocker switch ^ |
- | |{{: | + | |{{: |
- | | {{: | + | | {{: |
+ | |||
+ | |||
+ | ^ Micro switch ^ DIL switch ^ | ||
+ | |{{: | ||
+ | | {{: | ||
In order to use a switch as a sensor connected to a microcontroller, | In order to use a switch as a sensor connected to a microcontroller, | ||
Line 69: | Line 78: | ||
There are three push button-switches on the User interface module. Those switches connect the pins of microcontroller to the earth, however not directly through a resistor, this is to avoid short circuiting when pressing the button while setting the pins as output. The switches have also pull-up resistors, but those have much greater resistance than protective resistors, therefore while pressing the button, there will still be approximately 0 V voltages on the corresponding pin. | There are three push button-switches on the User interface module. Those switches connect the pins of microcontroller to the earth, however not directly through a resistor, this is to avoid short circuiting when pressing the button while setting the pins as output. The switches have also pull-up resistors, but those have much greater resistance than protective resistors, therefore while pressing the button, there will still be approximately 0 V voltages on the corresponding pin. | ||
- | The switches | + | Switch positions |
- | + | ||
- | Sample code for using buttons is based on the HomeLab pins library, which was introduced in the example of LED. | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | ===== Filtration of switch bounce ===== | + | |
- | + | ||
- | As mentioned in the introductory chapter of switches, there exists an issue of bouncing or flickering when dealing with mechanical switches. Problem arises since contacts are made of metal which has some elasticity, at the moment of connecting or disconnecting the contacts bounce and this results in number of false switching’s. The number and duration of the switching' | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== Practice ===== | + | |
- | + | ||
- | Electrical filtering is not used on HomeLab switches, since it would not allow practicing the elimination of miss switching’s with software. The exercise is in two parts. The goal of the first part is to demonstrate the bouncing of User interface module switches. The following program is used for this; each pressing on the button will light the next LED in line. Wrongly pressed button will causes LEDs to light several times and it appears as the LEDs light randomly. | + | |
- | + | ||
- | <code c> | + | |
- | // | + | |
- | // Homelab User interface board switch debounce test program | + | |
- | // | + | |
- | #include < | + | |
- | + | ||
- | // | + | |
- | // Main program | + | |
- | // | + | |
- | int main(void) | + | |
- | { | + | |
- | int counter = 0; | + | |
- | + | ||
- | // Set LED pins as output and switch pin as input | + | |
- | pin_setup_output(led_red); | + | |
- | pin_setup_output(led_yellow); | + | |
- | pin_setup_output(led_green); | + | |
- | + | ||
- | pin_setup_input(S1); | + | |
- | + | ||
- | // Endless loop | + | |
- | while(1) | + | |
- | { | + | |
- | // Check if switch S1 is pressed | + | |
- | if(pin_get_value(S1) == 0) | + | |
- | { | + | |
- | // Light the corresponding LED | + | |
- | if(counter == 0) led_on(led_green); | + | |
- | else led_off(led_green); | + | |
- | if(counter == 1) led_on(led_yellow); | + | |
- | else led_off(led_yellow); | + | |
- | if(counter == 2) led_on(led_red); | + | |
- | else led_off(led_red); | + | |
- | + | ||
- | // Add counter and take a module | + | |
- | counter = (counter + 1) % 3; | + | |
- | + | ||
- | // Wait until switch is unpressed | + | |
- | while(pin_get_value(S1) == 0); | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
Below is a function for reading filtered values of a button for User interface module: | Below is a function for reading filtered values of a button for User interface module: | ||
<code c> | <code c> | ||
- | // | + | // Function for reading filtered values of a IO extension module |
- | // Function for reading filtered values of a IO extension module. | + | |
- | // | + | |
unsigned char button_read(pin button) | unsigned char button_read(pin button) | ||
{ | { | ||
Line 148: | Line 93: | ||
while (timeout-- > 0) | while (timeout-- > 0) | ||
{ | { | ||
- | // Having 8 place (bit) bufffer of state. | + | // Having 8 place (bit) bufffer of state |
// All previous states (bits) are shifted to left | // All previous states (bits) are shifted to left | ||
- | // and a new state(bit) is added to the right. | + | // and a new state(bit) is added to the right |
buffer <<= 1; | buffer <<= 1; | ||
buffer |= (pin_get_value(button) ? 0x01 : 0x00); | buffer |= (pin_get_value(button) ? 0x01 : 0x00); | ||
Line 160: | Line 105: | ||
} | } | ||
- | // If all 8 bits are low, then the button is definitely up. | + | // If all 8 bits are low, then the button is definitely up |
if (buffer == 0x00) | if (buffer == 0x00) | ||
{ | { | ||
Line 166: | Line 111: | ||
} | } | ||
- | // 1 ms break. | + | // 1 ms break |
- | // This function can be found from the library of the HomeLab. | + | // This function can be found from the library of the HomeLab |
_delay_ms(1); | _delay_ms(1); | ||
} | } | ||
- | + | // If can't examine the state, then assume that button was not pressed | |
- | // If can't examine the state, then assume that button was not pressed. | + | |
return 0; | return 0; | ||
} | } | ||
</ | </ | ||
- | This function generates a delay using a function which is explained in corresponding exercise. At this moment all we need to know about the delay function is that it generates a 1 ms delay at the end of each cycle for reading the state of the button. If the button is in the same position during 8 readings, it returns to the counted position. In case the button is unstable the entire procedure may take up to 100 ms. This function is included in the library of pins, hence there is no need to add it to the program for passing the example. | + | This function generates a delay using a function which is explained in corresponding exercise. At this moment all we need to know about the delay function is that it generates a 1 ms delay at the end of each cycle for reading the state of the button. If the button is in the same position during 8 readings, it returns to the counted position. In case the button is unstable the entire procedure may take up to 100 ms. This function is included in the library of pins, hence there is no need to add it to the program for passing the example. |
+ | |||
+ | The following example illustrates | ||
<code c> | <code c> | ||
- | // | + | // The program for filtering the debounce of buttons of User interface module |
- | // The program for filtering the debounce of buttons of User interface module. | + | |
- | // | + | |
#include < | #include < | ||
- | // | ||
// Main program | // Main program | ||
- | // | ||
int main(void) | int main(void) | ||
{ | { | ||
Line 216: | Line 158: | ||
// Wait until switch is unpressed | // Wait until switch is unpressed | ||
- | while(pin_get_value(S1) == 0); | + | while(button_read(S1) != 0); |
} | } | ||
} | } | ||
Line 235: | Line 177: | ||
<code c> | <code c> | ||
- | // Button demonstration example of User interface module. | + | // Button demonstration example of User interface module |
#include < | #include < | ||