PSoC – Полезные вещи для разработчика

Здесь собраны различные материалы, облегчающие жизнь, а также некоторые советы.

 

Система команд PSoC (pdf-документ, 94 кБ)
Шпаргалка программиста, где команды процессорного ядра M8C сгруппированы не по алфавиту или коду, как в фирменной документации, а по функциональному назначению.

Возможные соединения аналоговых блоков PSoC (pdf-документ, 92 кБ)
Шпаргалка для проектирования структуры PSoC (ее можно напечатать с обратной стороны предыдущего документа). В виде графов показаны возможные связи между аналоговыми блоками. Шесть диаграмм соответствуют шести разным входам блоков CTB и SCB. В скобках даны значения полей управляющих регистров, соответствующие указанным соединениям.

Список Модулей Пользователя (htm-документ, 9 кБ)
Стартовая страничка для быстрого (не загружая PSoC Designer) доступа к описаниям Модулей Пользователя, которые разбросаны по разным директориям. Скопируйте этот файл в рабочий каталог PSoC Designer-а и создайте для него ярлык в любом удобном для вас месте.


Как установить новый Модуль Пользователя

Все стандартные модули, используемые в PSoC Designer, собраны в раздел ...\PSoC Designer\Data\Stdum. («Stdum» – сокращенно «Standard User Modules»). Скопируйте туда папку, содержащую файлы нового Модуля Пользователя. Чтобы не смешивать стандартные модули с новыми, лучше всего завести для них новую папку, например, ...\PSoC Designer\Data\Newum.

Но это добавление может остаться незамеченным. Дело в том, что для ускорения работы PSoC Designer (версии 4.3 и старше) создает базу данных всех имеющихся модулей, но делает это только однажды – при первом своем запуске. Чтобы заставить его обновить эту базу данных, надо удалить специальный файл usermodulemanifest.xml. При следующем запуске PSoC Designer-а этот файл реконструируется и будет содержать уже новую информацию.

Есть и второй способ обновления базы данных – через главное меню PSoC Designer (пункт Tools –> Refresh Manifest). Чтобы опция стала доступной, стартуйте PSoC Designer «с чистого листа», т.е. без создания нового проекта, либо закройте уже открытый проект.


Как создать свой Модуль Пользователя

Эта процедура не документирована фирмой Cypress. Но здесь можно применить армейский принцип «делай как я» («делай как Cypress»). Данные о конкретном Модуле Пользователя содержатся в нескольких файлах общеупотребительных (большей частью – текстовых) форматов, которые собраны в отдельную папку. Папки со стандартными Модулями Пользователя находятся в разделе ...\PSoC Designer\Data\Stdum.

Для создания своего модуля выберите наиболее подходящий (как вам кажется) Модуль Пользователя в качестве образца, скопируйте папку под новым именем и начинайте редактировать ее содержимое, попутно знакомясь с организацией данных в файлах. Делайте это постепенно, проверяя на каждом шаге работоспособность сделанных изменений – неправильно составленный модуль просто не загрузится, а искать причину будет проблематично, т.к. в данном случае PSoC Designer не имеет средств диагностики.

Самый главный файл имеет расширение xml и находится в корневой папке модуля. В этом файле прописаны имя модуля и его группирование в том виде, как это будет происходить в PSoC Designer-е, а также версия, файлы иконок, схемы и помощи. Как правило, модуль, в зависимости от серии микросхемы, реализуется по-разному (а в каких-то сериях вообще не может быть реализован), поэтому в разделе MULTI_CHIP_ARCH_MODULE_LIST задаются имена дополнительных файлов описаний xml, соответствующих этим реализациям, а также имена подпапок, где эти файлы находятся.

Затем приступайте к редактированию дополнительных файлов xml. Это наиболее сложная часть работы, так как структура файлов имеет много уровней и повторяющихся элементов, а значения полей не всегда понятны. В сомнительных случаях можно обратиться к другим модулям и посмотреть, как там реализуется та или иная возможность.

В папках, где находятся дополнительные файлы xml, должны находиться файлы *.plc, ограничивающие размещение модуля в матрице мест – в зависимости от серии микросхемы. Это обычные текстовые файлы, и они также нуждаются в редактировании.

Следующим этапом будет редактирование файлов *.asm, *.inc, *.h – это уже более привычные для программиста вещи. Эти файлы содержат процедуры API и определения, которые будут включаться в проект при выборе модуля из библиотеки. Здесь будет только одно пожелание – подробно комментируйте текст, а все процедуры предваряйте шапкой-описанием, ведь вашим модулем будут пользоваться другие люди!

Ну и совсем уж простой (заключительно-оформительский) этап – написание файлов справки, создание изображений иконок, схем, диаграмм и т.п. (файлы *.html, *.ico, *.emf, *.gif). И все – ваш модуль готов! В сложных случаях (когда при выборе модуля из библиотеки пользователю предлагается несколько вариантов реализации) потребуется редактирование файла сценария *.js.

Попытки создания собственных модулей были успешными. Мною были созданы два модуля – Oneshot8 и Random, Уэсом Рэндалем (Wes Randall) – модуль OneWire. Все они доступны для свободного скачивания здесь.


Как перенести настройки PSoC Designer

Может случиться так, что вам потребуется полностью снести PSoC Designer, а затем установить его снова с сохранением предыдущих настроек, либо быстро перенести настройки с одного компьютера на другой.

В этом случае запустите Редактор Реестра Windows (файл regedit.exe) и экспортируйте следующие два раздела (перед этой процедурой у вас должен быть установлен полностью настроенный PSoC Designer):
[HKEY_CURRENT_USER\SOFTWARE\Cypress MicroSystems\PSoC Designer] и
[HKEY_LOCAL_MACHINE\Software\Cypress MicroSystems\PSoC Designer].

У вас получатся два файла с расширением *.reg. Сохраните их, либо объедините для удобства в один файл *.reg. Впоследствии для переноса настроек достаточно просто провести процедуру соединения этих файлов с основным реестром Windows (щелкните правой кнопкой по этим файлам и выберите пункт «Слияние»).

Я использую вот такой файл настроек (на ваш страх и риск).


Как вывести русский текст на экран LCD

Вы подключили ЖК-индикатор, установили Модуль пользователя «LCD», но при попытке вывести сообщение вроде:
      LCD_PrCString("Здорово,приятель");
получаете на экране абракадабру. А ведь использованный вами индикатор наверняка русифицирован!

Это – не «глюк» компилятора «Си» или Windows, а неприятная особенность этих индикаторов. С чьей-то легкой руки решено было русифицировать LCD-модули «старыми социалистическими методами», т.е. используя копеечную экономию ценою удобства применения. При русификации добавились только те символы, начертание которых уникально, а остальные буквы (такие как А, В, Е и т.д) предполагается брать из «английской» половины знакогенератора.

В итоге кодировка русских символов не совпадает ни с одной из общепринятых (например, во Windows). Кроме того, в зависимости от разработчика, LCD-модули могут иметь различные варианты кодировок и даже неполный набор русских символов! Наиболее массовым является вариант, называемый «эпсоновским». Его кодовая таблица показана на рисунке справа.

Для вывода сообщений придется немного потрудиться и вписать коды символов непосредственно в выводимую строку. Предыдущий пример должен быть написан следующим образом:
      LCD_PrCString("\xA4\xE3opo\xB3o,\xBEp\xB8\xC7\xBFe\xBB\xC4"); //string "Здорово,приятель"

Чтобы не мучиться с ручной кодировкой, я написал небольшую утилиту, генерирующую готовые строки. Скачать ее можно отсюда (версия 1.1, zip-архив 136 кБ).


Ликвидация короткого импульса на цифровых выходах при старте микросхемы

При подаче питания на микросхему на выходах, подключенных к цифровой части, на короткое время появляются высокие логические уровни. Это связано с особенностями начальной инициализации микросхемы – подпрограмма, которая вставляется в ваш проект и отвечает за конфигурацию внутренних межсоединений, была написана вот так, а не иначе.

Если такое поведение критично для вас (например, ключ, подключенный к такому выходу, не должен длительное время или вообще находиться в открытом состоянии), то наиболее просто решить проблему можно следующим образом. На этапе конфигурирования внутренней структуры нужно просто оставить эти выходы в состоянии управления от ЦПУ («StdCPU»), а в начало программы вставить код, переподключающей выходы к цифровой части, например:

or  reg[PRT0GS],0b00111111 ;lines 0..5 of Port0 are connected to Global Bus.	

или на «Си»:

PRT0GS|=0b00111111; //lines 0..5 of Port0 are connected to Global Bus.	

Как подать сигнал на модулятор

Не все межсоединения можно осуществить с помощью PSoC Designer. Часть возможностей остается «скрытой за кадром», но именно ими иногда хочется воспользоваться. Тогда единственно возможный путь – найти описание соответствующих регистров и правильным образом их запрограммировать. Например, цифровой сигнал с шины GOE[0] на модулятор аналогового столбца 2 (там этим заведует блок «типа C») подается следующим образом:

M8C_SetBank1 ;set Bank 1
or  reg[AMD_CR0],0b00100000 ;modulation source for col 2 is GOE[0]	
M8C_SetBank0 ;restore Bank 0

«Си» сам следит за выбором нужного банка регистров:

AMD_CR0|=0b00100000; //modulation source for col 2 is GOE[0]	

Источники сигналов кодируются четверками битов в регистрах AMD_CR0 (для столбцов 0 и 2) и AMD_CR1 (для столбцов 1 и 3):

0000b – Zero (off)
0001b – Global Output Bus, even bus bit 1 (GOE[1])
0010b – Global Output Bus, even bus bit 0 (GOE[0])
0011b – Row 0 Broadcast Bus
0100b – Analog Column Comparator 0
0101b – Analog Column Comparator 1
0110b – Analog Column Comparator 2
0111b – Analog Column Comparator 3

