#include "UART.h"
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void UART::Init(uint16_t ubrr)
{
UCSR0A = (1<<U2X0);//Raddoppio la velocita di trasmissione
UCSR0B = (1<<RXEN0) | (1<<TXEN0); //Abilito il pin di ricezione e il pin di trasmissione
UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);//Imposto a 8 la lunghezza in bit di un carattere
UBRR0H = ubrr >> 8;
UBRR0L = ubrr;
UART::RxInterruptEnabled();//Abilito l'interrupt per la ricezione di un byte
UART::TxInterruptEnabled();//Abilito l'interrupt per la conclusione di invio di un byte
}
void UART::RxInterruptEnabled()
{
UCSR0B |= (1 << RXCIE0);
}
void UART::RxInterruptDisabled()
{
UCSR0B &= ~(1 << RXCIE0);
}
void UART::TxInterruptEnabled()
{
UCSR0B |= (1 << TXCIE0);
}
void UART::TxInterruptDisabled()
{
UCSR0B &= ~(1 << TXCIE0);
}
void UART::Tx(uint8_t data)
{
UART::TxInterruptDisabled();//Disabilito l'interrupt legato alla fine dell'ivio di un byte
UART::txBuffer[UART::txBufferIndex] = data;//Posiziono un byte nel buffer
UART::txBufferIndex++;
UART::TxInterruptEnabled();
UART::ManagementTxBuffer();
}
void UART::Tx(uint16_t data)
{
UART::Tx((uint8_t*) &data, 2);
}
void UART::Tx(uint32_t data)
{
UART::Tx((uint8_t*) &data, 4);
}
void UART::Tx(char* s)
{
while(*s != '\0')
{
UART::Tx((uint8_t) *s);
s++;
}
}
void UART::Tx(uint8_t* punt, int n)
{
if(n > 0)
{
UART::Tx(*punt);
UART::Tx(punt++, n--);
}
}
uint8_t UART::RxAvailable()
{
return UART::rxBufferIndex;//Restituisco il numero di byte nel buffer di ricezione
}
void UART::ManagementRxBuffer()
{
uint8_t waste;//Alloco un byte in caso dovessi eliminare dei dati
if(UART::rxBufferIndex < UARTRxBufferSize)//Verifico che il buffer non sia pieno
{
UART::rxBuffer[UART::rxBufferIndex] = UDR0;//Posiziono il dato nel buffer
UART::rxBufferIndex++;//Aumento di uno l'indice che indica il primo elemento disponibile
}
else
{
waste = UDR0;//Scarto il valore in arrivo
}
}
void UART::ManagementTxBuffer()
{
uint8_t data;//Alloco un byte di memoria per il dato da trasmettere
if(UART::txBufferIndex != 0)//Verifico che nel buffer di trasmissione vi siano dei dati
{
data = UART::rxBuffer[0];//Salvo il dato da trasmettere
for(uint8_t i = 1; i < UART::rxBufferIndex; i++)//Creo un ciclo per spostare di una posizione indietro i dati nel buffer di trasmissione
{
UART::rxBuffer[i-1] = UART::rxBuffer[i];//Sposto il dato corrente indietro di uno nel buffer
}
UART::txBufferIndex--;//Decremento la posizione del primo byte disponibile nel buffer di trasmissione
while(!(UCSR0A & (1 << UDRE0)));//Attendo che il buffer sia vuoto
UDR0 = data;//Inserisco il valore ad 8 bit nel buffer di trasmissione
}
}
ISR(USART_RX_vect) { UART::ManagementRxBuffer(); }
ISR(USART_TX_vect) { UART::ManagementTxBuffer(); }