Имеется код для UART, где Rx и Tx на разных ножках и передача с приемом идут независимо друг от друга. Нужно переделать, чтобы все было на одной ножке, например PB0.
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#define TXPORT PORTB
#define RXPORT PINB
#define TXDDR DDRB
#define RXDDR DDRB
#define TXD 0
#define RXD 1
#define T_DIV 0x02
#define BAUD_DIV 0x7D
volatile uint16_t txbyte;
volatile uint8_t rxbyte;
volatile uint8_t txbitcount;
volatile uint8_t rxbitcount;
void uart_init();
void uart_send(uint8_t tb);
int16_t uart_recieve(uint8_t* rb);
ISR(TIM0_COMPA_vect)
{
TXPORT = (TXPORT & ~(1 << TXD)) | ((txbyte & 0x01) << TXD);
txbyte = (txbyte >> 0x01) + 0x8000;
if(txbitcount > 0)
{
txbitcount--;
}
}
ISR(TIM0_COMPB_vect)
{
if(RXPORT & (1 << RXD))
rxbyte |= 0x80;
if(--rxbitcount == 0)
{
TIMSK0 &= ~(1 << OCIE0B);
TIFR0 |= (1 << OCF0B);
GIFR |= (1 << INTF0);
GIMSK |= (1 << INT0);
}
else
{
rxbyte >>= 0x01;
}
}
ISR(INT0_vect)
{
rxbitcount = 0x09;
rxbyte = 0x00;
if(TCNT0 < (BAUD_DIV / 2))
{
OCR0B = TCNT0 + (BAUD_DIV / 2);
}
else
{
OCR0B = TCNT0 - (BAUD_DIV / 2);
}
GIMSK &= ~(1 << INT0);
TIFR0 |= (1 << OCF0A) | (1 << OCF0B);
TIMSK0 |= (1 << OCIE0B);
}
void uart_send(uint8_t tb)
{
while(txbitcount);
txbyte = (tb + 0xFF00) << 0x01;
txbitcount = 0x0A;
}
int16_t uart_recieve(uint8_t* rb)
{
if(rxbitcount < 0x09)
{
while(rxbitcount);
*rb = rxbyte;
rxbitcount = 0x09;
return (*rb);
}
else
{
return (-1);
}
}
void uart_init()
{
txbyte = 0xFFFF;
rxbyte = 0x00;
txbitcount = 0x00;
rxbitcount = 0x09;
TXDDR |= (1 << TXD);
RXDDR &= ~(1 << RXD);
TXPORT |= (1 << TXD);
RXPORT |= (1 << RXD);
OCR0A = BAUD_DIV;
TIMSK0 |= (1 << OCIE0A);
TCCR0A |= (1 << WGM01);
TCCR0B |= T_DIV;
MCUCR |= (1 << ISC01);
GIMSK |= (1 << INT0);
sei();
}
int main(void)
{
uint8_t b = 0;
uart_init();
while (1)
{
if(uart_recieve(&b) >= 0)
uart_send(b);
}
return (0);
}