Actions

EmSys

Difference between revisions of "Switch Inputs and LED Outputs in TM4C123"

From EdWiki

m (GPIO Commit (GPIOCR) Register)
m
 
(3 intermediate revisions by the same user not shown)
Line 5: Line 5:
  
 
We can use either positive or negative logic, and we can use an external resistor or select an internal resistor. Notice the positive logic circuit with external resistor is essentially the same as the positive logic circuit with internal resistance; the difference lies with whether the pull-down resistor is connected externally as a 10 kΩ resistor or internally by setting the corresponding PDR bit during software initialization.
 
We can use either positive or negative logic, and we can use an external resistor or select an internal resistor. Notice the positive logic circuit with external resistor is essentially the same as the positive logic circuit with internal resistance; the difference lies with whether the pull-down resistor is connected externally as a 10 kΩ resistor or internally by setting the corresponding PDR bit during software initialization.
== SW1 and SW2 on LaunchPad ==
+
=== SW1 and SW2 on LaunchPad ===
 
[[image:tm4c_sw1_sw2_connection.png|center|SW1 and SW2 on LaunchPad]]
 
[[image:tm4c_sw1_sw2_connection.png|center|SW1 and SW2 on LaunchPad]]
  
* SW1 push-button switch is connected directly to PF0 pin.  
+
* SW1 push-button switch is connected to PF0 pin.  
* SW2 push-button switch is connected directly to PF4 pin.
+
* SW2 push-button switch is connected to PF4 pin.
 
* There is no pull-up resistor connected to SW1 & SW2
 
