вторник, 13 января 2015 г.

Работа в MPLABX

<< Назад к оглавлению

Для начала создадим новый проект
File->new project->Standalone project
Затем выбирается контроллер
Отлаживать будем через симулятор
Далее выбирается пакет. Если вы хотите писать на Си, то соответственно должен быть установлен компилятор
И далее вводим имя проекта. и кодировку UTF-8

Слева появится окно проекта со всеми файлами.
Файл линковщика нам не нужен. файлы .C и .asm должны лежать в source files, .h в header Files.

Чтобы создать новый файл, щелкаем правой кнопкой мышки, new и соответствующий файл. Для .asm нужно создать empty file и добавить расширение .asm
Скомпилировать проект Run->Clean and build Main project
По идее MPLABX может сам прошивать контроллеры, но он не полностью поддерживает программатор pickit2, Поэтому приходится пользовать HEX файл. Он будет лежать в: Каталог вашего проекта/dist/default(или название настройки)/production
File->project properties вызовет следующее окно
Где в XC8 global options можно задать смещение кода, чтобы прошивать программу бутлоадером. А во вкладке General - папки, в которых будет производиться поиск файлов.

Конфигурационные биты

Необходимо их настроить. Для этого идем в Window->PIC memory views->configuration bits

откроется окно, и выставляем там FOSC=INTOSCIO, WDT=OFF, MCLRE=OFF
Щелкаем правой клавишей и Generate Source Code to Output. Эта опция создаст код, необходимый для задачи конфигурационных битов. 
Копируем код, создаем файл заголовков config.h и вставляем сгенерированный код в конец файла.

Отладка программы.

установим точку остановки. Тыкаем на номер строки
И жмем debug->debug main project
программа остановлена в заданной точке
И мы можем пошагово эмулировать работу программы. F8 - следующий шаг, не заходя в функции, F7 - заходя.
В окне Watches можно ввести интересующие переменные и отслеживать как они изменяются по ходу работы. Вызывается window->debugging->watches
Через Stimulus и IO pins можно эмулировать напряжения на ножках контроллера и изменения регистров. включаются окна в window->simulator

Если вы зайдете в window->pic memory views,
то можно посмотреть изменения в процессе работы программы на регистры спец. назначения (SFR registers)
Либо память для хранения переменных (File registers)
Конфигурационные биты (Configuration bits)
и память программы. Вместе со строками дизассемблера (Program memory)





понедельник, 12 января 2015 г.

CAN интерфейс и контроллер pic18f2550 (XC8). Модуль MCP2515

<< Назад к оглавлению

Старую версию для компилятора C18 можно найти здесь
Мы будем говорить о контроллере pic18f2550, поскольку только он сейчас есть у меня перед глазами. Но все нижесказанное должно быть справедливо и для pic18f4550.
В этом контроллере есть специальные встроенные возможности общаться с периферией, но нету возможности создать сеть штатными средствами.
Предположим, что необходимо создать связь между несколькими отдаленными контроллерами. Можно конечно продумать то, как они будут общаться, написать для этого программу и установить усилители сигналов, чтобы их можно было передать на дальние расстояния. Но не много ли работы?
Есть множество готовых решений, с помощью которых можно это сделать.
Мы будем рассматривать CAN интерфейс. Он изначально был предложен фирмой Bosch и в сети есть множество информации, описывающей can интерфейс.
В двух словах о нем.
- передача идет по двум проводам
- настраивается скорость передачи информации
- существует механизм проверки сообщений
- гарантированная доставка сообщений.
На самом деле мне кажется абсолютно неважным описывать что-то столько раз документированное.
http://ru.wikipedia.org/wiki/Controller_Area_Network
Так же официальная спецификация на стандарт CAN 2.0
http://www.bosch-semiconductors.de/media/pdf_1/canliteratur/can2spec.pdf

Есть специальный интерфейсный контроллер CAN от фирмы microchip MCP2515
http://ww1.microchip.com/downloads/en/DeviceDoc/21801G.pdf
Это специальное "добавление" к контроллеру, осуществляющее реализацию сети CAN. И для этого контроллера еще нужен будет передатчик MCP2551
http://ww1.microchip.com/downloads/en/DeviceDoc/21667f.pdf
Ниже показано подключение pic18f2550 к MCP2515
Файлы проекта:
здесь
Проект рассчитан на то, чтобы быть прошитым через bootloader. Если вы прошиваете через программатор, то необходимо сделать следующее: удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера

Общение между pic18f2550 и MCP 2515 происходит с помощью протокола SPI, созданного для общения с периферийными устройствами.
Для SPI используются соответствующие ноги SDI SDO SCK и CS
причем SDI (input) mcp2515 нужно подключить к SDO (output) pic18f2550. А в качестве CS используется любой цифровой вывод контроллера.

