diff options
| author | Vaino Kauppila <vaino@vke.fi> | 2026-04-19 12:32:58 +0300 |
|---|---|---|
| committer | Vaino Kauppila <vaino@vke.fi> | 2026-04-19 12:32:58 +0300 |
| commit | eb8643ddbef43547eb7bfe58789a3908926c7258 (patch) | |
| tree | fadfba88a1c71b266b8c67df166a3a6ead6b30d1 /fw/fib.c | |
| parent | 129a1c975dbd0c042576010b1f6eb40d19fc5733 (diff) | |
| download | vhdl_pic-eb8643ddbef43547eb7bfe58789a3908926c7258.tar.gz vhdl_pic-eb8643ddbef43547eb7bfe58789a3908926c7258.zip | |
refactor dir structure, add fib.c
Diffstat (limited to 'fw/fib.c')
| -rw-r--r-- | fw/fib.c | 84 |
1 files changed, 84 insertions, 0 deletions
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 <pic16f84a.h> + +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(); + } +} |
