Предыдущие статьи курса:
1. Микроконтроллеры - это же просто!
2. Работа с графическим LCD MT-12232A(C)
Следующей задачей должно было стать сопряжение отладочного модуля Freeduino2009 с ПК, т.е. чтобы его можно было не только прошивать по USB, но и "общаться" с программой посредством виртуального RS232 over USB через драйвер FT232R, но вот ведь не задача, линии порта D PD0(RXD) и PD1(TXD) ATmega168, которые отвечают за встроенный аппаратный UART уже заняты, т.к. порт D целиком отдан под шину данных индикатора. Можно было бы задействовать другой порт, но в этом микроконтроллере полноценный порт только один - порт D, а остальные представляют собой "огрызки", поэтому не остается ничего другого, кроме как "раскидать" шину данных индикатора на линии разных портов, а это значит, что придется дорабатывать библиотеку для индикатора MT-12232A, что делать ну совсем не хочется.
На самом деле есть очень простое решение - макросы, реализующие работу с виртуальными портами, с помощью которых можно конфигурировать виртуальные порты из любых свободных линий любых портов контроллера и работать с ними, как с полноценными портами. Изменения в коде библиотеки индикатора в этом случае ограничатся всего несколькими строчками. Недостатком этого решения является некоторое увеличение программного кода и как следствие будет занято больше свободной памяти, но в данном случае экономить нет смысла.
Подробнее о возможностях макросов виртуальных портов можно(нужно) почитать здесь.
- Итак, качаем архив заголовочного файла с макросами виртуальных портов, распаковываем, копируем в папку с проектом, добавляем к проекту и сохраняем проект. Всё точно также как это было описано в предыдущей статье.
- Далее открываем заголовочный файл lcd_graph_lib.h и после последней строки с включением файла добавляем включение port_macros.h:
- Код: Выделить всё
...
#include "port_macros.h"
...
- Ниже в разделе обязательных настроек заведем новую секцию "конфигурация виртуальных портов", где опишем конфигурацию виртуального порта "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
...
- Далее открываем файл 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
- После всех правок пробуем скомпилировать проект. В результате компиляции могут появится следующие предупреждения, но страшного в них ничего нет:
- Если никаких других предупреждений и ошибок нет, то заливаем программу в контроллер, после чего подключаем индикатор соответствующим образом с учетом переназначения битов шины данных и убеждаемся в правильной работе.
Далее попробуем научить контроллер общаться с ПК посредством интерфейса UART и выводить на дисплей текст, набираемый на клавиатуре "большого брата".