Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 07.06.2007, 13:31   #1
timday
Senior Member
 
Регистрация: 07.03.2007
Адрес: Саратов
Возраст: 40
Сообщений: 385
Вес репутации: 308/54
timday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the rough
По умолчанию реализация обмена по RS на Си...

суть проблемы такова...
Необходимо сделать обмен по RS232 данных. На стороне компьютера программа посылает данные (запросы) с помощью функции WriteFile. Сразу одной посылкой передаются по 6 байт (или больше). Протокол простой, адрес, команда, данные...
Контроллер их должен принять...но не успевает этого делать. Программа написана на Си с исп. Hi-tech picc18 9.50. Делаю все так: инициализация, прием данных по флагу RCIF.

Код:
void isrRX(void)
{
  while (RCIF)
  {
    if (OERR)
    {
      CREN = 0;
      CREN = 1;
      fReceive = 0;
      fRError = 1;
      return;
    }
    vRBuff[vRIndex++] = RCREG;
  }  
  if (vRIndex > vRReadIndex) fReceive = 1;
}
если делать паузу между передаваемыми байтами где-то 5мс, то все проходит нормально, иначе переполнение. Видимо скорости что-ли нехватает, ума не приложу
timday вне форума   Ответить с цитированием
Старый 07.06.2007, 13:58   #2
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от timday Посмотреть сообщение
суть проблемы такова...
Необходимо сделать обмен по RS232 данных. На стороне компьютера программа посылает данные (запросы) с помощью функции WriteFile. Сразу одной посылкой передаются по 6 байт (или больше). Протокол простой, адрес, команда, данные...
Контроллер их должен принять...но не успевает этого делать. Программа написана на Си с исп. Hi-tech picc18 9.50. Делаю все так: инициализация, прием данных по флагу RCIF.

Код:
void isrRX(void)
{
  while (RCIF)
  {
    if (OERR)
    {
      CREN = 0;
      CREN = 1;
      fReceive = 0;
      fRError = 1;
      return;
    }
    vRBuff[vRIndex++] = RCREG;
  }  
  if (vRIndex > vRReadIndex) fReceive = 1;
}
если делать паузу между передаваемыми байтами где-то 5мс, то все проходит нормально, иначе переполнение. Видимо скорости что-ли нехватает, ума не приложу
Дык программа что еще делает? Частота процессора какая? скорость обмена какая? Для УАРТа лучше прерывания использовать.
IceS вне форума   Ответить с цитированием
Старый 07.06.2007, 14:20   #3
timday
Senior Member
 
Регистрация: 07.03.2007
Адрес: Саратов
Возраст: 40
Сообщений: 385
Вес репутации: 308/54
timday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the rough
По умолчанию Re: реализация обмена по RS на Си...

да, забыл уточнить....приведенная функция включена в обработчик прерываний. т.е. байтики принимаются в прерывании при устан. флаге RCIF.
Кроме обмена по RS пока никаких других телодвижений не происходит.
Скорость обмена 57600. пачки по 6-32 байта. частота следования пачек...как приходит ответ от МК сразу новый запрос, ну может с задержкой 5-10 мс...
Проц работает на 32МГц.
timday вне форума   Ответить с цитированием
Старый 07.06.2007, 22:48   #4
VXDRV
Senior Member
 
Аватар для VXDRV
 
Регистрация: 25.02.2007
Адрес: Karagandy
Возраст: 37
Сообщений: 375
Вес репутации: 230/53
VXDRV has a spectacular aura aboutVXDRV has a spectacular aura aboutVXDRV has a spectacular aura about
Отправить сообщение для VXDRV с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

На 20 МГц-ах PIC16F877 принимает пакеты по 513 байт без потерь на скорости 115200 кбит/с по прерываниям (правда программа на асме, но это сути не меняет).

Передача от компа происходит как раз функцией WriteFile в духе:

Код:
WriteFile(hCom,SendBuffer,513,x,@o);
Ещё успевает и другими "тяжёлыми" вещами заниматься.
VXDRV вне форума   Ответить с цитированием
Старый 08.06.2007, 00:44   #5
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

