Софтовый СОМ порт для PIC16F84

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Итак, любители пива с креветками... Сегодня вытащил свои старые архивы (хотя я сам еще в общем то молодой) и нашел софтовый СОМ порт для пика 84. Ну понятно, что типа это сделать невозможно и все такое. Теперь привожу код с комментариями. Желающих проявить себя на паяльном поприще, сюда плиз. Устройство крайне простое. Сделать несложно за 15 минут.


Код: Выделить всё

//      Driver for COM_PORT_PIC16F84A
//    CopyRight (C) Dima Lerich, Vladivostok

#define sDelayTimer  169 //   9,618 Hz for 4 MHz
#define sTimer2      210 //   15000 Hz for 4 MHz
// PORT A
#define     TxData      PORTA.F1
// PORT B
#define     RxData      PORTB.F7

#define     GIE         INTCON.GIE
#define     T0IF        INTCON.T0IF
#define     T0IE        INTCON.T0IE
#define     RBIE        INTCON.RBIE
#define     RBIF        INTCON.RBIF

#define     T0SE        OPTION_REG.T0SE
#define     T0CS        OPTION_REG.T0CS
#define     PSA         OPTION_REG.PSA

unsigned char Tx_BIT_Enabled=0, Rx_BIT_Enabled=0, f_BIT_Done=0; // разрядные перменные
unsigned char Rx_BIT_Bit, Rx_BIT_BitOld;                        // для порта В_В

unsigned char TxByte, RxByte;                    // байтовые переменные
char numRxBit, numTxBit;
char Port_B;

void interrupt (void)
{
  GIE = 0;                   // разрешение прерываний
  if(T0IF)                   // если флаг переполнения таймера установлен
  {
    TMR0 = sDelayTimer;      // устанавливаем в таймер значение задержки
    T0IF = 0;                // флаг сбрасываем
    if(Tx_BIT_Enabled)       // если передача разрешена
    {
       if(numTxBit==0)       // номер бита 0
       {
          numTxBit=1;        // номер становится первым
          TxData = 0;        // ставим 0 на линию передачи портА = 0
       }
       else if(numTxBit>8)   // иначе если номер бита более 8
       {
          TxData = 1;        // ставим 1 на линию передачи на портА = 1
          numTxBit=0;        // номер бита = 0  ОБНУЛЯЕМ
          Tx_BIT_Enabled=0;  // запрещение передачи
       }
       else                  // иначе
       {
          if(TxByte&1)       // если Данные байта и 1
             TxData = 1;     // данные передачи выдаются на портА = 1
          else               // иначе
             TxData = 0;     // данные передачи на портА = 0
          TxByte >>= 1;      // сдвинем на 1 вправо
          numTxBit++;        // увеличим номер бита на 1
       }
    }
    if(Rx_BIT_Enabled)       // если разрешен прием
    {
       if(numRxBit>8)        // номер бита больше 8
       {
          Rx_BIT_Enabled=0;  // запрещен прием
          Port_B = PORTB;    // в переменную заносим значение портаВ
          RBIF=0;            // запретим прерыванияч по портуВ
          f_BIT_Done=1;      // закончили прием
       }
       else if(numRxBit<8)   // если номер бита менее 8
       {
          RxByte>>=1;        // сдвигаем число на 1 разряд вправо
          if(RxData==1) RxByte+=128;  // если = 1 то прибавим 128
       }
       numRxBit++;           // номер бита увеличим на единицу
    }
  }
  if(RBIF)                   // если взведен флаг прерывания по порту В
  {
    RBIF=0;                  // сбросим флаг прерывания на порту В
    Port_B = PORTB;          // снимем данные с порта В
    if(RxData)               // если разряд 7 порта В в состоянии 1 тогда
       Rx_BIT_Bit=1;         //
    else
       Rx_BIT_Bit=0;         //
    if(Rx_BIT_Enabled==0 && numRxBit==0)
    {
      if(Rx_BIT_Bit==0 && Rx_BIT_BitOld)
      {
        f_BIT_Done =0;       //   завершения приема нет
        RxByte =0;           //
        numRxBit=0;          //
        Rx_BIT_Enabled = 1;  //   поступает разрешение на прием байта с порта
        RBIE = 0;            //   запрещаются прерывания с порта В
        T0IF = 0;            //   флаг переполнения сбрасывается
        TMR0 = sTimer2;      //   устанавливается новое значение таймера
      }
    }
    Rx_BIT_BitOld = Rx_BIT_Bit;
   }
  if(Tx_BIT_Enabled==0)
  {
     TxData = 1;
  }
  GIE = 1;                   // разрешим все прерывания //  MSG = 0;
}
InitPic()
{
  OPTION_REG = 0;
  f_BIT_Done = 0;
  TxData  = 1;
  numTxBit = 0;
  numRxBit = 0;
  TMR0 = sDelayTimer;
  Tx_BIT_Enabled=0;
  Rx_BIT_Enabled=0;
  T0SE = 1;
  T0CS = 0;
  PSA  = 1;
  RBIE = 0;
  TRISB = 128;    // = 128      Input 10000000    =13 input
  TRISA = 1;      // = 1        Input 00000001    =18 output
  T0IE = 1;
  GIE = 1;
}
void InitRx()
{
  RxByte=0;
  f_BIT_Done=0;
  numRxBit=0;
  Rx_BIT_Enabled=0;
  Port_B=PORTB&128;
  RBIE=1;
}
void SendRs(unsigned char x)
{
   while(Tx_BIT_Enabled);
   numTxBit=0;
   TxByte=x;
   Tx_BIT_Enabled=1;            // передача разрешена!
}
char Command()
{
  if (f_BIT_Done==0) return 0;  // если ноль, то уходим
      RBIE=0;
        SendRs (RxByte);
        InitRx();
  return 1;
}
main(void)
{
InitPic();
InitRx ();
  while(1) { Command(); }
}


