Виртуальные порты

Программирование микроконтроллеров

Виртуальные порты

alex83 » 15 июн 2015, 13:25

Данная статья является продолжением практического обучающего курса по программированию микроконтроллеров AVR.
Предыдущие статьи курса:
1. Микроконтроллеры - это же просто!
2. Работа с графическим LCD MT-12232A(C)


Следующей задачей должно было стать сопряжение отладочного модуля Freeduino2009 с ПК, т.е. чтобы его можно было не только прошивать по USB, но и "общаться" с программой посредством виртуального RS232 over USB через драйвер FT232R, но вот ведь не задача, линии порта D PD0(RXD) и PD1(TXD) ATmega168, которые отвечают за встроенный аппаратный UART уже заняты, т.к. порт D целиком отдан под шину данных индикатора. Можно было бы задействовать другой порт, но в этом микроконтроллере полноценный порт только один - порт D, а остальные представляют собой "огрызки", поэтому не остается ничего другого, кроме как "раскидать" шину данных индикатора на линии разных портов, а это значит, что придется дорабатывать библиотеку для индикатора MT-12232A, что делать ну совсем не хочется.
На самом деле есть очень простое решение - макросы, реализующие работу с виртуальными портами, с помощью которых можно конфигурировать виртуальные порты из любых свободных линий любых портов контроллера и работать с ними, как с полноценными портами. Изменения в коде библиотеки индикатора в этом случае ограничатся всего несколькими строчками. Недостатком этого решения является некоторое увеличение программного кода и как следствие будет занято больше свободной памяти, но в данном случае экономить нет смысла.
Подробнее о возможностях макросов виртуальных портов можно(нужно) почитать здесь.
port_macros.zip
(2.61 Кб) Скачиваний: 278
  1. Итак, качаем архив заголовочного файла с макросами виртуальных портов, распаковываем, копируем в папку с проектом, добавляем к проекту и сохраняем проект. Всё точно также как это было описано в предыдущей статье.
  2. Далее открываем заголовочный файл lcd_graph_lib.h и после последней строки с включением файла добавляем включение port_macros.h:
    Код: Выделить всё
    ...
    #include "port_macros.h"
    ...
  3. Ниже в разделе обязательных настроек заведем новую секцию "конфигурация виртуальных портов", где опишем конфигурацию виртуального порта "D", состоящего из линий реальных портов D и C. Теперь можно просто сдвинуть разъем шины индикатора чтобы освободить линии PD0 и PD1, а оставшиеся в подвешенном состоянии 6-й и 7-й биты шины индикатора просто перекинуть, например, на линии PC4 и PC5 порта C.
    Код: Выделить всё
    ...
    //конфигурация виртуальных портов
    //описание виртуального порта шины данных
    #define DB_PORT DB, D, _VIRT
    //описание выводов виртуального порта шины данных
    #define DB_0 D, 2, _HI
    #define DB_1 D, 3, _HI
    #define DB_2 D, 4, _HI
    #define DB_3 D, 5, _HI
    #define DB_4 D, 6, _HI
    #define DB_5 D, 7, _HI
    #define DB_6 C, 4, _HI
    #define DB_7 C, 5, _HI
    ...
  4. Далее открываем файл lcd_graph_lib.c библиотеки индикатора MT-12232, в котором нужно заменить обращения к порту шины данных на соответствующие вызовы макросов виртуального порта.
    Регистры порта шины данных определены в lcd_graph_lib.h как
    Код: Выделить всё
    //порт к которому подключена шина данных
    #define PORT_LCD_BUS PORTD 
    #define PIN_LCD_BUS  PIND
    #define DDRX_LCD_BUS DDRD

    Ищем эти псевдонимы в lcd_graph_lib.c и меняем на соответствующие вызовы макросов(пример):
    Код: Выделить всё
    //DDRX_LCD_BUS = 0xff;
    PM_DirPort(DB_PORT, 0xff); //вызов макроса записи в регистр DDR
    //PORT_LCD_BUS = 0xff;
    PM_WritePort(DB_PORT, 0xff); //вызов макроса записи в регистр PORT
    //stat = PIN_LCD_BUS;                 
    PM_ReadPort(DB_PORT, stat); //вызов макроса чтения регистра PIN
  5. После всех правок пробуем скомпилировать проект. В результате компиляции могут появится следующие предупреждения, но страшного в них ничего нет:
  6. Если никаких других предупреждений и ошибок нет, то заливаем программу в контроллер, после чего подключаем индикатор соответствующим образом с учетом переназначения битов шины данных и убеждаемся в правильной работе.
В качестве самопроверки и развития можно ещё перевести на виртуальные порты и управляющие линии индикатора.

Далее попробуем научить контроллер общаться с ПК посредством интерфейса UART и выводить на дисплей текст, набираемый на клавиатуре "большого брата".
Аватара пользователя
alex83
Имя: Александр

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1