Чт май 31, 2012 13:14:13
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define XTAL 3686400L //Задал частоту
#define baudrate 9600L //Скорость
#define bauddivider (XTAL/(16*baudrate)-1)
unsigned char c[255]; //Создаю функцию, в которой данные UDR переписываются в массив c[] (буфер)
void read ()
{
unsigned char i;
for (i=0;i<255;i++)
{
if (UDR =='\n')
return;
else
while (!(USR&(1<<RXC)));
c[i] = UDR;
}
}
void write (char *t) //создаю функцию, в которой из буфера скидываю в UDR на отправку
{
unsigned char i;
for (i=0;i<255;i++)
{
if (t[i]==0)
return;
else
while (!(USR&(1<<UDRE)));
UDR = t[i];
}
}
ISR (UART_RX_vect)
{
read ();
write(c);
}
int main (void)
{
UCR = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UBRR = bauddivider;
sei();
while (1)
{
}
return 0;
}
Чт май 31, 2012 14:04:07
Чт май 31, 2012 14:48:49
void write (char *t)
{
char С;
for (;;)
{
C = *t;
if (C==0)
break;
else
{
while (!(USR&(1<<UDRE)));
UDR = C;
t++;
};
};
}
Чт май 31, 2012 14:59:10
igor-x писал(а):как то непонятно - зачем write(c); находится в обработке прерывания приема?
может правильно сделать - сначала все принять, выставить признак что прием строки закончен, а потом всю принятую строку передать
Чт май 31, 2012 18:05:25
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define XTAL 3686400L
#define baudrate 9600L
#define bauddivider (XTAL/(16*baudrate)-1)
unsigned char c[255];
unsigned char cnt = 0;
volatile unsigned char ready = 0;
void write (char *t)
{
while ('\0'!=*t)
{
while (!(USR&(1<<UDRE)));
UDR=*t;
++t;
}
}
ISR (UART_RX_vect)
{
c[cnt]=UDR;
if ('\n'=c[cnt])
{
ready = 1;
c[cnt+1]='\0';
}
cnt++;
}
int main (void)
{
UCR = 1<<RXEN|1<<TXEN|1<<RXCIE|0<<TXCIE;
UBRR = bauddivider;
sei();
while (1)
{
if(ready)
{
cli();
cnt=0;
write(c);
ready=0;
sei();
}
}
return 0;
}
Пт июн 01, 2012 05:31:47
Пт июн 01, 2012 13:30:30