Компилируйте например в МИКРОС и вперед. Я переписал с хайтека на микроС. Для особо неверующих привожу хексы:

:10000000D328FF3FFF3FFF3FCF00030E8301970040
:10001000040896000A0898008A0141089B004008DD
:100020009A008B130B1D5428A93081000B110C086A
:10003000031935280D08003A031D222801308D00D0
:10004000851035280D08083C03182A2885148D01D1
:100050008C01352801300E05C000031931288514A4
:10006000322885108E0C8E138D0A0F080319542820
:100070001008083C031843288F01060891000B1054
:100080000130920053280830100203185328930CB3
:1000900093130030861B0130C1004108013A031D53
:1000A000532880309307900A0B1C79280B10060800
:1000B0009100861F5E28013094005F2894010F088C
:1000C000003A031D77281008003A031D772814080A
:1000D000003A031D77281508031977289201930128
:1000E000900101308F008B110B11D2308100140868
:1000F00095000C08003A031D7E2885148B171B08F9
:10010000C1001A08C00018088A0016088400170EDB
:100110008300CF0E4F0E0900031383120C08031D3A
:100120008C288D0119088E0001308C000800031303
:1001300083129301920190018F0180300605910096
:100140008B15080003138316810192018312851415
:100150008D019001A93081008C018F018316011659
:10016000811281158B1180308600013085008B163D
:100170008B170800031383121208003A031DC228CC
:10018000C00108008B11130899008C2097200130C2
:10019000C00008000030031383128C0000308F0071
:1001A000003092000800CA20A2209720BA20D6284A
:1001B000D828FF3FFF3FFF3FFF3FFF3FFF3FFF3F8D
:00000001FF

А теперь плиз все кто выражал сомнения и прочее недовольство, жду от Вас объяснений Ваших действий. С уважением, Дима Лерич.
Иногда получается спаять пару проводов...
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Пока мои оппоненты в раздумьях, сообщу, что на этом СОМе сделан был измеритель с АЦПом 1286 и измерением 12 разрядов с передачей в 2-байтовом формате. Реальный масштаб времени. Все чудненько работало. Кстати код получается маленький и простой. Есть сомневающиеся? А пиво не жаль будет мне потом отправлять,а?
Иногда получается спаять пару проводов...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Софтовый СОМ порт для PIC16F84

Сообщение Аlex »

Зачем же так грубо ? :) "Для неверующих", "пиво отправлять", и т.д... Не поймут люди. Многие же не знают о Ваших разговорах в других темах :)
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Прошу без обид, пиво на самом деле - к лучшему.
А что касается желающих пообщаться со мной в разделе МЯУ, отвечать на такие демарши не входит в мои планы. Если кому интересны необычные софтовые вещи, готов поделиться.
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Dima Lerich писал(а):Пока мои оппоненты в раздумьях...

