Как запараллелить USART в Mega162.
Доброго времени суток. У меня возникла задача, заключающаяся в том что бы в Mega162 включить USART0 и USART1, ну сделать что то вроде сквозного канала. По приходу данных по одной линии они автоматически записывались бы в регистр и сразу отправлялись бы по другой и наоборот. С USARTом раньше не работал и не пойму как организовать так что бы в основном цикле программы отслеживались бы оба приемных регистра и по приходу данных от одного из них автоматически происходила передача на другой. Может ориентироваться по флагам TXC и RXC каждого из UDR?
.....
- Реклама
А какова исходная задача? Зачем нужен МК?
Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
.....
Так, а если от "одного устройства" просто кинуть кабель на компьютер - так не проще будет?Евгений33 писал(а):Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
Может и было бы проще, только задача поставлена именно так. У меня голова уже заболела от Code Vision.
.....
- Реклама
Так эта задача по сути - глупость ! Или Вы чего-то не договариваете?
Глупость для тех, кто занимается программированием постоянно. У меня же было на практике решение пары небольших прикладных простеньких задач. Просто здесь не пойму с чего начать.
.....
Я никоим образом не пытаюсь Вас подначить или обидеть, просто МК в таком случае будет выполнять роль куска провода. Ну, если не хотите открыть суть задачи, то вкратце набросаю Вам план действий. В статье смотрите общий подход к использованию UART. В своей программе сначала настройте оба UART-а. Затем в бесконечном цикле сначала прогоняете функции приёма, за ними - функции передачи (если был приём).
Именно так.s_black писал(а):просто МК в таком случае будет выполнять роль куска провода
Спасибо за помощь, буду стараться.
.....
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
Если задача состоит в том что-бы все делать без прерываний - отслеживаете флаги приемников, тело цикла будет состоять из двух if-ов.. Если скорости обоих UART одинаковые, то самым "сложным" будет настройка.
А может сделать ещё проще - в цикле читаем значение пина Rx и транслируем в другой "порт" на пин Тx. И не мучаемся с настройкой уартов.
- Сообщения: 1817
- Зарегистрирован: Пн ноя 29, 2010 15:58:43
что то мне подсказывает что потребуется некая обработка(замена) данных принятых и переданных.
и наверняка подменить нужно некий блок данных . занчит потребуется накопление определенного буфера , а потом уже передача. такие задачи лучше на прерываниях делать - и прием и передачу
и наверняка подменить нужно некий блок данных . занчит потребуется накопление определенного буфера , а потом уже передача. такие задачи лучше на прерываниях делать - и прием и передачу
Предполагаю, что конструируется даталоггер для RS-232.
Тогда зачем два UART'а? Мы же будем только слушать.
Мне кажется, планируется какое-то учебное задание, где на работоспособность и целесообразность глубоко фиолетово.
Мне кажется, планируется какое-то учебное задание, где на работоспособность и целесообразность глубоко фиолетово.
Условия задачи вам должно подсказывать не "что-то", а автор темы
. Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера. А дополнительных данных пока больше не поступало. Так что ждём-с...
Даталоггер лучше делать не так, а подключаться параллельно сигналам. Ну а если это учебная задача, то так бы и сказал. А то туману навёл и не признаётся. А мы тут соревнуется, у кого больше "телепатор"
Даталоггер лучше делать не так, а подключаться параллельно сигналам. Ну а если это учебная задача, то так бы и сказал. А то туману навёл и не признаётся. А мы тут соревнуется, у кого больше "телепатор"
Последний раз редактировалось orinoko Пт июн 08, 2012 08:57:44, всего редактировалось 1 раз.
Задача эта реализуется двумя кусками провода.orinoko писал(а): Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера.
А топикстартер шифруется, чтобы не быть "спаленным" своим преподом
У автора есть в условиях "использовать МК". Поэтому нужен эмулятор двух кусков провода.
- Сообщения: 1817
- Зарегистрирован: Пн ноя 29, 2010 15:58:43
да вроде прошло время сессий... чо ему шифроваться.
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс
Вот Вам вариант:igor-x писал(а): - для чего нужен такой девайс
Я делал такой девайс , который связывал весы с принтером. Весы предавали данные в своём протоколе и со своей скоростью , данные на принтер шли уже в ASCII протоколе со своими прибамбасами и на другой сскорости. Вот контроллер всё это и выполнял.
Вы не правы сессия только начинается, но зачеты у студентов по лабораторным я уже принял.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);
}
}
};
}.....


