summaryrefslogtreecommitdiff
path: root/blink.zig
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-12-18 00:30:51 -0700
committerJosh Rahm <joshuarahm@gmail.com>2024-12-18 00:30:51 -0700
commit40575cafe477df2ed3779789174a13eae5da187e (patch)
tree44564b9e8abe7c7ed254d97ad9edaaced3e716f5 /blink.zig
downloadarduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.tar.gz
arduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.tar.bz2
arduino-zig-lights-40575cafe477df2ed3779789174a13eae5da187e.zip
Initial commit for programming an arduino in Zig.HEADmain
This is a simple collatz blinker program.
Diffstat (limited to 'blink.zig')
-rw-r--r--blink.zig66
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");
+ }
+ }
+}