avr-task-scheduler

AVR mcu bare metal task scheduler
Index Commits Files Refs README LICENSE
commit 4abc910b5e2c964e64770a6645894d8fd6e03863
parent 74bb6bde384e340714c1fe46f2fc973b1c34d856
Author: Martin Kloeckner <mjkloeckner@gmail.com>
Date:   Sun, 28 Sep 2025 01:13:08 -0300

add one more task: turn on led based on button state

Diffstat:
Msrc/main.c | 17+++++++++++++++--
Msrc/scheduler.c | 8++------
Msrc/scheduler.h | 1-
3 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/src/main.c b/src/main.c
@@ -3,8 +3,10 @@
 #include "millis.h"
 #include "scheduler.h"
 
+#define BTN_PIN   2
 #define LED_1_PIN 3
 #define LED_2_PIN 4
+#define LED_3_PIN 5
 
 void toggle_led_1(void) {
     PIND = (1 << LED_1_PIN);
@@ -14,14 +16,25 @@ void toggle_led_2(void) {
     PIND = (1 << LED_2_PIN);
 }
 
+void read_button(void) {
+    uint8_t btn_pin_state = (PIND & (1<<BTN_PIN));
+
+    if (!btn_pin_state) {
+        PORTD |= (1<<LED_3_PIN);
+    } else {
+        PORTD &= ~(1<<LED_3_PIN);
+    }
+}
+
 void setup(void) {
-    DDRD |= (1<<LED_1_PIN) | (1<<LED_2_PIN);
+    DDRD = (DDRD | (1<<LED_1_PIN) | (1<<LED_2_PIN) | (1<<LED_3_PIN)) & ~(1<<BTN_PIN);
+    PORTD |= (1<<BTN_PIN);
 
     millis_init();
 
-    scheduler_init();
     scheduler_append_task(&toggle_led_1, 1000);
     scheduler_append_task(&toggle_led_2, 500);
+    scheduler_append_task(&read_button, 0);
 }
 
 int main(void) {
diff --git a/src/scheduler.c b/src/scheduler.c
@@ -18,11 +18,6 @@ typedef struct {
 
 static scheduler_t scheduler = {0};
 
-void scheduler_init(void) {
-    scheduler.task_cnt = 0;
-    scheduler.t_ms_dt = 0;
-}
-
 // update every 1 ms
 void scheduler_update(uint32_t t_ms) {
     if ((t_ms - scheduler.t_ms_dt) < 1) {
@@ -44,7 +39,8 @@ void scheduler_update(uint32_t t_ms) {
 
 void scheduler_append_task(void (*update_func)(void), uint16_t update_interval) {
     scheduler.tasks[scheduler.task_cnt].task_update = update_func;
-    scheduler.tasks[scheduler.task_cnt].update_interval = update_interval - 1;
+    scheduler.tasks[scheduler.task_cnt].update_interval =
+        (update_interval == 0) ? update_interval : update_interval - 1;
     scheduler.task_cnt++;
 }
 
diff --git a/src/scheduler.h b/src/scheduler.h
@@ -9,7 +9,6 @@ extern "C" {
 
 #include <stdint.h>
 
-void scheduler_init(void);
 void scheduler_update(uint32_t t_ms);
 void scheduler_append_task(void (*update_func)(void), uint16_t update_interval);