А что тут думать, любезный "пионер"?
Вы грубо нарушили алгоритм детектирования, сведя все к синхронной защелке в один интервал...
Почитайте концовочку темы, что Вы покинули и обломитесь с приоритетом...
Таких "приоритетов" - каждый день вагон...
:cry:
ЗЫ. А не желаете "похвастать" в профильной компании ? :wink:
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Вас дружище заело? Ну зря, зря. СОМ порт работает не смотря на Вас... Кстати, а возражения по существу есть, или перейдем на общение "типа ты пионер"? Кстати пионер - почетно для меня. Вы же не все обо мне знаете, не так ли? А по возрасту судить не надо. Ошибетесь.
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Нас "заедать" пока что НЕКОМУ...
В том, что Вы написали нет никакой новизны.
Еще раз перечитайте мой первый комментарий в этой теме.
:wink:

ЗЫ. Вы верно поняли слово "пионер"... Но к Вам относится ДРУГОЙ его смысл (тот что в галстуке)... :)
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Дружище, мне бы не очень хотелось Вас цеплять, но у меня есть чем хвастать, если потребуется. Две монографии, семь патентов, помимо ученой степени и премии Федерального уровня. Так что Вы не волнуйтесь за меня. Лучше признайте, что Вы не столь велики, как хотите показаться. Извините, если снова на "Вас наступил". Я нечаянно. В профильной компании меня ценят и знают, но моя профильная компания не микрочиповская. Скрее Профессиональная если на то пошло.
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Любезный "пионер", Ваш стиль общения не оставляет сомнений в Вашем "величии"...
Мне как то фиолетовы Ваши медальки, даже если у Вас их вдвое больше упомянутых.
Однако то, что Вы тут написали меня не интересует в практической профессиональной деятельности.
Видимо Вы испытываете серьезные комплексы относительно своей самооценки...
Это бывает.
Тут есть один клоун на эту тему. Пообщайтесь с ним.
Честь имею,
Марк.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Софтовый СОМ порт для PIC16F84

Сообщение Аlex »

Ребята, давайте жить дружно ... (с) :)
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Для желающих продолжить обсуждение СОМ порта. Вроде бы прозвучало мнение, что времени не останется на все остальное у процессора. Это не так. И места потребуется в адресном пространстве мало. Если есть задачи, обсудим. Ну разумеется, нестандартно. "По-пионерски" так сказать.
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Dima Lerich писал(а):Для желающих продолжить

Еще раз.
Ваше решение НЕ МАСШТАБИРУЕТСЯ. Сделать на нем более одного компорта не выйдет. Да и таймер занят полностью.
Системный из него уже не сделать.
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Ну вот и чудьненько. Правда не знаю, для чего мне понадобятся корни? Я люблю больше плоды, чаще сладкие. Ну да ладно, давайте обсудим корни. Только сначала проверим, вдвое ли быстрей. Потому как сомневаюсь, что Вы проверяли на практике реальную скорость с реальным оборудованием. Выкладивайте код, будем смотреть...
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Насчет его рабочести - не сумлевайтесь... :wink:
Учитывая разрядность исходного числа, его можно подогнать под него.
Си компилирует код примерно на 45% медленнее для 32 разрядов и вдвое для сигнальных приложений, где квадрат значений 12 разрядного АЦП дает только 24 разряда аргумента.

Код: Выделить всё

;--- SQRT (W1:W0 -> W6)
sqrt:
   mov      # 0x8000, W5
   clr      W6
lp_sq:
   ior      W6, W5, W6
   mul.uu      W6, W6, W2
   sub      W0, W2, W4
   subb      W1, W3, W4
   btss      SR, # C
   sub      W6, W5, W6
   lsr      W5, W5
   bra      NC, lp_sq
   return
;----------
Последний раз редактировалось КРАМ Вт июл 30, 2013 15:56:55, всего редактировалось 2 раза.
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Задача стояла сделать порт. Ну ктоже мешает сделать еще один там, где уже есть аппаратный. И потом, надеюсь понятен принцип организации порта? Можно делать дальше и кто знает, какой это будет порт. Природа человека столь разнообразна и мысли столь разнообразны, что я не стал бы утверждать жестко что нельзя.
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Dima Lerich писал(а):Задача стояла сделать порт. Ну ктоже мешает сделать еще один там, где уже есть аппаратный.

