diff --git a/lab_3/lab_3.c b/lab_3/lab_3.c index f96e5ff..a2cc777 100644 --- a/lab_3/lab_3.c +++ b/lab_3/lab_3.c @@ -1,4 +1,5 @@ /** + * Lab 3 * To develop a simple stopwatch that measures time intervals between * button presses. * @@ -18,21 +19,35 @@ #include "pico/stdlib.h" #include "hardware/gpio.h" -#define PSEUDO_BTN 15 -#define DELAY_US 1000000 +#define PSEUDO_BTN 15 // GPIO 15 is the pseudo-button +#define DELAY_US 1000000 // 1-second delay for repeating timer +#define DEBOUNCE_MS 200 // Debounce delay -unsigned long long time = 0; -struct repeating_timer timer; +unsigned long long time = 0; // Elapsed time +struct repeating_timer timer; // Repeating timer -bool repeating_timer_callback(struct repeating_timer *t) { +/** + * Callback function for repeating timer + * This function will print the elapsed time every second as required by the + * lab specification. + * @param t The timer that triggered the callback + * @return True to keep the timer running, false to stop it + */ +bool repeating_timer_callback (struct repeating_timer *t) { // Print elapsed time every second printf("Elapsed Time: %llus\n", (time_us_64() - time) / 1000000); return true; } - -void gpio_callback(uint gpio, uint32_t events) { +/** + * Interrupt callback function for pseudo-button (pull-up) + * This function will start the timer on button press (falling edge) + * and stop the timer on button release. (rising edge) + * @param gpio The GPIO pin that triggered the interrupt + * @param events The type of interrupt that triggered the callback + */ +void gpio_callback (uint gpio, uint32_t events) { // Start timer on button press if (gpio == PSEUDO_BTN && events == GPIO_IRQ_EDGE_FALL) { @@ -44,24 +59,32 @@ void gpio_callback(uint gpio, uint32_t events) { repeating_timer_callback, NULL, &timer - ); + ); } // Stop timer on button release - else if (gpio == PSEUDO_BTN && events == GPIO_IRQ_EDGE_RISE) + else { - printf("Timer Stopped at %llu\n", time_us_64()); - cancel_repeating_timer(&timer); + if (gpio == PSEUDO_BTN && events == GPIO_IRQ_EDGE_RISE) + { + printf("Timer Stopped at %llu\n", time_us_64()); + cancel_repeating_timer(&timer); - // Print elapsed time and reset - printf("Final Elapsed Time: %llus\n", - (time_us_64() - time) / 1000000); + // Print elapsed time and reset + printf("Final Elapsed Time: %llus\n", + (time_us_64() - time) / 1000000); - time = 0; + time = 0; + } } } -static void btn_init() -{ +/** + * Initialize the pseudo-button (pull-up) + * The pseudo-button is connected to GPIO 15 and is configured as an input + * with a pull-up resistor. + * The interrupt is configured to trigger on both rising and falling edges. + */ +static void btn_init () { gpio_init(PSEUDO_BTN); gpio_set_dir(PSEUDO_BTN, GPIO_IN); gpio_set_pulls(PSEUDO_BTN, true, false); @@ -74,13 +97,15 @@ static void btn_init() ); } -int main() -{ +int main () { stdio_init_all(); btn_init(); - while (true) { + while (true) + { tight_loop_contents(); + // Debounce + sleep_ms(DEBOUNCE_MS); } }