Эти комбинации справедливы для серии CY8C27xxx (в других сериях возможности микросхем могут быть иные, включая разное количество столбцов в матрице аналоговых блоков). Исходное состояние регистров – 0000b, поэтому в данном случае справедлива простая установка битов с помощью логической операции «или». Во всех остальных случаях следует аккуратно очищать и устанавливать соответствующие биты, а также с осторожностью использовать операцию присваивания (затрагиваются все биты в байте).


Как напрямую подключиться к COM порту компьютера (используюя модули UART, TX8 или RX8), не прибегая к специализированным микросхемам преобразователей уровней

В простейшем случае потребуется установить только инверсию линий данных. Для входных данных – это изменение свойства «Invert RX Input» у используемого модуля на «Inverted», для выходных – выбор функции инверсии у блока LUT, через который проходит сигнал. COM-порт ограничивает отдаваемый им ток до безопасных значений, а внутренние защитные диоды, имеющиеся на выводах микросхемы, приведут уровни напряжений +12 и -12В к безопасным 5,5 и -0,5В (при 5-вольтовом питании микросхемы). Что касается выходов PSoC – COM-порты современных компьютеров, как правило, прекрасно распознают перепады уровней 0/5 В.

Для пущей безопасности можно поставить токоограничительные резисторы – 10 ком на вход PSoC и 1 ком на выход. Меньшее значение для выхода объясняется тем, что работать ему приходится на емкостную нагрузку – линию передачи, а это приводит к затягиванию фронтов сигнала (что ограничит максимальную скорость).


Задание скорости обмена по UART

Для задания скорости обмена по UART нет необходимости в размещении отдельного модуля-предделителя. Его с успехом может заменить программируемый источник тактового сигнала VC3.

Для получения стандартной скорости 9600 бод достаточно тактовую частоту 24 МГц поделить на 312. Деление можно получить двумя ступенями – например, на 6 (VC1) и на 52 (VC3). Внутренний тактовый генератор имеет достаточную стабильность (2,5%), а деление на 312 вместо требуемых 312,5 даст погрешность всего лишь 0,16%. Напомню, что тактовая частота модуля должна в 8 раз превышать скорость приема/передачи.


Экономим блоки...

1. Зачастую нет нужды размещать на кристалле дополнительные таймеры для того, чтобы периодически вызывать на выполнение какой-либо код. Используйте ISR (обработчики прерываний) от уже имеющихся модулей, если в их состав входят блоки, отсчитывающие тактовые импульсы (типичный случай – ADCINC). Для этого в тело ISR вставьте свой код, дополнив его программным делителем частоты, если требуются более редкие вызовы. Помните, что есть еще один резерв – использовать прерывания от «спящего таймера».

2. Генератор 2-х фаз с защитным интервалом между импульсами реализуется всего лишь на одном блоке (PRS8). Для этого задайте фактор сравнения у PRS8 «Equal To» и инициализиуйте его регистры следующим образом:

PRS8_POLY_REG=0b00001000;	//Polynomial Register
PRS8_SEED_REG=0b00000001;	//Shift=Seed Register
... далее стартуем блок
Длительность выходных импульсов (и защитного интервала) составит один период тактовой частоты. Частота выходных импульсов будет в 4 раза ниже тактовой.

3. Поделить частоту одновременно на 2 и 4 можно также одним блоком. Для этого объедините выходы от предыдущего случая функцией «OR» или «XOR» (с помощью блока LUT), и в дополнение к делению на 4 вы получите деление на 2.

4. Поделить на 4 системную частоту SYSCLK можно вообще без блока. Для этого закольцуйте одну из входных линий рядов RI[x] через глобальные линии GlobalIn и GlobalOut, используя функцию «НЕ» у соответствующего блока LUT. Режим синхронизации по входу линии следует выставить «SysClk_Sync». Детально это расписано в Application Note AN2375 – «Simple Divider SYSCLK/4».


Исследуем возможности модуля PRS8 (программа «PRS8_Model»)

Интересно повозиться с модулем PRS8 для получения нужных последовательностей или комбинированных делителей частоты. Например, конфигурация

PRS8_POLY_REG=0b10000000;	//Polynomial Register
PRS8_SEED_REG=0b00010101;	//Shift=Seed Register
приводит к построению комбинированного делителя на 2 и 8 (выходы «OutputBitStream»XOR«CompareOut» и «CompareOut» соответственно).

Чтобы не мучиться с ручными вычислениями, я написал программу, пошагово генерирующую состояния модуля (качать отсюда: PRS8_Model.zip, архив 156 кБ). Программа полностью моделирует работу модуля в зависимости от начальных условий. Не забывайте, что результат работы компаратора «актуализируется» только в следующем такте!

еще...


antiradio.narod.ru/psoc
Дата создания документа: 29.04.2008. Последнее обновление: 30.10.2014.