В проекте следующие файлы
main.c - основной файл команды
io.h - файл, в котором настроены вводы выводы pic18f2550
mcp2515.h - адреса регистров и команд внутри модуля MCP2515
spi_functions.h - файл для работы со SPI интерфейсом
config.h - конфигурационные биты

Все необходимые комментарии даны непосредственно в коде программы

В программе используются следующие специфические комманды

Настройка контроллера производится в функции userinit(); и в последствии в CANinit();
нужно выставить соответствующие пины контроллера на вывод (SDO,SCK) и ввод (SDI) - читай подробнее в комментариях к контроллеру.

потом идет перезагрузка контроллера и модуль CAN переводится в конфигурационный режим. Все основные настройки можно делать только в этом режиме. Настраиваются соответствующие конфигурационные регистры. Во-первых bit-timing (CNF1,CNF2,CNF3). Все узлы сети CAN должны работать на одной тактовой частоте.

Потом настраиваются маски и фильтры передачи. Грубо говоря это адреса, который наш узел будет принимать. Читайте подробнее в документации.
Настраивается идентификатор передачи. - это адрес, с которым будет передаваться сообщение от этого узла.

У контроллера MCP2515 есть возможность отправлять сообщение при высоком сигнале на входах RTS. Мы отключаем их. Будем отправлять с помощью команд, передаваемых через SPI.
настраиваем прерывания. Например, когда контроллер увидит сеть CAN вывод INT будет нулем. По умолчанию на нем будет 1.
Так же настраиваются RX0BF и RX1BF. Когда буфер 0 будет заполнен, на RX0BFпропадет напряжение.
Потом мы включаем нормальный режим, в котором контроллер работает.

А потом передаем сообщение (по факту передастся при первой возможности - подключении к CAN сети). И просто мигаем светодиодом на RA2 когда сообщение передано

Проверить работу вы сможете, когда у вас 2 таким образом сконфигурированных контроллера, или другой узел CAN. Светодиод будет мерцать после передачи сообщения. Если он просто горит - то не проходит конфигурация модуля MCP2515


У модуля CAN есть множество возможностей. Советую почитать спецификацию CAN и техническое описание MCP2515.

Подключение узлов осуществляется следующим образом.

То, что указано на схеме подключения имеет выводы CANH и CANL это и должно быть подключено к сетевым линиям.

Прошу спрашивать, если что-либо непонятно или требует дополнительного рассмотрения.

Файл настроен на работу 125Кб/с
Рассчитывается скорость работы CAN (NBR) модуля следующим образом:
TQ=2*(BRP+1)/Fosc
Fosc - частота генератора на MCP2515
BRP - Делитель частоты. Задается в коде
Tbit=Tsync+Tprop+TPS1+TPS2
Tsync=TQ
Остальные же величины задаются а коде программы
NBR=1/Tbit

пятница, 9 января 2015 г.

Урок 5. USB. Сторона контроллера (обновлено 25.04.2015)

<< Назад к оглавлению

Найдена ошибка. В старом проекте для грамотной работы под бутлоадер нужно было указать --CODEOFFSET=1000 в настройках проекта. XC8 global options->additional opptions. Спасибо Глебу Галиеву. 

Это переработанная статья. В ней используется пакет MPLABX и компилятор XC8. Старую статью можно найти здесь. 
Все, теперь добрались мы до чего-то интересного. Протокол USB.
Наша схема будет аналогична приведенной в уроке 3 про бутлоадер.
Я проверял на PIC18f2550 но и на PIC18f4550 должно бы работать.


Только еще пару ножек контроллера мы будем использовать, как датчики, чтобы проверить, правда ли все у нас работает.
Файл проекта: Ссылка
Здесь вы найдете сам проект для MPLABX и программы для компьютера, через которые идет общение с USB устройством.

ВАЖНО! Проект собран для работы с бутлоадером. Если вы прошиваете через программатор, то необходимо сделать следующее: удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера.

