Modbus_1_Deva4ki/UART.c

68 lines
1.6 KiB
C

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "device_ring_buffer.h"
#include "UART.h"
#define F_CPU 16000000
#define CONF_UART_BAUD 300
#define BAUD CONF_UART_BAUD
struct rb ring_buff_receive;
struct rb ring_buff_transmit;
inline void uart_initialize(void)
{
UCSR0B=0;
UCSR0C=0;
UCSR0B =(1<<RXEN0)|(1<<TXEN0); // Включаем приём и передачу по UART
UCSR0B |= (0<<UDRIE0); // Разрешаем или нет прерывание при очистке регистра данных
UCSR0B |= (0<<TXCIE0); // Разрешаем или нет прерывание при завершении передачи
UCSR0B |= (1<<RXCIE0); // Разрешаем или нет прерывание при приёме
UCSR0C = (1<<USBS0) | (3<<UCSZ00);
sei();
}
ISR(UART_RXC_vect)
{
register unsigned char received_data = UDR0;// Забираем принятые данные
rb_put(&ring_buff_receive, received_data);
}
// Функция отправки байта
void UART_Transmit(struct rb* _rb)
{
if (_rb->count > 0)
{
if (UCSR0A & (1 << UDRE0))
{
char data;
rb_get(&ring_buff_transmit, &data);
UDR0 = data;
}
}
}
struct rb* get_rb_receive(void)
{
return &ring_buff_receive;
}
struct rb* get_rb_transmit(void)
{
return &ring_buff_transmit;
}
/*int main(void) {
sei();
uart_initialize();
DDRD = 0xFF;
uint8_t buff[] = {0x48, 0x45, 0x4C, 0x4C, 0x4F, 0x21, 0x09};
UART_Transmit(buff);
while (1) {
UART_Transmit(buff);
}
}*/