все должно нормально работать, что то в программе косячит.
IceS вне форума   Ответить с цитированием
Старый 08.06.2007, 11:12   #6
timday
Senior Member
 
Регистрация: 07.03.2007
Адрес: Саратов
Возраст: 40
Сообщений: 385
Вес репутации: 308/54
timday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the rough
По умолчанию Re: реализация обмена по RS на Си...

Дык на асме у меня тоже все отлично работает... мне надо есть-ли у кого опыт написания таких вещей на Си
timday вне форума   Ответить с цитированием
Старый 08.06.2007, 11:14   #7
timday
Senior Member
 
Регистрация: 07.03.2007
Адрес: Саратов
Возраст: 40
Сообщений: 385
Вес репутации: 308/54
timday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the rough
По умолчанию Re: реализация обмена по RS на Си...

в программе все так:
Код:
void interrupt Hi_isr(void)
{
  isrRX();
  isrTMR();
}

void isrTMR(void)
{
  if (TMR0IF)
  {
    TMR0IF = 0;
    LedTimer();
  }
}

void isrRX(void)
{
  while (RCIF)
  {
    if (OERR)
    {
      CREN = 0;
      CREN = 1;
      fReceive = 0;
      fRError = 1;
      return;
    }
    vRBuff[vRIndex++] = RCREG;
 }
}
timday вне форума   Ответить с цитированием
Старый 08.06.2007, 11:19   #8
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от timday Посмотреть сообщение
Дык на асме у меня тоже все отлично работает... мне надо есть-ли у кого опыт написания таких вещей на Си
А я тебе про асм ни слова не сказал. Проц работает быстро, скорость обмена маленькая, все должно успевать, ищи в проге косяки.
IceS вне форума   Ответить с цитированием
Старый 08.06.2007, 11:23   #9
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

Ищи что дальше происходит, не в прерываниях, когда у тебя все данные прийдут что ты начинаешь с ними делать? может прерывания запрещаешь на время обработки и в длиннющий цикл вываливаешься,вот у тебя пик и не принимает новые данные.
IceS вне форума   Ответить с цитированием
Старый 08.06.2007, 11:26   #10
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от timday Посмотреть сообщение
если делать паузу между передаваемыми байтами где-то 5мс, то все проходит нормально, иначе переполнение. Видимо скорости что-ли нехватает, ума не приложу
Похоже ты запрещаешь прерывания, может даже не глобально, а только от ЮАРТа. А в это время что нить типа 1wire опрашиваешь, вот у тебя юарт и принимает 3 байта (п/п их не вычитывает) и выставляется переполнение.
IceS вне форума   Ответить с цитированием
Старый 08.06.2007, 13:15   #11
Молчун
Member
 
Регистрация: 25.02.2007
Сообщений: 95
Вес репутации: 113/49
Молчун will become famous soon enoughМолчун will become famous soon enough
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от timday Посмотреть сообщение
Дык на асме у меня тоже все отлично работает... мне надо есть-ли у кого опыт написания таких вещей на Си

Дык, и сделай для начала в точности, как сделано на асм.

Нехорошо у тебя в прерываниях. Проверку RCIE добавь, цикл ( while (RCIF) ) нафиг убери. И вообще - не пользуйся функциями в прерывании (мало какой компилятор сгенерирует хорошее короткое сохранение контекста).

Код:
 
void interrupt Hi_isr(void)
{
  if (RCIF && RCIE) {
    if (OERR) {
      //????
    } else {
      vRBuff[vRIndex++] = RCREG;
    }
  } else if (TMR0IF /* && TMR0IE */) {
    TMR0IF = 0;
    LedTimer_MACRO;
  }
}
Молчун вне форума   Ответить с цитированием
Старый 08.06.2007, 14:30   #12
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 44
Сообщений: 2,610
Вес репутации: 2570/99
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от Молчун Посмотреть сообщение
Проверку RCIE добавь
[/code]
Можно узнать зачем нужна проверка RCIE? В случае если в программе RCIE не сбрасывается. Для большей надёжности?
fantom вне форума   Ответить с цитированием
Старый 08.06.2007, 14:35   #13
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
Wink Re: реализация обмена по RS на Си...

