Relay_and_Socket_Protection/src/usart/usart.c
2024-08-29 14:06:38 -07:00

81 lines
1.8 KiB
C

/*
* Author: username
* Date: 2024
* filename: usart.c
* description: module_purpose
*/
#ifndef __AVR_ATtiny404__
#define __AVR_ATtiny404__
#endif
#include "usart.h"
#include <avr/io.h>
#include <string.h>
// These are technically correct, but the libc requires F_CPU for delay stuff
// that doesn't match the actual F_CPU because it uses the value after the
// clock is divided.
// #define F_CPU 3333333UL
// #define F_PER F_CPU / 6
#define F_PER 3333333UL
#define USART0_BAUD_RATE(BAUD_RATE) \
((float)(F_PER * 64 / (16 * (float)BAUD_RATE)) + 0.5)
// RX PIN6, TX PIN7
// ALT: RX PIN12 TX PIN11
void USART0_Init(void) {
// Config TxD as output, and rx as input?
PORTB.DIR &= ~(1 << 3);
PORTB.DIR |= (1 << 2);
// It says to set the TX pin high?
// PORTB.OUT |= (1<<2);
// set buad rate.
USART0.BAUD = (uint16_t)USART0_BAUD_RATE(9600);
// USART0.BAUD = 1388;
// set the frame format.
USART0.CTRLC = 0x3; // setting 8-bit mode.
// Enable transmitter and receiver (USARTn.CTRLB)
// USART0.CTRLB |= (1<<7)|(1<<6);
USART0.CTRLB |= USART_TXEN_bm;
}
void USART0_Alt_Init(void) {
// setup Alternate pints on PA1 and PA2
PORTMUX.CTRLB |= PORTMUX_USART0_ALTERNATE_gc;
PORTA.DIR |= (1 << 1);
PORTA.DIR &= ~(1 << 2);
// It says to set the TX pin high?
// PORTA.OUT |= (1<<11);
// set buad rate.
USART0.BAUD = (uint16_t)USART0_BAUD_RATE(9600);
// set the frame format.
USART0.CTRLC = 0x3; // setting 8-bit mode.
// Enable transmitter and receiver (USARTn.CTRLB)
// USART0.CTRLB |= (1<<7)|(1<<6);
USART0.CTRLB |= USART_TXEN_bm;
}
void USART0_sendChar(char c) {
while (!(USART0.STATUS & USART_DREIF_bm)) {
;
}
USART0.TXDATAL = c;
USART0.TXDATAH = c;
}
void USART0_sendString(char *str) {
for (size_t i = 0; i < strlen(str); i++) {
USART0_sendChar(str[i]);
}
}