Как запараллелить USART в Mega162.

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

Доброго времени суток. У меня возникла задача, заключающаяся в том что бы в Mega162 включить USART0 и USART1, ну сделать что то вроде сквозного канала. По приходу данных по одной линии они автоматически записывались бы в регистр и сразу отправлялись бы по другой и наоборот. С USARTом раньше не работал и не пойму как организовать так что бы в основном цикле программы отслеживались бы оба приемных регистра и по приходу данных от одного из них автоматически происходила передача на другой. Может ориентироваться по флагам TXC и RXC каждого из UDR?
.....
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

А какова исходная задача? Зачем нужен МК?
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
.....
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

Евгений33 писал(а):Задача состоит в том что бы принимать от одного устройства пакет данных 8 бит+стоп бит и посылать их в компьютер и обратно, на фиксированной скорости. Думаю можно было бы обойтись и без него, но требуется что бы было именно так.
Так, а если от "одного устройства" просто кинуть кабель на компьютер - так не проще будет?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

Может и было бы проще, только задача поставлена именно так. У меня голова уже заболела от Code Vision.
.....
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

Так эта задача по сути - глупость ! Или Вы чего-то не договариваете?
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

Глупость для тех, кто занимается программированием постоянно. У меня же было на практике решение пары небольших прикладных простеньких задач. Просто здесь не пойму с чего начать.
.....
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

Я никоим образом не пытаюсь Вас подначить или обидеть, просто МК в таком случае будет выполнять роль куска провода. Ну, если не хотите открыть суть задачи, то вкратце набросаю Вам план действий. В статье смотрите общий подход к использованию UART. В своей программе сначала настройте оба UART-а. Затем в бесконечном цикле сначала прогоняете функции приёма, за ними - функции передачи (если был приём).
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений33 »

s_black писал(а):просто МК в таком случае будет выполнять роль куска провода
Именно так.

Спасибо за помощь, буду стараться.
.....
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Сообщение Совесть »

Если задача состоит в том что-бы все делать без прерываний - отслеживаете флаги приемников, тело цикла будет состоять из двух if-ов.. Если скорости обоих UART одинаковые, то самым "сложным" будет настройка.
orinoko

Сообщение orinoko »

А может сделать ещё проще - в цикле читаем значение пина Rx и транслируем в другой "порт" на пин Тx. И не мучаемся с настройкой уартов.
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

что то мне подсказывает что потребуется некая обработка(замена) данных принятых и переданных.
и наверняка подменить нужно некий блок данных . занчит потребуется накопление определенного буфера , а потом уже передача. такие задачи лучше на прерываниях делать - и прием и передачу
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

Предполагаю, что конструируется даталоггер для RS-232.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Тогда зачем два UART'а? Мы же будем только слушать.

Мне кажется, планируется какое-то учебное задание, где на работоспособность и целесообразность глубоко фиолетово.
orinoko

Сообщение orinoko »

Условия задачи вам должно подсказывать не "что-то", а автор темы :) . Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера. А дополнительных данных пока больше не поступало. Так что ждём-с...
Даталоггер лучше делать не так, а подключаться параллельно сигналам. Ну а если это учебная задача, то так бы и сказал. А то туману навёл и не признаётся. А мы тут соревнуется, у кого больше "телепатор" :)
Последний раз редактировалось orinoko Пт июн 08, 2012 08:57:44, всего редактировалось 1 раз.
Мучитель микросхем
Аватара пользователя
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория

Сообщение s_black »

orinoko писал(а): Задача в том виде, как хочет автор, реализуется, как я выше написал, программой из 5-6 команд ассемблера.
Задача эта реализуется двумя кусками провода.
А топикстартер шифруется, чтобы не быть "спаленным" своим преподом :)
Контактная информация:
orinoko

Сообщение orinoko »

У автора есть в условиях "использовать МК". Поэтому нужен эмулятор двух кусков провода.
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

да вроде прошло время сессий... чо ему шифроваться.
а пока автор думает ,предлагаю устроить угадайку(у кого больше "телепатор") - для чего нужен такой девайс
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

igor-x писал(а): - для чего нужен такой девайс
Вот Вам вариант:
Я делал такой девайс , который связывал весы с принтером. Весы предавали данные в своём протоколе и со своей скоростью , данные на принтер шли уже в ASCII протоколе со своими прибамбасами и на другой сскорости. Вот контроллер всё это и выполнял.
Встал на лапы
Аватара пользователя
Сообщения: 85
Зарегистрирован: Пн ноя 08, 2010 14:07:14
Откуда: Владимирская область

Сообщение Евгений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); 
          }
        }
       };
 
     }
.....
Ответить

Вернуться в «AVR»