From 586644e26fefdd9792d20987fc19a5540a8398d1 Mon Sep 17 00:00:00 2001 From: servostar Date: Sat, 9 Dec 2023 11:22:31 +0100 Subject: [PATCH] added uart module --- include/bits.h | 4 +++ include/prelude.h | 1 + include/uart.h | 25 ++++++++++++++++++ platformio.ini | 3 ++- src/main.cpp | 3 ++- src/uart.cpp | 49 ++++++++++++++++++++++++++++++++++++ src/uart/uart_read_write.cpp | 21 ++++++++++++++++ src/uart/uart_read_write.h | 13 ++++++++++ 8 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 include/uart.h create mode 100644 src/uart.cpp create mode 100644 src/uart/uart_read_write.cpp create mode 100644 src/uart/uart_read_write.h diff --git a/include/bits.h b/include/bits.h index 83ed524..3853ac8 100644 --- a/include/bits.h +++ b/include/bits.h @@ -13,4 +13,8 @@ #define SET_OUTPUT(port, pin) SET_BIT(port, pin) #define SET_INPUT(port, pin) CLR_BIT(port, pin) +// makes pin 4 of port B a pull up resistor +// example: PULL_UP_RESISTOR(DDRB, PORTB, DDB4) +#define PULL_UP_RESISTOR(port, output, pin) CLR_BIT(port, pin); SET_BIT(output, pin) + #endif //ARDUINO_BITS_H diff --git a/include/prelude.h b/include/prelude.h index 966fed7..88b0281 100644 --- a/include/prelude.h +++ b/include/prelude.h @@ -15,5 +15,6 @@ // custom header files #include "bits.h" #include "interrupt.h" +#include "uart.h" #endif //ARDUINO_PRELUDE_H diff --git a/include/uart.h b/include/uart.h new file mode 100644 index 0000000..450451f --- /dev/null +++ b/include/uart.h @@ -0,0 +1,25 @@ +// +// Created by servostar on 09.12.23. +// + +#ifndef ARDUINO_UART_H +#define ARDUINO_UART_H + +#include "prelude.h" + +#include +#include + +void uart_init(uint16_t baud); + +uint8_t uart_read(); + +void uart_read(uint8_t* buffer, size_t size); + +void uart_write(uint8_t frame); + +void uart_write_bytes(const uint8_t* buffer, size_t bytes); + +void uart_write_string(const char* string); + +#endif //ARDUINO_UART_H diff --git a/platformio.ini b/platformio.ini index 6d54397..c50d16e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -21,4 +21,5 @@ build_src_filter = - - - - + \ No newline at end of file + - + + \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index eb39cf2..d48db58 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,8 @@ extern void loop(); //#include "button_interupt/button.h" //#include "trafficlight/trafficlight.h" //#include "summer/summer.h" -#include "summer_controlled/summer.h" +//#include "summer_controlled/summer.h" +#include "uart/uart_read_write.h" int main() { init(); diff --git a/src/uart.cpp b/src/uart.cpp new file mode 100644 index 0000000..1bf8aac --- /dev/null +++ b/src/uart.cpp @@ -0,0 +1,49 @@ +// +// Created by servostar on 09.12.23. +// + +#include "uart.h" + +void uart_init(uint16_t baud) { + uint16_t ubrr = F_CPU / 16 / baud - 1; + + UBRR0H = (uint8_t) (ubrr >> 8); + UBRR0L = (uint8_t) (ubrr & 0xFF); + + UCSR0B |= (1 << RXEN0) | (1 << TXEN0); // enable receiver and transmitter + UCSR0C |= (1 << UCSZ01) | (3 << UCSZ00); // set frame: 8 bit + UCSR0C &= ~(1 << USBS0); // 1 stop bit + + UCSR0B |= (1 << RXCIE0); // enable receiver interrupt +} + +void uart_write(uint8_t frame) { + // wait until TX is free + while (!(UCSR0A & (1 << UDRE0))); + // write data + UDR0 = frame; +} + +uint8_t uart_read() { + // wait until RX is free + while (!(UCSR0A & (1 << RXC0))); + // read data + return UDR0; +} + +void uart_read_bytes(uint8_t* buffer, size_t size) { + for (size_t i = 0; i < size; i++) { + buffer[i] = uart_read(); + } +} + +void uart_write_bytes(uint8_t* buffer, size_t bytes) { + for (size_t i = 0; i < bytes; i++) { + uart_write(buffer[i]); + } +} + +void uart_write_string(const char* string) { + while(*string) + uart_write(*string++); +} \ No newline at end of file diff --git a/src/uart/uart_read_write.cpp b/src/uart/uart_read_write.cpp new file mode 100644 index 0000000..f92d38c --- /dev/null +++ b/src/uart/uart_read_write.cpp @@ -0,0 +1,21 @@ +// +// Created by servostar on 09.12.23. +// + +#include "uart_read_write.h" + +#include "uart.h" + +#define BAUD 9600 + +ISR (USART_RX_vect) +{ + uart_write_string("Hello, World!\n"); +} + +void init() { + uart_init(BAUD); +} + +void loop() { +} \ No newline at end of file diff --git a/src/uart/uart_read_write.h b/src/uart/uart_read_write.h new file mode 100644 index 0000000..dda98e2 --- /dev/null +++ b/src/uart/uart_read_write.h @@ -0,0 +1,13 @@ +// +// Created by servostar on 09.12.23. +// + +#ifndef ARDUINO_UART_READ_WRITE_H +#define ARDUINO_UART_READ_WRITE_H + +#include "prelude.h" + +void init(); +void loop(); + +#endif // ARDUINO_UART_READ_WRITE_H