Этот пример - копия с hid - custom demo из пакета MLA. Поскольку в оригинале он обращался к библиотекам через относительный путь как ../../../../Microchip/usb и.т.д. То для быстрой работы надо установить MLA и положить проект так же как примеры. В тот же каталог. Внизу статьи написано как запустить оригинальный файл. В моем варианте удалены все файлы, которые не относятся к нашему контроллеру, добавлены комментарии. Переделан немного код, для того, чтобы он запускался для обоих контроллеров: 2550 и 4550. и USB библиотека и некоторые настройки контроллера перенесены в папку проекта.
Контроллер наш, поскольку имеет аппаратную поддержку протокола USB имеет в своей памяти определенные места, в которые нужно записать настройки usb. это первый главный момент. В основном все это находится в файле usb_descriptors.c. Вы можете открыть этот файл и посмотреть комментарии или даже отредактировать.
И в теле программы мы будем вызывать функцию USBDeviceTasks(), которая выполняет в общем-то всю работу по обмену информации через USB.
Плюс, нужно определить некоторые стандартные функции, которые вызываются при получении нашим устройством различных команд, в момент подключения к хосту например. без них, устройство так и не сможет обнаружиться. Эти команды находятся в функции USER_USB_CALLBACK_EVENT_HANDLER файла main.c и особенно здесь не рассматриваются, так как они осуществляют рутинную стандартную работу и вы будете вряд ли их менять.
На данный момент библиотека работает следующим образом:

Функция USBDeviceTasks()

Для того, чтобы поддерживать работу USB, когда хост обращается к устройству с сообщением, в течение определенного времени устройство должно дать ответ. В случае, если это не происходит, хост может просто отключить наше устройство, посчитав его сломанным.
Чтобы обработать usb сообщение и выслать ответ, нужно вызвать функцию этой библиотеки:
USBDeviceTasks(); ну и чтобы отправилось правильное сообщение надо подготовить буферы вывода и прочее.
В нашем примере мы будем вызывать эту функцию через прерывания от USB модуля. Есть и другой выбор: для того, чтобы вовремя давать ответ хосту, можно просто использовать цикл.

USB дескрипторы

Для корректной работы нашего устройства нужно будет задать USB дескрипторы. В общем-то это описание нашего устройства. Они содерждат класс устройства, в нашем случае это - HID (Human Interface Device, которым могут быть мышки, клавиатуры, или вообще любое устройство) и имя устройства. Все эти параметры заданы в файле usb_descriptors.c, который уже добавлен в проект. Перед началом работы хост с устройством обмениваются дескрипторами, это дает понять, каким образом будет осуществляться взаимодействие устройств.

Файлы adc.c leds.c button.c

В этих файлах находятся простенькие функции, как например, мигнуть светодиодом, считать АЦП, проверить, нажата ли кнопка.

Файл app_device_custom_hid

В этом файле находится функция UserHIDTasks(), которая собственно и делает всю работу. Мы ее вызываем из основного цикла файла main.c. Вся обработка команд от хоста происходит в этой функции. И все действия - тоже через нее.

Комментарии к программе

Напоминаю, что USB устройство может передать данные только по запросу с хоста.
В проекте, который залит сюда, указан сдвиг для работы с bootloader'ом. Для того чтобы его убрать - удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера.

Суть такая: у нас есть наш функции и функции usb библиотеки. Сначала в main.c происходит инициализация, потом просто крутится главный цикл программы. Через него все и работает. Через прерывания вызывается USBDeviceTasks(). Контроллер через модуль USB получает информацию от хоста (компьютера), и тот "просит" контроллер сделать то или иное действие. переключить светодиод, или отправить какую-то информацию. Если мы отправляем информацию, то она кладется в буфер, и уходит со следующим USBDeviceTasks().

Для того, чтобы проверить работу контроллера, запускайте любую из программ в приложенном файле. 
В следующем уроке мы будем рассматривать как раз эту программу для компьютера, которая пересылает информацию контроллеру. То есть USB интерфейс на стороне компьютера.

Оригинальный проект из MLA

Вот как собрать оригинальный проект. Но я надеюсь, что вам хватит и моего проекта, вверху этой страницы
Нам понадобится пакет Microchip Libraries for Applications (MLA) Ссылка зеркало
Качаем этот файл и устанавливаем.
Мы будем собирать пример HID - custom demo
лежит он в папке с установленной программой:
\microchip\mla\v2014_07_22\apps\USB\Device\HID - Custom\firmware
Внутри в папке firmware - прошивка для контроллера. В остальных - программы для компьютера.
Дело в том, что в Microchip libraries каждый проект создан для десятка разных контроллеров, и учиться на этом коде довольно проблематично. В проекте есть несколько настроек для разных контроллеров. выбираются эти настройки через File->Project properties->Manage configurations
 Изначально из наших контроллеров там присутствует только pic18f4550 и для этого нужно открыть настройку проекта PICDEM FSUSB.mcp
Это по идее для такой учебной платы picdem fsusb. Она как раз работает на контроллере pic18f4550.
Распиновка там другая. Вы увидите в таких файлах как led.c button.c. Я специально поменял используемые ножки контроллера, чтобы программа запускалась не только на pic18f4550 но и на 18f2550.
Если у вас именно 18f2550, то в настройках проекта можно поменять контроллер с pic18f4550 на 2550.
Все файлы настроек лежат в папках проекта, например, system_config\picdem_fusb