diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-12-18 00:30:51 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-12-18 00:30:51 -0700 |
commit | 40575cafe477df2ed3779789174a13eae5da187e (patch) | |
tree | 44564b9e8abe7c7ed254d97ad9edaaced3e716f5 /blink.zig | |
download | arduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.tar.gz arduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.tar.bz2 arduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.zip |
This is a simple collatz blinker program.
Diffstat (limited to 'blink.zig')
-rw-r--r-- | blink.zig | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/blink.zig b/blink.zig new file mode 100644 index 0000000..4444427 --- /dev/null +++ b/blink.zig @@ -0,0 +1,66 @@ +const std = @import("std"); + +const DDRB = @as(*volatile u8, @ptrFromInt(0x24)); +const PORTB = @as(*volatile u8, @ptrFromInt(0x25)); + +const DELAY = 100; + +pub export fn delay(n: u32) void { + var i: u32 = 0; + while (i < n) : (i += 1) { + asm volatile ("nop" ::: "memory"); + } +} + +pub export fn blink(n: u32) void { + var i: u32 = 0; + DDRB.* = DDRB.* | (1 << 5); + + while (i < n) : (i += 1) { + // Toggle PB5 + PORTB.* ^= @as(u8, 1 << 5); + delay(100_000); + PORTB.* ^= @as(u8, 1 << 5); + delay(200_000); + } +} + +pub export fn collatz(na: u32) u32 { + var n: u32 = na; + var c: u32 = 0; + + while (n > 1) : (c += 1) { + if (n % 2 == 0) { + n /= 2; + } else { + n = n + n + n + 1; + } + } + + return c; +} + +pub export fn main() void { + var i: u32 = 0; + while (true) : (i += 1) { + const c = collatz(i); + blink(c); + delay(500_000); + } +} + +pub export fn abort() void { + // Set PB5 (pin 13) as output + DDRB.* = DDRB.* | (1 << 5); + + while (true) { + // Toggle PB5 + PORTB.* ^= @as(u8, 1 << 5); + + // Simple delay + var i: usize = 0; + while (i < DELAY) : (i += 1) { + asm volatile ("nop" ::: "memory"); + } + } +} |