From eb8643ddbef43547eb7bfe58789a3908926c7258 Mon Sep 17 00:00:00 2001 From: Vaino Kauppila Date: Sun, 19 Apr 2026 12:32:58 +0300 Subject: refactor dir structure, add fib.c --- fw/fib.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 fw/fib.c (limited to 'fw/fib.c') diff --git a/fw/fib.c b/fw/fib.c new file mode 100644 index 0000000..2ba9535 --- /dev/null +++ b/fw/fib.c @@ -0,0 +1,84 @@ +#include + +typedef unsigned char uint8_t; + +__sfr __at(0x70) UART_TX; +__sfr __at(0x71) UART_RX; +__sfr __at(0x72) UART_STATUS; + +static volatile uint8_t _d0, _d1, _d2; + +// Custom delay to make the output readable at 50MHz +static void delay(void) { + _d0 = 0; + do { + _d1 = 0; + do { + _d2 = 0; + do { _d2++; } while (_d2 != 0); + } while (++_d1 != 50); // Increased for 50MHz visibility + _d0++; + } while (_d0 != 20); +} + +static void uart_send(uint8_t byte) { + while (UART_STATUS & 0x01); + UART_TX = byte; +} + +static void uart_puts_rom(const char *s) { + while (*s) { + uart_send((uint8_t)*s); + s++; + } +} + +// Simple BCD printer for 8-bit numbers +void print_uint8(uint8_t v) { + uint8_t started = 0; + + // Hundreds + if (v >= 200) { uart_send('2'); v -= 200; started = 1; } + else if (v >= 100) { uart_send('1'); v -= 100; started = 1; } + + // Tens + uint8_t tens = '0'; + while (v >= 10) { v -= 10; tens++; } + if (started || tens != '0') { uart_send(tens); } + + // Units + uart_send(v + '0'); +} + +void main(void) { + uint8_t a, b, next; + + uart_puts_rom("\x1B[2J\x1B[H"); // Clear screen, Home cursor + uart_puts_rom("PIC16F84A @ 50MHz Fibonacci\r\n"); + uart_puts_rom("---------------------------\r\n"); + + while (1) { + a = 0; + b = 1; + + while (a <= 233) { // Max 8-bit Fib is 233 + print_uint8(a); + uart_puts_rom(", "); + + next = a + b; + a = b; + b = next; + + delay(); + + // Break before overflow + if (a == 233) { + print_uint8(a); + break; + } + } + + uart_puts_rom("\r\nRestarting...\r\n"); + delay(); + } +} -- cgit v1.3