diff options
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"); + } + } +} |