diff --git a/lib/7segment_4digits.c b/lib/7segment_4digits.c index f174ab1..606e34a 100644 --- a/lib/7segment_4digits.c +++ b/lib/7segment_4digits.c @@ -30,14 +30,14 @@ void update_display_digit(int digit) { display_value(digit, display[digit]); } -// Returns the amount of microseconds we blocked for -float update_display_all_sync() { - int sleep_time = 2000; +// Returns the amount of milliseconds we blocked for +uint32_t update_display_all_sync() { + uint32_t sleep_time_ms = 1; for (int i = 0; i < 4; i++) { - display_value(i, display[i]); - _delay_us(sleep_time); + update_display_digit(i); + _delay_ms(sleep_time_ms); } - return sleep_time * 4; + return sleep_time_ms * 4; } void show_float(float value) { diff --git a/lib/7segment_4digits.h b/lib/7segment_4digits.h index 90e08d6..e81463b 100644 --- a/lib/7segment_4digits.h +++ b/lib/7segment_4digits.h @@ -8,6 +8,6 @@ void update_next_digit(); void update_display_digit(int digit); -float update_display_all_sync(); +uint32_t update_display_all_sync(); void show_float(float value); diff --git a/lib/util.c b/lib/util.c index 6bcd929..ecfceca 100644 --- a/lib/util.c +++ b/lib/util.c @@ -4,6 +4,7 @@ int num_digits(int num) { return 1; } +// chatgpt generated int get_digit_at_position(int number, int index) { if (index < 0) { return -1; diff --git a/main.c b/main.c index 104406d..29d2352 100644 --- a/main.c +++ b/main.c @@ -5,86 +5,50 @@ #include #include #include -#include #include "lib/util.h" #include "lib/7segment.h" #include "lib/7segment_4digits.h" -int tick_timer_start = 0xffff - (F_CPU / 1024 / 1000); // 1ms -volatile uint32_t ticks = 0; -volatile beep_time = 0; -volatile bool counting = false; - -void start_timer() { - // Sets the Clock Select. See table on page 157 the Atmel datasheet. - TCCR1B |= _BV(CS10) | _BV(CS12); // clk/1024 - TCCR2B |= _BV(CS22); // clk/64 - - // Set the TOIE (Timer Overflow Interrupt Enable) bit - // on TIMSK1 (Timer 1 Interrupt Mask Register). - TIMSK1 |= _BV(TOIE1); - TIMSK2 |= _BV(TOIE2); - - // Sets the current timer value - TCNT1 = tick_timer_start; - - // Enable interrupts - sei(); -} - -// ISR is used to handle interrupts. TIMER1_OVF_vect -// is triggered whenever timer 1 (16 bit) overflows. -ISR(TIMER1_OVF_vect) { - TCNT1 = tick_timer_start; - if (counting) { - ticks += 1; - if (TICK_BEEP && ticks % 1000 == 0 && !beep_time) beep_time = 10; - } - - if (bit_is_set(PIND, PIND0)) { - PORTD &= 0b11111110; - } else if (beep_time > 0) { - PORTD |= 0b00000001; - beep_time--; - } -} - -ISR(TIMER2_OVF_vect) { - update_next_digit(); -} - -void beep() { - beep_time = 50; -} - void main() { DDRF = 0b11111111; DDRK = 0b00001111; DDRD = 0b00000001; PORTK = 0b11000000; // set pull-up - start_timer(); - - float num = 0.0f; + uint32_t millis = 0; + bool counting = false; bool pressed_pause = false; bool pressed_clear = false; while(1) { - show_float(ticks / 1000.0f); + // show_float() doesn't actually print to the display directly, it only updates + // a variable stored in memory. We call `update_display_all_sync()` periodically, + // which reads the stored variable and outputs it. + show_float(millis / 1000.0f); + // Cycles through all 4 displays, turns them on for a set amount of time + // while displaying the value set by `show_float()` earlier and returns + // the total amount waited. + uint32_t sleep_time = update_display_all_sync(); + + if (counting) { + // We can use the returned sleep_time to (inaccurately) count time. + millis += sleep_time; + } + + // If the button connected to PIN7 is pressed, pause or unpause the counter. if (!pressed_pause && bit_is_clear(PINK, PINK7)) { counting = !counting; pressed_pause = true; - beep(); } else if (pressed_pause && bit_is_set(PINK, PINK7)) { pressed_pause = false; } + // If the button connected to PIN6 is pressed, reset and pause the counter. if (bit_is_clear(PINK, PINK6)) { - ticks = 0; + millis = 0; counting = false; - if (!pressed_clear) beep(); pressed_clear = true; } else pressed_clear = false; }