This example describes how to initialize and use the TMR1 in Gate
Single-Pulse mode. The timer will start counting on an falling edge. If the leading edge
appears, a gate interrupt will be generated, denoting that the button was short pressed.
If the timer overflows before the leading edge appears, an overflow interrupt will be
generated, denoting that the button was long pressed. A GPIO pin will be configured as
input and connected to a button.
Note: The polarity of the gate is based on
the button logic. If the button is active-low (meaning it will provide zero logic value
when pressed), the timer needs to count on negative polarity and start counting on
falling edge.
In this example, the microcontroller was configured with a clock system of 1 MHz and the
timer was configured with a clock source frequency of 31,250 MHz = 32 µs and is able to
measure the following range of values:
- The smallest pressed time: This
is based on the clock frequency of the timer, resulting in a minimum time of 1 /
31,250 Hz = 32 µs.
- The biggest pressed time: This is
based on the maximum value the timer can count. It is a 16-bit timer so it can
count up to 65,535. Thus, resulting in a minimum time of 32 µs * 65,535 ~ = 2.1
s. A longer press will result in a timer overflow.
To achieve the functionality described by this use case, the following
actions will have to be performed:
- System clock initialization
- Port initialization
- Timer1 initialization
- Interrupts initialization
- Timer1 interrupt handling
- Timer1 gate interrupt handling