61 lines
2.3 KiB
C
61 lines
2.3 KiB
C
#include <avr/io.h>
|
||
#include <util/delay.h>
|
||
#include <avr/interrupt.h>
|
||
|
||
#include "utils.h"
|
||
#include "bitmanip.h"
|
||
|
||
// USART
|
||
// Table 20-1 : Baud Rate Calculation
|
||
#define USART_BAUDRATE 115200
|
||
#define BAUD_PRESCALER (DIV_ROUND_CLOSEST(F_CPU, (16 * USART_BAUDRATE)) - 1)
|
||
// Table 20-8 : Mode Selection (USART Mode SELect)
|
||
#define ASYNCHRONOUS (0<<UMSEL01 | 0<<UMSEL00)
|
||
#define SYNCHRONOUS (0<<UMSEL01 | 1<<UMSEL00)
|
||
// Table 20-9 : Parity Bit Selection (USART Parity Mode)
|
||
#define PARITY_DISABLED (0<<UPM01 | 0<<UPM00)
|
||
#define PARITY_EVEN (1<<UPM01 | 0<<UPM00)
|
||
#define PARITY_ODD (1<<UPM01 | 1<<UPM00)
|
||
// Table 20-10 : Stop Bit Selection (USART Stop Bit Select)
|
||
#define STOP_ONE_BIT (0<<USBS0)
|
||
#define STOP_TWO_BIT (1<<USBS0)
|
||
// Table 20-11 : Data Bit Selection (USART Character SiZe)
|
||
#define DATA_FIVE_BIT (0<<UCSZ02 | 0<<UCSZ01 | 0<<UCSZ00)
|
||
#define DATA_SIX_BIT (0<<UCSZ02 | 0<<UCSZ01 | 1<<UCSZ00)
|
||
#define DATA_SEVEN_BIT (0<<UCSZ02 | 1<<UCSZ01 | 0<<UCSZ00)
|
||
#define DATA_EIGHT_BIT (0<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||
#define DATA_NINE_BIT (1<<UCSZ02 | 1<<UCSZ01 | 1<<UCSZ00)
|
||
// 20.11.3 : USART Control and Status Register B (UCSRnB)
|
||
#define RECEIVER_DISABLED (0<<RXEN0)
|
||
#define RECEIVER_ENABLED (1<<RXEN0)
|
||
#define TRANSMITTER_DISABLED (0<<TXEN0)
|
||
#define TRANSMITTER_ENABLED (1<<TXEN0)
|
||
|
||
// END MACROS
|
||
|
||
// 20.4 Frame Formats : 8N1 : 8 data bits, no parity, 1 stop bit
|
||
// 20.5 USART Initialization : (1) setting baud rate, (2) setting frame format, (3) enabling the Transmitter or the Receiver
|
||
void uart_init() {
|
||
UBRR0H = (unsigned char) (BAUD_PRESCALER >> 8); // 20.11.5 : UBRRnL and UBRRnH – USART Baud Rate Registers
|
||
UBRR0L = (unsigned char) BAUD_PRESCALER;
|
||
|
||
UCSR0C |= ASYNCHRONOUS | PARITY_DISABLED | STOP_ONE_BIT | DATA_EIGHT_BIT; // 20.11.4 : set Frame Format
|
||
|
||
UCSR0B |= RECEIVER_DISABLED | TRANSMITTER_ENABLED; // 20.11.3 : enable Receiver and/or Transmitter
|
||
}
|
||
|
||
void uart_tx(char c) {
|
||
while (TEST(UCSR0A, UDRE0) == 0); // 20.11.2 : do nothing until UDR emission buffer is empty, if UDREn flag is 1, UCSRnA register is empty
|
||
UDR0 = (unsigned char) c; // 20.11.1 : Put data into buffer, UDRn – USART I/O Data Register (read and write)
|
||
}
|
||
|
||
// write Z on serial port, at a 1Hz frequency
|
||
// `screen /dev/ttyUSB0 115200`
|
||
int main() {
|
||
uart_init();
|
||
while (1) {
|
||
uart_tx('Z');
|
||
_delay_ms(1000);
|
||
}
|
||
}
|