Цитата:
Сообщение от fantom Посмотреть сообщение
Можно узнать зачем нужна проверка RCIE? В случае если в программе RCIE не сбрасывается. Для большей надёжности?
Это оно сейчас не сбрасывается, а завтра/после-завтра будет сбрасываться (или по этому же принципу будут опрашиваться другие прерывания) и опять что то будет не работать, и опять будут вопросы ...
IceS вне форума   Ответить с цитированием
Старый 08.06.2007, 15:51   #14
Молчун
Member
 
Регистрация: 25.02.2007
Сообщений: 95
Вес репутации: 113/49
Молчун will become famous soon enoughМолчун will become famous soon enough
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от fantom Посмотреть сообщение
Можно узнать зачем нужна проверка RCIE? В случае если в программе RCIE не сбрасывается.
Ну заранее об этом случае не упоминалось, поэтому уместно проверять по умолчанию. Ты ж код не показал. А вообще, это как мыть руки перед едой - тоже всегда уместно.
Молчун вне форума   Ответить с цитированием
Старый 08.06.2007, 17:06   #15
timday
Senior Member
 
Регистрация: 07.03.2007
Адрес: Саратов
Возраст: 40
Сообщений: 385
Вес репутации: 308/54
timday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the roughtimday is a jewel in the rough
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от IceS Посмотреть сообщение
Это оно сейчас не сбрасывается, а завтра/после-завтра будет сбрасываться (или по этому же принципу будут опрашиваться другие прерывания) и опять что то будет не работать, и опять будут вопросы ...
Это как-это так? Программа испортится?
С проблеммой справился, спасибо всем за советы... причина как всегда банальная, не был установлен бит PEIE... а байты принимались тогда, когда было прерывание от таймера...так сказать заодно
timday вне форума   Ответить с цитированием
Старый 08.06.2007, 17:09   #16
IceS
Super Moderator
 
Регистрация: 01.03.2007
Адрес: St. Petersburg
Возраст: 41
Сообщений: 3,246
Вес репутации: 3684/116
IceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond reputeIceS has a reputation beyond repute
Отправить сообщение для IceS с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

Цитата:
Сообщение от timday Посмотреть сообщение
Это как-это так? Программа испортится?
С проблеммой справился, спасибо всем за советы... причина как всегда банальная, не был установлен бит PEIE... а байты принимались тогда, когда было прерывание от таймера...так сказать заодно
Нет, бывает надо отключить приемник ЮАРТа, бывает удобно отключить от него прерывания, в вашем случае при прерывании от таймера будут приниматься данные от ЮАРТА, а по логике не должны.
IceS вне форума   Ответить с цитированием
Старый 12.06.2007, 01:29   #17
Lexi
Senior Member
 
Аватар для Lexi
 
Регистрация: 25.02.2007
Адрес: Беларусь
Возраст: 37
Сообщений: 374
Вес репутации: 92/0
Lexi will become famous soon enough
Отправить сообщение для Lexi с помощью ICQ
По умолчанию Re: реализация обмена по RS на Си...

А вот так я принимаю по UART с использованием прерывания по "приёму"
[code]
#int_RDA
RDA_isr()
{
srx[nrx++]=getc();
}
[\code]
тока массив srx[] используеться как глобальная переменная
__________________
Век живи - век учись!
Lexi вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу литературу по Си Mario Общетехнические вопросы 16 20.03.2014 14:34
Нужна ли МК ОС? syv Инструментарий 179 22.01.2009 10:59
Переход на Си Felix54 Продукция MICROCHIP 1 15.05.2008 21:26
Подскажите, пожалуйста, где толковую литературу на русском языке по dspic33f взять (в основном АСМ интересует) dr_Sash Продукция MICROCHIP 42 29.03.2008 16:22
Вопрос новичка по Си ramonchik Продукция MICROCHIP 3 05.03.2007 16:28


Часовой пояс GMT +3, время: 04:29.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot