Подключение микроконтроллера к компьютеру

Подключение МК к ПК
Микроконтроллеры PIC16 имеют универсальный синхронно-асинхронный приемопередатчик USART, с помощью которого можно реализовать передачу информации между компьютером и микроконтроллером. Передача данных по USART осуществляется поочередно по одному биту, поэтому данный интерфейс называют последовательным, логические уровни сигналов обычно соответствуют уровням логики ТТЛ, КМОП и т.д. На компьютере UART (асинхронный последовательный интерфейс) реализован в виде интерфейса RS-232 через последовательный порт (COM) компьютера. Основное отличие интерфейса RS-232 заключается в величине логических уровней сигнала, логическому “0” соответствует положительное напряжение +5…15В, логической “1” отрицательной напряжение -5…15В. Такие уровни были выбраны для улучшения помехоустойчивости и увеличения дальности связи.

В современных компьютерах и ноутбуках, как правило, COM порт отсутствует, в этом случае можно воспользоваться специальным переходником USB-COM (преобразователь интерфейса USB – RS232), что я и сделал. В моем случае переходник реализован на основе чипа FTDI, при желании его можно изготовить самостоятельно с помощью специализированных микросхем FT232, PL2303 и т д.

Выход передатчика обозначается символами TхD (Tx), вход приемника RxD (Rx), на разъеме COM порта компьютера выход TxD соответствует 3-му выводу, вход RxD 2-му выводу, 5-й вывод общий провод (GND). При подключении двух устройств по UART, выход передатчика 1-го устройства соединяют с входом приемника 2-го устройства, и соответственно выход передатчика 2-го устройства с входом приемника 1-го устройства. Интерфейс UART (асинхронный) позволяет одновременно вести прием и передачу информации между устройствами, в отличие от USRT (синхронный интерфейс). Как было сказано выше, передача данных осуществляется последовательно по битам, через равные промежутки времени, поэтому оба устройства должны быть настроены на одинаковую скорость и режим работы, то есть синхронизация в данном случае осуществляется по времени, соответственно требования к точности временных задержек должны быть высокими.

Для подключения к ноутбуку по UART в качестве примера я использовал микроконтроллер PIC16F628A, схема представлена ниже:
Схема подключения МК к ПК
Преобразователь USB-COM , которым я воспользовался, выдавал следующие уровни напряжения: логической “1” соответствовал уровень отрицательного напряжения -6,5В; логическому “0” положительное +6,5В, что соответствует стандарту интерфейса RS-232, поэтому для согласования уровней микроконтроллера и переходника я установил транзисторы VT1, VT2. Для передачи логической “1” (от микроконтроллера на преобразователь) по стандарту RS-232 необходимо создать отрицательное напряжение, что было сделано мной в самом начале тестирования, с помощью генератора импульсов на таймере NE555 и диодно-конденсаторной схеме. Потом как выяснилось, нулевое напряжение преобразователь воспринимает так же, как и отрицательное, поэтому надобность в источнике отрицательного напряжения отпала.

Чтобы задействовать COM порт на компьютере (в случае использования переходника USB-COM создается виртуальный COM порт), можно запустить стандартную программу HyperTerminal (терминал), которая отсылает на COM порт ASCII коды символов введенных с клавиатуры. Принятые данные программа также преобразует в символы в соответствии с таблицей ASCII. Для визуализации принятых данных от ноутбука, к микроконтроллеру подключены светодиоды HL1-HL4 и цифровое табло на драйвере MC14489AP. Светодиоды зажигаются при нажатии соответствующих кнопок на цифровой клавиатуре ноутбука (цифры 1-4), цифровое табло отображает значение принятого байта. При нажатии кнопки SB1 микроконтроллер отправляет на ноутбук фразу “PIC Alive ”.

Теперь рассмотрим сам код программы:

В основной программе сначала идет настройка линий ввода/вывода микроконтроллера, линии RB1/RX, RB2/TX настраиваются на вход для работы модуля USART. Далее идет настройка скорости передачи данных по USART, путем записи числа 0х19 в регистр скорости обмена SPBRG. В даташите на микроконтроллер приведена таблица, где рассчитаны значения скорости обмена в зависимости от частоты тактового генератора, режима (высокоскоростной, низкоскоростной, синхронный, асинхронный) а также от числа, загружаемого в регистр SPBRG, там же приведены формулы для расчета скорости обмена. В данном примере частота тактового генератора равна 4 МГц (внутренний тактовый генератор), режим асинхронный высокоскоростной, числу 0х19 будет соответствовать скорость обмена в 9615 бит/сек, что незначительно отличается от стандартной скорости 9600 бит/сек, ошибка в процентном соотношении составит +0,16%.

Далее идет настройка регистра управления и статуса передатчика TXSTA (находится в 1-ом банке), здесь установкой бита BRGH выбираем высокоскоростной режим, сбросом битов SYNC и TX9 устанавливаем асинхронный режим работы USART и 8-ми битную передачу, устанавливая бит TXEN разрешаем передачу данных. После этого настраиваем регистр управления и статуса приемника RCSTA, сбрасывая бит RX9 устанавливаем 8-ми битный прием, установкой битов CREN и SPEN разрешаем прием и включаем модуль USART. На этом настройку USART можно считать завершенной.

В приемнике главным является сдвиговый регистр RSR, после получения стопового бита, данные переписываются из RSR в регистр RCREG, после чего устанавливается флаг прерывания RCIF в регистре PIR1, само прерывание можно разрешить или запретить битом RCIE регистра PIE1. Флаг прерывания RCIF сбрасывается аппаратно, при чтении регистра RCREG. Регистр RCREG представляет собой двухуровненвый буфер, то есть может принять два байта, при этом необходимо считать его два раза. Если регистр RCREG полон, а в RSR пришел 3-й байт, устанавливается флаг переполнения приемника OERR в регистре RCSTA, приемник при этом отключается. Для сброса флага переполнения, необходимо запретить прием, то есть сбросить бит CREN.

Я организовал прием данных на прерываниях, после приема байта, по флагу RCIF вызывается подпрограмма обработки прерываний, где данные из регистра RCREG переписываются в регистр хранения priem, далее устанавливаем флаг получения байта (0-й бит) в дополнительном регистре flag, который опрашиваем в основной программе. Можно было пойти другим путем, опрашивать флаг прерывания RCIF в основной программе, но в этом случае при большом периоде опроса, приемник может переполниться и отключится. В случае с прерываниями переполнения не произойдет, максимум можно потерять несколько байтов, если в основной программе период опроса флага получения байта (0-й бит регистра flag) большой.

В основной программе происходит опрос кнопки и флага получения байта, если флаг установлен, содержимое регистра priem переписывается во временный регистр var, далее вызывается подпрограмма управления светодиодами (svet), в которой содержимое регистра var проверяется на совпадение с числами 49, 50, 51, 52. Этим числам соответствуют символы 1, 2, 3, 4 (десятичные цифры) из таблицы ASCII. Если в подпрограмме svet обнаружено совпадение, то зажигается соответствующий светодиод из HL1-HL4, остальные гаснут, при отсутствии совпадений выключаются все светодиоды. Далее вызывается подпрограмма вывода (vivod) содержимого регистра var на цифровое табло из семисегментных индикаторов, после возврата сбрасывается флаг получения байта, затем выполняется подпрограмма паузы (15 мс), после чего происходит переход на метку oproskn1, для очередного цикла опроса.

При нажатии кнопки SB1 вызывается подпрограмма message, которая отправляет фразу “PIC Alive ” через USART на ноутбук. Для сокращения кода символы размещены в таблице данных, всего 10 символов, порядковый номер символов хранится в регистре nomer. Перед каждым вызовом таблицы (подпрограмма table) регистр nomer инкрементируется, для извлечения следующего символа, после чего отправляется по USART. Одновременно с этим выполняется проверка равенства содержимого регистра nomer числу 10, если есть соответствие, происходит выход из подпрограммы message, то есть все символы переданы.

В передатчике главным является сдвиговый регистр TSR, буфером передатчика является регистр TXREG, в который загружают данные для передачи. После передачи стопового бита предыдущего байта, в регистр TSR передаются новые данные из регистра TXREG, при этом выставляется флаг прерываний TXIF в регистре PIR1, само прерывание можно разрешить или запретить битом TXIE регистра PIE1. Флаг прерывания TXIF сбрасывается аппаратно, после загрузки новых данных в TXREG. Аналогичным образом состояние регистра TSR отображает флаг TRMT регистра TXSTA, флаг устанавливается при опустошении TSR.

В моем варианте, символы, извлеченные из таблицы данных, загружаются в регистр TXREG, после чего происходит опрос флага TRMT, если флаг установлен (байт передан, TSR пуст), выполняем извлечение следующего символа. Вместо флага TRMT, можно опрашивать флаг прерываний TXIF, получим такой же результат. Чтобы не затрачивать процессорное время на опрос флагов, можно организовать передачу данных на прерываниях, то есть загружать регистр TXREG в подпрограмме обработки прерываний.

Перейдем к рассмотрению настроек программы HyperTerminal. Создаем новое подключение (File – New Connection) и задаем ему любое имя, например 111, переходник USB-COM при этом должен быть подключен. В следующем окне выбираем COM порт, далее необходимо настроить параметры порта: выставляем скорость передачи 9600 бит/сек, 8 бит данных, без проверки четности, один стоповый бит, и отключаем управление потоком. После этого в левом нижнем углу должна появиться надпись “Подключено” (Connected). Далее заходим в свойства созданного подключения (File – Properties), выбираем вкладку настройки и нажимаем кнопку “ASCII Setup”. В открывшемся окне ставим галочку для отображения введенных символов на экран (Echo typed characters locally), и еще одну галочку для дополнения символа возврата каретки переводом строк (Send line ends with line feeds), проще говоря, чтобы при нажатии клавиши Enter переходить на новую строку. Вот в принципе и все, можно отправлять и принимать данные, все отображается в окне программы. Ниже представлены скриншоты с настройками программы:
Настройки программы HyperTerminal
Вместо HyperTerminal, можно воспользоваться еще одной удобной программой под названием Terminal v1.9b by Bray. Здесь все настройки представлены в одном окне, имеется встроенная таблица символов ASCII, также программа умеет строить графики по принятым данным в диапазоне от 0 до 255.

Ниже на видеоролике можно просмотреть результат работы по подключению микроконтроллера PIC16F628A к ноутбуку через переходник USB-COM:

Макетная плата
Прошивка МК и исходник
Модель Proteus 8.1 SP1
Программа HyperTerminal
Программа Terminal v1.9b by Bray

