Страница 1 из 2
Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:12:28
Евгений33
Доброго времени суток. У меня возникла задача, заключающаяся в том что бы в Mega162 включить USART0 и USART1, ну сделать что то вроде сквозного канала. По приходу данных по одной линии они автоматически записывались бы в регистр и сразу отправлялись бы по другой и наоборот. С USARTом раньше не работал и не пойму как организовать так что бы в основном цикле программы отслеживались бы оба приемных регистра и по приходу данных от одного из них автоматически происходила передача на другой. Может ориентироваться по флагам TXC и RXC каждого из UDR?
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:18:23
s_black
А какова исходная задача? Зачем нужен МК?
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:27:49
Евгений33
Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:30:45
s_black
Евгений33 писал(а):Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
Так, а если от "одного устройства" просто кинуть кабель на компьютер - так не проще будет?
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:43:05
Евгений33
Может и было бы проще, только задача поставлена именно так. У меня голова уже заболела от Code Vision.
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:44:26
s_black
Так эта задача по сути - глупость ! Или Вы чего-то не договариваете?
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:53:48
Евгений33
Глупость для тех, кто занимается программированием постоянно. У меня же было на практике решение пары небольших прикладных простеньких задач. Просто здесь не пойму с чего начать.
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 15:59:52
s_black
Я никоим образом не пытаюсь Вас подначить или обидеть, просто МК в таком случае будет выполнять роль куска провода. Ну, если не хотите открыть суть задачи, то вкратце набросаю Вам план действий. В
статье смотрите общий подход к использованию UART. В своей программе сначала настройте оба UART-а. Затем в бесконечном цикле сначала прогоняете функции приёма, за ними - функции передачи (если был приём).
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 16:03:59
Евгений33
s_black писал(а):просто МК в таком случае будет выполнять роль куска провода
Именно так.
Спасибо за помощь, буду стараться.
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 16:06:35
Совесть
Если задача состоит в том что-бы все делать без прерываний - отслеживаете флаги приемников, тело цикла будет состоять из двух if-ов.. Если скорости обоих UART одинаковые, то самым "сложным" будет настройка.
Re: Как запараллелить USART в Mega162.
Добавлено: Чт июн 07, 2012 17:54:11
orinoko
А может сделать ещё проще - в цикле читаем значение пина Rx и транслируем в другой "порт" на пин Тx. И не мучаемся с настройкой уартов.
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 08:43:08
igor-x
что то мне подсказывает что потребуется некая обработка(замена) данных принятых и переданных.
и наверняка подменить нужно некий блок данных . занчит потребуется накопление определенного буфера , а потом уже передача. такие задачи лучше на прерываниях делать - и прием и передачу
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 08:48:22
s_black
Предполагаю, что конструируется даталоггер для RS-232.
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 08:51:36
ploop
Тогда зачем два UART'а? Мы же будем только слушать.
Мне кажется, планируется какое-то учебное задание, где на работоспособность и целесообразность глубоко фиолетово.
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 08:51:47
orinoko
Условия задачи вам должно подсказывать не "что-то", а автор темы

. Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера. А дополнительных данных пока больше не поступало. Так что ждём-с...
Даталоггер лучше делать не так, а подключаться параллельно сигналам. Ну а если это учебная задача, то так бы и сказал. А то туману навёл и не признаётся. А мы тут соревнуется, у кого больше "телепатор"

Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 08:55:27
s_black
orinoko писал(а): Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера.
Задача эта реализуется двумя кусками провода.
А топикстартер шифруется, чтобы не быть "спаленным" своим преподом

Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 09:01:14
orinoko
У автора есть в условиях "использовать МК". Поэтому нужен эмулятор двух кусков провода.
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 09:13:59
igor-x
да вроде прошло время сессий... чо ему шифроваться.
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 09:20:46
ILYAUL
igor-x писал(а):
- для чего нужен такой девайс
Вот Вам вариант:
Я делал такой девайс , который связывал весы с принтером. Весы предавали данные в своём протоколе и со своей скоростью , данные на принтер шли уже в ASCII протоколе со своими прибамбасами и на другой сскорости. Вот контроллер всё это и выполнял.
Re: Как запараллелить USART в Mega162.
Добавлено: Пт июн 08, 2012 10:36:09
Евгений33
igor-x писал(а):да вроде прошло время сессий... чо ему шифроваться.
Вы не правы сессия только начинается, но зачеты у студентов по лабораторным я уже принял.
Может впринципе так, получаем данные из USART1, записываем их в регистр UDR1, далее перемещаем их в регистр UDR0 и посылаем по USART0.
Код: Выделить всё
#include <mega162.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// Get a character from the USART1 Receiver
#pragma used+
char getchar1(void)
{
char status,data;
while (1)
{
while (((status=UCSR1A) & RX_COMPLETE)==0);
data=UDR1;
// if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
};
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-
// ===============
#pragma used+
char getchar0 (void)
{
char status,dat;
while (1)
{
while (((status=UCSR0A) & RX_COMPLETE)==0);
dat=UDR0;
// if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return dat;
};
}
#pragma used-
// Write a character to the USART1 Transmitter
#pragma used+
void putchar0 (char v)
{
while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
UDR0=v;
}
#pragma used-
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
unsigned char data;
unsigned char c;
unsigned char dat;
unsigned char v;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x86;
UBRR0H=0x00;
UBRR0L=0x52;
UCSR1A=0x00;
UCSR1B=0x18;
UCSR1C=0x86;
UBRR1H=0x00;
UBRR1L=0x52;
while (1)
{
if(!(UCSR1A&(1<<RXC)));
{
data= getchar1();
UDR1=UDR0;
putchar0(v);
if(!(UCSR0A&(1<<RXC)));
{
dat= getchar0();
UDR0=UDR1;
putchar1(c);
}
}
};
}