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:
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);