summaryrefslogtreecommitdiff
path: root/blink.zig
blob: 4444427809d454284aca3ede6d8e9ed77c191eb8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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");
        }
    }
}