реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> софтовый уарт, без использования таймера
Zelepuk
сообщение Sep 14 2011, 11:13
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



нужно организовать дополнительный уарт в устройстве на МСП430, где заняты все аппаратные уарт. В сети есть примеры с использованием аппаратного таймера, но таймер тоже задействован. Таким образом, остаются два варианта:
1) совтовый на GPIO
2) мост SPI->UART

что лучше применить?
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 14 2011, 12:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Zelepuk @ Sep 14 2011, 16:13) *
нужно организовать дополнительный уарт в устройстве на МСП430, где заняты все аппаратные уарт. В сети есть примеры с использованием аппаратного таймера, но таймер тоже задействован. Таким образом, остаются два варианта:
1) совтовый на GPIO
В этом случае таймер все равно понадобится.
Цитата(Zelepuk @ Sep 14 2011, 16:13) *
2) мост SPI->UART
А потребление для вас рояли не играет? Или где вы такой нашли малопотребляющий мост?
Цитата(Zelepuk @ Sep 14 2011, 16:13) *
что лучше применить?
Взять другой кристалл с требуемым кол-вом UART.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Sep 14 2011, 13:32
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(rezident @ Sep 14 2011, 16:43) *
А потребление для вас рояли не играет? Или где вы такой нашли малопотребляющий мост?


http://www.gaw.ru/html.cgi/txt/ic/Maxim/in...RTs/max3100.htm

150 mkA - это много?

а ещё наверное можно доп. микроконтроллер взять и, связав его по SPI с основным, передавать через его UART данные.

Сообщение отредактировал Zelepuk - Sep 14 2011, 13:36
Go to the top of the page
 
+Quote Post
rezident
сообщение Sep 14 2011, 20:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Zelepuk @ Sep 14 2011, 18:32) *
150 mkA - это много?
Откуда же я знаю, много это для вас или мало? Если у вас, допустим, в питании ионистор на пару Фарад, то 150мкА это дополнительный час (или даже два часа) работы прибора в автономном режиме.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 15 2011, 04:35
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Zelepuk @ Sep 14 2011, 15:13) *
нужно организовать дополнительный уарт в устройстве на МСП430, где заняты все аппаратные уарт. В сети есть примеры с использованием аппаратного таймера, но таймер тоже задействован.

А второй? Обычно их два, и в каждом ещё минимум по три CCR.
Неужто все заняты?


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Sep 15 2011, 09:12
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



кроме того, еще нехватает GPIO как таковых, так что думаю идея поставить доп. микроконтроллер тут предпочтительнее. Ну например поставить младший мсп430 с потреблением порядка 200 мкА на 1МГц.
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 20 2011, 06:27
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Если ещё есть возможность, то лучше взять MSP по-жирнее. Мост типа MAX3100 достаточно дорогое удовольствие. Второй камень - экстенсивное решение - может сначала переделать работу таймеров? У меня, например, несколько проектов, где все интервалы реализованы на одном постоянно включенном таймере от подкалибровывающегося VLO, причем с уходом в LPM3. Изменяется шкала побудки по совпадению, а тайминги в конкретных местах (задачах - маленькая ОС) считаются по разнице отсчетов времени. Просто буквально вчера разгребал чужой проект на C8051F130, так там были задействованы все(!) PCA-модули и каждый для одной задержки - выбросил всё и оставил постоянно включенный таймер PCA0 - программа работает не хуже, а аппаратные ресурсы высвободились, объём кода уменьшился, да и стал он более прозрачным (и портируемым - подтягиваю к MSP).


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 20 2011, 07:17
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sensor_ua @ Sep 20 2011, 09:27) *
все интервалы реализованы на одном постоянно включенном таймере

А с дуплексом?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 20 2011, 07:23
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
А с дуплексом?
Вопроса не понял


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 20 2011, 08:49
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Ну если софтовый Уарт должен одновременно передавать и принимать, то его реализация на одном счетчике получается сложнее, не так ли?
Поэтому интересуюсь.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 20 2011, 10:11
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Если софтовый Уарт должен одновременно передавать и принимать

Набросал как в первом приближении (без подкалибровывания VLO и с низким разрешением) это могло бы выглядеть:

Код
typedef unsigned int CPU_Time_t;
CPU_Time_t CPU_Time(void){
  return TAR;
}
CPU_Time_t CPU_Elapsed(CPU_Time_t ts){
   return (CPU_Time() - ts);
}

int SW_UART_Rx_Byte(void){
  static CPU_Time_t ts;
  static int st;
  static unsigned char mask;
  static unsigned char Rx_byte;
  int rc = -1;

  switch(st)
  case 0:
    if(START_DETECT()){
      ts = CPU_Time(); st++;
    }
    break;
  case 1:
    if(CPU_Elapsed(ts) > CPU_uS(HALF_BIT_TIME_uS)){
      if(START_PIN_GET() == 0){
        ts = CPU_Time(); st++; // valid START received
        mask = 0x01; Rx_byte = 0;
      }else{
        st = 0;
      }  
    }
    break;
  case 2:
    if(CPU_Elapsed(ts) > CPU_uS(BIT_TIME_uS)){
      ts = CPU_Time();
      if(Rx_PIN_State_GET()) Rx_byte |= mask;
      mask <<= 1;
      if(!(mask & 0xFF)) st++; // 8 bits received
    }
    break;
  case 3:
    if(CPU_Elapsed(ts) > CPU_uS(BIT_TIME_uS)){
      if(Rx_PIN_State_GET()) rc = Rx_byte; // valid STOP received
      st = 0;
    }
    break;
  }
  return rc;
}

int SW_UART_Tx_Byte(int Tx_Byte){
  static CPU_Time_t ts;
  static int st;
  static unsigned char mask;
  static unsigned char Tx_tmp;
  int rc = -1;  

  if(TxByte & 0xFF00){// Tx break
    st = 0;
    return TxByte;
  }
  switch (st){
  case 0:
    Tx_tmp = Tx_Byte; mask = 0x01;
    TX_OUT_DOWN(); // START post
    ts = CPU_Time();
    st++;
    break;
  case 1:
    if(CPU_Elapsed(ts) > CPU_uS(BIT_TIME_uS)){
      ts = CPU_Time();
      if(Tx_tmp & mask) TX_OUT_UP();
      else TX_OUT_DOWN();
      mask <<= 1;
      if(!(mask & 0xFF)) st++; // 8 bits post
    }
    break;
  case 2:
    if(CPU_Elapsed(ts) > CPU_uS(BIT_TIME_uS)){
      ts = CPU_Time();
      TX_OUT_UP(); // STOP post
      st++;
    }
    break;
  case 3:
    if(CPU_Elapsed(ts) > CPU_uS(BIT_TIME_uS)){// end of STOP-bit
      rc = Tx_tmp;
      st = 0;
    }  
    break;
  }
  return(rc);
}

void echo(void){
  static int st;
  static int ch;
  int rx_tmp;

  rx_tmp =  SW_UART_Rx_Byte();
  switch (st){
    case 0:
      ch = rx_tmp;
      if( ch & 0xFF00) break;
      st++;
    case 1:
      if(SW_UART_Tx_Byte(ch) != ch) break;
      st = 0;
  }

}

Такое для низких скоростей и небольшой загрузки могло бы прокатить


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
GinRider
сообщение Oct 4 2011, 07:12
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 13-10-06
Из: Финляндия
Пользователь №: 21 273



Если MCU всегда мастер, проще поставить внешний коммутатор на UART.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 22:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01455 секунд с 7
ELECTRONIX ©2004-2016