* There is no pull-up resistor connected to SW1 & SW2
* To use the SW1 and SW2, we need to enable the internal pull-up resistor for PF0 and PF4 pins.
+
* To use the SW1 and SW2, we need to enable the [[EmSys:TM4C123GXL GPIO - Configure each pad in the port to have pull-up-pull-down-open drain | internal pull-up resistor for PF0 and PF4 pins]].
{{EmSys:TM4C123GXL GPIO - Configure each pad in the port to have pull-up-pull-down-open drain#GPIO Pull-Up Select (GPIOPUR) Register}}
+
  
== Read SW1 & Display it on the Green LED ==
+
=== Read SW1 & Display it on the Green LED ===
 
To read SW1 and display it on the green LED, the following steps must be taken.
 
To read SW1 and display it on the green LED, the following steps must be taken.
 
# Enable the clock to PortF
 
# Enable the clock to PortF
Line 26: Line 25:
 
# Repeat steps 5 to 8
 
# Repeat steps 5 to 8
  
=== Source Code ===
+
==== Source Code ====
 
<syntaxhighlight lang="c" line start="1">
 
<syntaxhighlight lang="c" line start="1">
 
/* Read a switch and write it to the LED */
 
/* Read a switch and write it to the LED */
Line 56: Line 55:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Read SW2 and Write it on Red LED ==
+
=== Read SW2 and Write it on Red LED ===
To read SW2 and display it on the red LED, the program is similar to Previous except extra steps needed to take care of PortF0 as described below:  
+
To read SW2 and display it on the Red LED, the program is similar to the previous program except extra steps needed to take care of PortF0 as described below:  
 
* The SW2 is connected to PortF0 pin, which is shared with '''NMI''' (non-maskable interrupt).
 
* The SW2 is connected to PortF0 pin, which is shared with '''NMI''' (non-maskable interrupt).
 
* To prevent accidental write to configuration registers and thus disables NMI, the configuration register bits for PortF0 are normally locked.  
 
* To prevent accidental write to configuration registers and thus disables NMI, the configuration register bits for PortF0 are normally locked.  
* They may be unlocked by writing a passcode value of '''0x4C4F434B''' to the '''LOCK''' Register followed by setting bit 0 of the Commit Register ('''GPIOCR''').
+
* They may be [[EmSys:TM4C123GXL GPIO - Unlock the port | unlocked]] by writing a pass code value of '''0x4C4F434B''' to the '''LOCK''' Register followed by setting bit 0 of the [[EmSys:TM4C123GXL GPIO - Unlock the port | Commit Register]] ('''GPIOCR''').
{{EmSys:TM4C123GXL GPIO - Unlock the port}}
+
  
=== Source Code ===
+
 
 +
==== Source Code ====
 
<syntaxhighlight lang="c" line start="1">
 
<syntaxhighlight lang="c" line start="1">
 
/* Read a switch and write it to the LED */
 
/* Read a switch and write it to the LED */

Latest revision as of 05:30, 13 March 2020

Switch Inputs and LED Outputs

There are four ways to interface a switch to the microcontroller as shown in the following Figure:

Interface of a switch to a microcomputer input

We can use either positive or negative logic, and we can use an external resistor or select an internal resistor. Notice the positive logic circuit with external resistor is essentially the same as the positive logic circuit with internal resistance; the difference lies with whether the pull-down resistor is connected externally as a 10 kΩ resistor or internally by setting the corresponding PDR bit during software initialization.

SW1 and SW2 on LaunchPad

SW1 and SW2 on LaunchPad
  • SW1 push-button switch is connected to PF0 pin.
  • SW2 push-button switch is connected to PF4 pin.
  • There is no pull-up resistor connected to SW1 & SW2
  • To use the SW1 and SW2, we need to enable the internal pull-up resistor for PF0 and PF4 pins.

Read SW1 & Display it on the Green LED

To read SW1 and display it on the green LED, the following steps must be taken.

  1. Enable the clock to PortF
  2. Set the Direction register PF4 as input, and PF3 as output
  3. Enable the digital I/O feature of PortF
  4. Enable the pull up resistor option in PUR register since the switch circuit does not have pull-up resistor
  5. Read SW1 on PortF
  6. Invert the value since the switch is active low and the LED is active high
  7. Shift right the switch bit (PF4) to green LED bit(PF3) of the value
  8. Write the value to green LED of PortF
  9. Repeat steps 5 to 8

Source Code

  1. /* Read a switch and write it to the LED */
  2. /* This program reads SW1 of Tiva LaunchPad and writes the inverse of the value to the green
  3.    LED. SW1 is low when pressed (Normally High). LED is ON when high.
  4. */
  5.  
  6. #include <stdint.h>
  7. #include "inc/tm4c123gh6pm.h"
  8.  
  9. int main(void)
  10. {
  11.     unsigned int value;
  12.  
  13.     SYSCTL_RCGC2_R |= 0x00000020;;   /* enable clock to GPIOF */
  14.  
  15.     GPIO_PORTF_DIR_R = 0x08;         /* set PORTF3 pin as output (LED) pin */
  16.                                      /* and PORTF4 as input, SW1 is on PORTF4 */
  17.     GPIO_PORTF_DEN_R = 0x18;         /* set PORTF pins 4-3 as digital pins */
  18.     GPIO_PORTF_PUR_R = 0x10;         /* enable pull up for pin 4 */
  19.  
  20.     While(1) {
  21.         value = GPIO_PORTF_DATA_R;  /* read data from PORTF */
  22.         value = ~value;             /* switch is low active; LED is high active */
  23.         value = value >> 1;         /* shift it right to display on green LED */
  24.         GPIO_PORTF_DATA_R = value;  /* put it on the green LED */
  25.     }
  26. }

Read SW2 and Write it on Red LED

To read SW2 and display it on the Red LED, the program is similar to the previous program except extra steps needed to take care of PortF0 as described below:

  • The SW2 is connected to PortF0 pin, which is shared with NMI (non-maskable interrupt).
  • To prevent accidental write to configuration registers and thus disables NMI, the configuration register bits for PortF0 are normally locked.
  • They may be unlocked by writing a pass code value of 0x4C4F434B to the LOCK Register followed by setting bit 0 of the Commit Register (GPIOCR).


Source Code

  1. /* Read a switch and write it to the LED */
  2. /* This program reads SW2 of Tiva LaunchPad and write the inverse of the value to the red LED.
  3.    SW2 is low when pressed. LED is on when high. */
  4. /* SW2 is connected to PORTF0, which is an NMI pin. */
  5. /* In order to use this pin for any function other than NMI, the pin needs be unlocked first. */
  6.  
  7. #include <stdint.h>
  8. #include "inc/tm4c123gh6pm.h"
  9.  
  10. int main(void)
  11. {
  12.     unsigned int value;
  13.  
  14.     SYSCTL_RCGC2_R |= 0x00000020;       /* enable clock to GPIOF */
  15.  
  16.     GPIO_PORTF_LOCK_R = 0x4C4F434B;     /* unlock commit register */
  17.     GPIO_PORTF_CR_R = 0x01;             /* make PORTF0 configurable */
  18.     GPIO_PORTF_DIR_R = 0x02;            /* set PORTF1 pin as output (LED) pin */
  19.                                         /* and PORTF0 as input, SW2 is on  PORTF0 */
  20.     GPIO_PORTF_DEN_R = 0x03;            /* set PORTF pins 1-0 as digital pins */
  21.     GPIO_PORTF_PUR_R = 0x01;            /* enable pull up for pin 0 */
  22.  
  23.     while(1) {
  24.         value = GPIO_PORTF_DATA_R;      /* read data from PORTF */
  25.         value = ~value;                 /* switch is low active; LED is high active */
  26.         value = value << 1;             /* shift it left to display on red LED */
  27.         GPIO_PORTF_DATA_R = value;      /* put it on red LED */
  28.     }
  29. }