Никто не мешает сделать и там, где аппаратного нет.
Вы по прежнему не понимаете о чем речь.
Люди из микрочипа выдали масштабируемое и универсальное решение, которое оставляет таймер для системных тиков.
Вы выбросили все это и решили, что это умнО...
Для Вашей частной задачи ВОЗМОЖНО это и целесообразно, в чем я сомневаюсь...
А для "показать всем" - наивно...
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Я уже писал, что ищу решения там, где их не ждут. И меня мало интересует, в итоге о чем додумались микрочиповцы. Главное, результат и решение в нужном месте и в нужное время. Дорога ложка к обеду.
Часто общаюсь с западными спецами, большей частью в Европе и к удивлению сознаю, что они весьма ограничены в решениях, "ихних" идей откровенно мало. Там работают пацаны из России, идеи как раз от них. А вот реализация чисто западная. И не всегда оптимальная. Ну да ладно, их деньги с ними. Что действительно классное там, так это оборудование. Супер. Просто тащусь от того, что можно на нем сделать, а не делают, потому как "в аппноутах не описано", а значит НИЗЗЯ...
Иногда получается спаять пару проводов...
Аватара пользователя
Dima Lerich
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт июл 19, 2013 10:19:19
Откуда: Владивосток

Re: Софтовый СОМ порт для PIC16F84

Сообщение Dima Lerich »

Покидаю форум. Поздно, завтра на работу. Всем спасибо за беседу, извините если был где-то резок. Я не по злобе, я на самом деле добрый :))
Иногда получается спаять пару проводов...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »


С этой строки начинается ISR.
Если этот код приведен as is от ученика 3 класса, то вопросов нет - ну не знал октябренок, что глобальное прерывание гасится контроллером прерываний АВТОМАТИЧЕСКИ при переходе на вектор ISR.
Есть так же и последняя строка ISR

Тоже понятно, не знает школьник, что компилятор в конце обработчика АВТОМАТИЧЕСКИ генерирует команду RETFIE, которая не только возвращает содержимое TOS в PC, но и взводит разрешение глобальных прерываний....
Тогда возникает вопрос к ПЕРВОЙ строке кода, где тщательно исправлено название контроллера с 84-го на 84А.
Все бы ничего, но вот 84А появился только в 2001 году... И никак не вписывается в роман о вундеркинде...
И кроме того, АЦП ADS1286 от Техаса (точнее Бурр-Браун) тоже впервые был выпущен только в 1998 году и ожидать его мгновенное появление в России у любителя школьника как то сказочно странно...
Ну да ладно...

у меня возник ПОСЛЕДНИЙ вопрос.
Снова по коду... :(
Вы, Дима, утверждаете, что код рабочий и вообще...
Допускаю.
Тогда объясните мне простой фрагмент обработчика:

Код: Выделить всё

if(RBIF)                   // если взведен флаг прерывания по порту В
  {
    RBIF=0;                  // сбросим флаг прерывания на порту В
    Port_B = PORTB;          // снимем данные с порта В

Видите ли, Дима...
Если вначале загасить флаг RBIF, а затем прочитать порт, то флаг НЕ СБРОСИТСЯ... :cry:
А если вначале прочитать порт, а ПОТОМ сбросить флаг, то все будет ОК...
Микрочип в даташите писал(а):The user, in the Interrupt Service Routine, can clear the
interrupt in the following manner:
a) Any read or write of PORTB. This will end the
mismatch condition.
b) Clear flag bit RBIF.
A mismatch condition will continue to set flag bit RBIF.
Reading PORTB will end the mismatch condition and
allow flag bit RBIF to be cleared.

Так о чем же этот фильм, Дима?...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Софтовый СОМ порт для PIC16F84

Сообщение КРАМ »

Вы, Дима (или как Вас там?), видимо не до конца прочли мой коммент.
Ваш код, Дима, в том виде, какой приведен в начале, РАБОТАТЬ НЕ БУДЕТ.Мне не требуется паять всякую хрень только для того, чтобы обнаружить очевидное.
Флаг прерывания по изменению состояния порта НЕ МОЖЕТ БЫТЬ СБРОШЕН до того, как чтение или запись в этот порт не перепишут в регистр соответствия новое состояние этого порта.
В противном случае флаг так и будет взводиться (ведь условие постоянно выполняется)...
Ответить

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