У этой записи 23 комментариев

  1. Подскажите пожалуйста, как организовать прием байта, сравнение с эталоном, если совпадает принять следующий, если нет выход и так принять до 10 байт. Что то у меня не получается. Ваши примеры на передачу и опрос кнопок (11 шт.) у меня отлично работают. Спасибо вам.

  2. не совсем понял что именно вам надо, опишите конкретнее в подробностях вашу задачу.
    Насколько я понял вам надо принять до 10 информационных байт, причем информационный байт идет после эталонного? то есть эталонный – информационный- эталонный -информационный… И как понять принять до 10 байт? то есть из всех принятых байтов обнаружить 10 эталонных и после каждого из них принять информационный байт?

    Ну эту задачу я буду рассматривать на основе кода рассмотренного в этой статье, прием байтов по прерываниям. Для хранения 10 информационных байт надо воспользоваться косвенной адресацией, в области перечисления регистров общего назначения надо задать начальный адрес для хранения этих 10 байт, к примеру data1 equ 2D
    Для приема этих 10 байт создать подпрограмму priem10, в ней идет прием 10 информ. байт и сохранение их в регистры.
    После выхода из подпрограммы в регистрах 2D-36 будут лежать 10 принятых байт.

    Причем в таком варианте микроконтроллер будет занят только выполнением данной подпрограммы, другие задачи выполнять не сможет

  3. Нет, немного не так. Эталонные байты хранятся в памяти, например в ячейках 0х20 – 0х29. Они записываются при загрузке, вот с ними и надо сравнивать. Я управляю преобразователем частоты Mitsubishi, отправляю ему команду (допустим изменить частоту), а он отвечает. Если команда правильная он отправляет один ответ, если в команде ошибка – другой. Ответ при правильной команде всегда один и тот же, типа “все правильно”. Вот эти 10 байт при правильной команде я и проверяю, вывожу на LCD OK, иначе ERROR.

  4. то есть отправляете правильную команду, затем получаете ответ, проверяете его и если он верный, то далее принимаете 10 байт и сравниваете их с эталонными?

    1. Совершенно верно.

      1. а если все принятые 10 байт совпали с эталонными то что дальше? это что типа идентификация (проверка на правильность) пакета байт? а если какой то не совпал? например 5-й принятый байт…

        1. Дальше вывод “ОК” на LCD и снова на опрос кнопок. Проверяется 1 байт, а остальные несут информацию о преобразователе ( № преобразователя и частота). Они просто записываются в память, откуда можно их считать и вывести на LCD.
          Сейчас (с помощью ваших примеров) программа работает, только не проводится проверка ответа инвертора. Стоп, пуск, реверс и 8 разных частот (оборотов двигателя). Можно оставить и так но хочется сделать все правильно.
          Для чего это сделано. У обычно преобразователя все это есть(цепляй к соответствующим контактам кнопки и все), но мне достался с управлением по сети CClink . На нем только контакты для этой сети и разъем RS485. Через него можно настраивать инвертор, его я и использую RS232RS485.

  5. Есть ли среда разработка для PIC контроллеров для быстрого получения результата , с какими-то готовыми библиотеками или удобным скриптовым языком (по типу как в ардуино используется “processing”). А то у меня осталась сигнализация в доме (там все на Пиках), хотел ее задействовать.

    1. Не могу ничего подсказать, я программирую PIC-и на ассемблере в MPLAB, другими способами пока не интересовался.

  6. Классный проект!
    Если можно, хотелось бы увидеть передачу данных не только в сторону PIC16F628 но и в сторону PC.
    (То есть, что бы с микроконтроллера биты с данными отображались на Terminal v1.9b )

    1. Приветствую, в данном проекте на компьютер просто пересылается фраза “PIC Alive”. Вы что подразумеваете под битами данных? Передавать можно поток байтов (числа).

  7. Добрый день!
    Конечно же байты данных. Я описался.
    Таблицу в иходнике с надписью PIC Alive вижу, подпрограмму отправки символов из таблицы данных по USART то же вижу. А почему то в PROTEUS на терминале ничего нет.
    Вы отладку программы в чём делаете?( MPLAB)
    Куда можно скинуть проект . Может я чего то не полностью понял.

  8. Добрый день!
    Всё разобрался.
    Невнимательность кнопку на RA2 забыл нарисовать.
    Всё запустилось. Но только символы на терминале маленько не правильно отображаются.
    Но это скорее всего связано с тем что я использую MAX232.

    1. Я выложил модель в Proteus, там все работает.

  9. У Вас установлен Proteus 8.1.
    А у меня установлен Proteus 7.2 по этой причине открыть проект я не могу.
    Поэтому пришлось проект в Proteus создавать заново.

    1. Приветствую!
      Выводы 15, 16 (RA6, RA7) универсальные, они могут функционировать как обычные цифровые линии ввода/вывода, когда в конфигурации микроконтроллера выбран режим внутреннего тактового генератора.

      1. Да-да,я это уже понял)))
        Сижу как-раз изучаю это,а тут и ты ответил)

      2. А не подскажешь,в той схеме,что я ссылку дал (частотник для ассинхронного дв.) там автор в конце статьи дал и прошивку для PIC.
        А вот как проверить эту прошивку на ошибку?
        Может он туда ошибку занес случайно (или специально)?

        1. Можно попробовать собрать схему в Proteus, и провести эмуляцию. Ну или собрать схему в реальности и проверить, больше никак.

          1. Ок! Буду пробовать в Proteus – первый раз в жизни)

          2. Скачал Протеус-демоверсию только.
            Установил.
            Открыл.
            Обалдел.
            Удалил.
            Там все по не-нашему,ничего не понимаю.
            Буду паять реальную,но без высоковольтной части,только МП и его всю обвязку.Нагружу выходы его на светодиоды.
            Авось будет видно моргание светиков,как на Вашем видео)

          3. Скачал 7-ю версию,ключи активации,русификатор.
            Теперь хоть стало понятно что и как.

Имя (обязательно)Email (обязательно)Веб-сайт

Добавить комментарий