Код: Выделить всё
int main(void)
{
uart_init();
USART_Init(11);
sei();
while(1)
{
uart_transmit(USART_Receive());
if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
}
}
а вот так все супер
Код: Выделить всё
int main(void)
{
uart_init();
USART_Init(11);
uart_transmit(USART_Receive());
sei();
while(1)
{
if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
}
} и еще есть глюк. Омен в обе стороны начнется только после того как я на родной юарт пошлю любой байт.
весь кодик, ниже протеус и проект студия
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>//Библиотека прерываний
#define F_CPU 4000000UL //12MGz выстовляем частоту проца 12мгц
#include <util/delay.h> // Библиотека работы с паузами в программе ("Delay")
#define Read 1
#define Write 2
#define Full 3
#define Null 4
volatile struct{
char u_buffer_rx;
char u_buffer_tx;
char u_status;
char u_bit_cnt;
}glob;
void uart_init(void);
void uart_transmit(char data);
unsigned char USART_Receive( void ); //Функция приема данных по протоколу USART
void USART_Transmit( unsigned char data ); //Функция передачи данных по протоколу USART
//**************************************************************************
void uart_init(void)
{
DDRD = (1<<DDD4)|(1<<DDD1);
PORTD |= (1<<PD4);
PORTD |= (0<<PD2);
TCCR0B = 1; // Клок выбираем
MCUCR = (1<<ISC01); // Устанавливаем прерывание по спаду Int0
EIFR = (1<<INTF0); // Сброс флага прерывания по Int0
GIMSK = (1<<INT0); // Включаем прерывания по входу Rx(Int0)
glob.u_status = Null; // Обнуляем переменные
glob.u_buffer_rx = 0; // Обнуляем переменные
glob.u_buffer_tx = 0; // Обнуляем переменные
}
//**************************************************************************
ISR(INT0_vect) //Сработало прерывание по стартовому биту
{
TCNT0 = 60; //начальное значение таймера-счетчика 9600 = 120
TIFR = (1<<TOV0); // Сбрасываем флаг переполнения таймера
TIMSK = (1<<TOIE0); //разрешение на прерывание по переполнению таймера 0
GIMSK &= ~(1<<INT0); // Отключаем прерывания по входу Rx
glob.u_bit_cnt = 0; // Обнуляем переменные
glob.u_buffer_rx = 0; // Обнуляем переменные
glob.u_status = Read;// Указываю что мы сейчас ведем чтение с ноги Rx
}
//**************************************************************************
ISR(TIMER0_OVF_vect)
{
TCNT0 = 85; //Загружаем новое значение в счетчик 9600 = 170;
if(glob.u_status == Write) // Начинаем передавать
{
if(glob.u_bit_cnt<=7)
{
if(glob.u_buffer_tx&0x01){PORTD |= (1<<PD4);} else {PORTD &= (~(1<<PD4));}
glob.u_buffer_tx =glob.u_buffer_tx>>1;
}
if(glob.u_bit_cnt == 8){PORTD |= (1<<PD4);}
if(glob.u_bit_cnt == 9){EIFR = (1<<INTF0); GIMSK = (1<<INT0); TIFR = (1<<TOV0);
TIMSK &= ~(1<<TOIE0); glob.u_status = Null;}
}
//--------------------------------------------------------------------------
if(glob.u_status == Read) // Начинаем читать
{
if(glob.u_bit_cnt <= 7)
{
glob.u_buffer_rx = (glob.u_buffer_rx>>1);
if(PIND & (1<<PD2)){glob.u_buffer_rx |=0x80;}
}
if(glob.u_bit_cnt == 7)
{
glob.u_status = Full; // Указываем что буфер полон и чтение закончено
TIFR = (1<<TOV0); // Сбрасываем флаг переполнения таймера
TIMSK &= ~(1<<TOIE0); // Запрещаю прерывание по переполнению таймера
EIFR = (1<<INTF0); // Сброс флага прерывания по Int0
GIMSK = (1<<INT0); // Включаем прерывания по входу Rx(Int0)
}
}
glob.u_bit_cnt++; // Увеличиваем счетчик битов
}
//**************************************************************************
void uart_transmit(char data)
{
glob.u_status = Write; // Указываю что мы сейчас ведем запись на ногу Тx
GIMSK &= ~(1<<INT0); // Отключаем прерывания по входу Rx
glob.u_bit_cnt = 0;
glob.u_buffer_tx = data;
TCNT0 = 85; //Загружаем новое значение в счетчик 9600 = 170
TIFR = (1<<TOV0); // Сбрасываем флаг переполнения таймера
TIMSK = (1<<TOIE0); // Разрешаю прерывание по переполнению таймера 0
PORTD &= ~(1<<PD4); // Выдаю стартовый бит
}
//**************************************************************************
void USART_Init( unsigned int baudrate ) //Функция инициализации USART
{
UBRRH = (unsigned char)(baudrate>>8);
UBRRL = (unsigned char)baudrate;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRB &= ~(1<<TXCIE);
UCSRB &= ~(1<<UDRIE);
UCSRC &= ~(1<<UMSEL);
UCSRC &= ~(1<<UPM1);
UCSRC &= ~(1<<UPM0);
UCSRC &= ~(1<<USBS);
/* USART_Transmit('-');
USART_Transmit('T');
USART_Transmit('E');
USART_Transmit('S');
USART_Transmit('T');
USART_Transmit('-');
USART_Transmit(0x00);*/
}
//**************************************************************************
unsigned char USART_Receive( void ) //Функция приема данных
{
while (!(UCSRA & (1<<RXC))); //Ожидание приема символа
return UDR; //Возврат содержимого буфера приема символа
}
//**************************************************************************
void USART_Transmit( unsigned char data ) //Функция отправки данных
{
while (!(UCSRA & (1<<UDRE))); //Ожидание опустошения буфера приема
UDR = data; //Начало передачи данных
}
//**************************************************************************
int main(void)
{
uart_init();
USART_Init(11);
uart_transmit(USART_Receive()); //glob.u_status = Null; glob.u_buffer = 0;
sei();
while(1)
{
if(glob.u_status == Full){USART_Transmit(glob.u_buffer_rx); glob.u_status = Null; glob.u_buffer_rx = 0;}
}
}