Compare commits
1
Commits
uart
..
ring-buffer
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f050f78c5 |
@@ -1,68 +0,0 @@
|
|||||||
#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);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#ifndef UART_H
|
|
||||||
#define UART_H
|
|
||||||
|
|
||||||
inline void uart_initialize(void);
|
|
||||||
void UART_Transmit(struct rb* _rb);
|
|
||||||
struct rb* get_rb_receive(void);
|
|
||||||
struct rb* get_rb_transmit(void);
|
|
||||||
|
|
||||||
#endif /*UART_H*/
|
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
#include "device_ring_buffer.h"
|
||||||
|
|
||||||
|
void rb_initialize(struct rb* _rb)
|
||||||
|
{
|
||||||
|
memset(_rb, 0, sizeof(struct rb));
|
||||||
|
}
|
||||||
|
|
||||||
|
int rb_put(struct rb* _rb, char element)
|
||||||
|
{
|
||||||
|
if (_rb->count < sizeof(_rb->buf))
|
||||||
|
{
|
||||||
|
_rb->count++;
|
||||||
|
if (_rb->tail != _rb->head)
|
||||||
|
{
|
||||||
|
_rb->buf[_rb->tail] = element;
|
||||||
|
_rb->tail++;
|
||||||
|
if (_rb->tail == sizeof(_rb->buf))
|
||||||
|
{
|
||||||
|
_rb->tail = 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int rb_get(struct rb* _rb, char *element)
|
||||||
|
{
|
||||||
|
if (_rb->count > 0)
|
||||||
|
{
|
||||||
|
_rb->count--;
|
||||||
|
if (_rb->tail != _rb->head)
|
||||||
|
{
|
||||||
|
*element = _rb->buf[_rb->head];
|
||||||
|
_rb->head++;
|
||||||
|
if (_rb->head == sizeof(_rb->buf))
|
||||||
|
{
|
||||||
|
_rb->head = 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
int count_elements(struct rb* _rb)
|
||||||
|
{
|
||||||
|
return _rb->count;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef DEVICE_RING_BUFFER_H
|
||||||
|
#define DEVICE_RING_BUFFER_H
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
struct rb {
|
||||||
|
char buf[32];
|
||||||
|
int head;
|
||||||
|
int tail;
|
||||||
|
int count;
|
||||||
|
};
|
||||||
|
|
||||||
|
void rb_initialize(struct rb* _rb);
|
||||||
|
int rb_put(struct rb* _rb, char element);
|
||||||
|
int rb_get(struct rb* _rb, char* element);
|
||||||
|
int count_elements(struct rb* _rb);
|
||||||
|
|
||||||
|
#endif /*DEVICE_RING_BUFFER_H*/
|
||||||
Reference in New Issue
Block a user