Страница 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); 
          }
        }
       };
 
     }