Оглавление: 24/07/20

DIY. PIC32MZ.


Микроконтроллер PIC32MZ.

Цель разработки – создание прототипа для отладки функционала и начала работ программирования финального изделия.

Принципиальная схема и разводка печатной платы в DipTrace, доступны по ссылке pcon.zip. Программный код генерации меандра на ассемблере в MPLAB X доступен в архиве pic32mz_ports.X.zip

В отладочной плате реализован следующий функционал:

  • Микроконтроллер PIC32MZ0512EFE064

  • Преобразователи напряжений 9-36V на 3.3 и 5V

  • LED Дисплей WINSTAR 20*4 (PCF8574)

  • Матричная клавиатура 4*4 (PCF8574)

  • Управление восьмью внешними устройствами (PCF8574)

  • RS232 для связи с ПК и подключений GPS модуля

  • I2C преобразователь уровней 3.3V/5.0V для связи с линукс контроллером.

  • I2C часы реального времени.

  • I2C датчик клавиатуры.

  • SPI SD карта

  • RS485 ISO3088

Собрана и тестируется минимальная конфигурация. Контроллер PIC32MZ0512EFE064 и преобразователи напряжения на TPS5420-5V и MCP16301T-I/CH-3.3V.

10.2018 Требуются исправления в схеме:

  • RS232 SP3232EUCN-L не подключен к выводам микроконтроллера, подаётся неверное питание 5V.

  • Сделать подтягивающие резисторы I2C для 3.3V через перемычки, так как внешний контроллер содержит подтягивающие резисторы 1.8ком.

  • Вывести ICSSP в центр, чтобы подключать PickIt 3 без переходников.

  • Убрать JTAG. Не заработал. Нет желания иразбираться почему.

  • Добавить в затвор 2N7002 резисторы 10-20 ом, добавить светодиоды.

  • Вывести линию EN дисплея на микроконтроллер.

I2C.

Программный код примера записи в регистр pcf8574 MPLAB X доступен по ссылке pic32mz_i2c.X.zip.



При работе аппаратного I2C модуля процессора установлена и устранена следующая проблема. При операциях записи вначале выставляется адрес периферийного устройства. После того как периферийное устройство декодирует свой адрес, оно выдаёт команду ACK, прижимая линию SDA к земле. Модуль I2C процессора корректно формирует все необходимые флаги. Процессор быстрый и следующая команда может начать выполнение записи данных, пока линия данных ещё находится в состоянии нуля. Прижатая к земле линия SDA и корректное продолжение работы контроллера с I2C вещи несовместимые.

Ошибка линии данных SDA определяется флагом I2C1STATbits.BCL и решается путем установки в ноль и затем поднятием шины SCL. В примере работы с шиной I2C выполняется повторная инициализация модуля I2C. При инициализации модуля шина SDA и SCL сбрасывается в ноль. После инициализации i2c I2C1CONbits.I2CEN = 1, работа продолжается корректно.

Demonstrating an I2C Master device.

Communication Protocols on the PIC24EP and Arduino .

Каталог с исходными текстами I2C Miscrochip.

Подключение LCD к порту pcf8574.

Подключение дисплея к порту pcf8574 позволяет работать с дисплеем с внешнего линукс/windows компьютера по i2c шине. Поскольку используется только один порт pcf8574, работа с дисплеем осуществляется в 4-х битном режиме.

Фактическая запись данных в дисплей происходит по спаду фронта линии EN. Поскольку линия EN так же находится на выводе pcf8574, приходится повторно передавать байт данных, это избыточно. Возможно есть смысл подключать EN к порту микроконтроллера.

I2C1SendByte( lcdByte | LCD_EN ); // Записать данные.
I2C1SendByte( lcdByte ); // Сброить EN.

Алгоритм записи байта данных в порт pcf8574 следующий. Отправляем на шину адрес устройства, получаем подтверждение, затем отправляем байт данных. Далее, цикл повторяется. В случае подключения LCD дисплея к pcf8574 этот алгоритм не работоспособен, так как при декодировании портом своего адреса на линиях данных порта отмечаются нежелательные изменения уровней сигнала. В случае подключения LCD дисплея к порту PCF8574 и работы его в четырёхбитном режиме алгоритм должен быть следующий. Выставляем адрес порта к которому подключен дисплей, получаем подтверждение, и далее, байт за байтом отправляем все необходимые данные. Передача одного байта данных в четырёхбитном режиме выполняется за две операции.

I2C1SendAddress( LCD_WA ); // Адрес pcf8574.
// 0x33
I2C1SendByte( 0b00110100); // 0x3 | EN.
I2C1SendByte( 0b00110000); // Сброс EN.
I2C1SendByte( 0b00110100); // 0x3 | EN.
I2C1SendByte( 0b00110000); // Сброс EN.
// 0x32
I2C1SendByte( 0b00110100); // 0x3 | EN.
I2C1SendByte( 0b00110000); // Сброс EN.
I2C1SendByte( 0b00100100); // 0x2 | EN.
I2C1SendByte( 0b00100000); // Сброс EN.

В исходных текстах программ Вы можете видеть предварительную инициализацию дисплея отправкой магических команд 0x33, 0x32. Считаем, что режим, в котором находится дисплей при включении не определён. Поэтому переводим дисплей в восьмибитный режим и затем в четырёхбитный. После выполняем обычную процедуру инициализации дисплея, передавая команды и данные уже в четырехбитном режиме.


LCD interfacing with Microcontrollers tutorial.

16x2 LCD interfacing in 4 bit mode

Связь с ПК через RS485.

Программа ввода и отображения вводимых символов с компьютера на микроконтроллер и обратно на языке Cи доступна по ссылке: pic32mz_rs485Echo.X.zip, аналогичная программа ввода/вывода текста на ассемблере по протоколу RS485 доступна по ссылке: pic32mz_uart.X.zip

Передача данных в стандарте RS485 организована через аппаратный интерфейс UART микроконтроллера, к которому подключен передатчик ISO3088. Использование ISO3088 избыточно, поскольку гальваническая развязка не используется, используется преобразование уровня из 3.3V UART в 5 вольт RS485.

Для связи с компьютером используется преобразователь интерфейса RS485 в USB Uport 1150. В качестве терминала использована штатная программа, идущая с Moxa Uport 1150, работоспособен и PuTYY терминал.

ISO3088 требует переключения из режима передачи в режим приёма данных по шине. Это достигается изменением состояния четвертого и пятого выводов ISO3088. При смене направления передачи данных требуется задержка в програмном коде UART.

...



USB to RS485 Serial Converter Cable.

Section 21. UART.

Реализация языка программирования форт.

Среда разработки форт-системы MPLAB X IDE, ассемблер, начальный этап разработки ядра форт-системы представлен по ссылке: pic32forth



  • Иницируется модуль UART микроконтроллера и в бесконечном цикле идёт опрос наличия данных во входном регистре. Как только система получает очередной символ с клавиатуры терминала ПК по протоколу RS485, в зависимости от режима он отправляется обратно на терминал ПК для отображения на экране и заносится в буфер ввода микроконтроллера. Признаком конца ввода и начала обработки введённой информации является получение кода 0x0D. что соответствует нажатию на клавиатуре клавиши Enter.

  • Лексемой или форт-словом в языке форт является любая последовательность алфавитно-цифровых символов разделённой пробелами. Из буфера ввода выбирается очередное слово. Система начинает поиск его в словаре. На данном этапе это однонаправленный список содержащий в себе описание форт-слова и ссылку на исполнимый код. Если результат поиска успешен, из описания извлекается адрес поля кода и него передаётся управление.

  • Если форт-слово в словаре не найдено, то ядро системы пытается преобразовать его в число с учётом текущей системы исчисления, которая может быть любой и задаётся внутренней переменной base либо признаками 0x -шестнадцатеричное или 0b - двоичное. Если преобразование успешно, число помещается на собственный стек форт системы, адрес вершины которого всегда находится в регистре $s0. Если нет, выдаётся сообщения об ошибке что слово не найдено. На этом, как ни странно, работу по реализации форт-интерпретатора в достаточно широком смысле этого слова можно считать законченной.

  • Параметры с которыми работает форт-слово следует предварительно поместить на стек. Итогом работы форт-слова может являться результат который также будет помещён на форт-стек. Примером являются арифметические и логические операции когда со стека снимаются два операнда, после над ними выполняется операция и результат вновь записывается на стек: 13 12 + Результат операции сложения двух чисел 25 будет на стеке.

    ...

  • Данные на стеке представлены в двоичном виде. Чтобы вывести данные на экран значение со стека, их следует преобразовать в ASCII символы. Для подобных преобразования в форт-систему введён буфер вывода. Форт слово '.' (точка) снимает со стека число, преобразует в число системы счисления по умолчанию, результат операции как последовательность ascii символов переносится в буфер вывода. Для удобства .hex - преобразует значение на стеке в шестнадцатиричную систему счисления, .bin - в двоичную и переносят значения со стека в буфер вывода как последовательность ascii символов. Далее этот буфер можно вывести на экран ПК по RS485, выполнив форт-слово "cr", либо передать далее по сети другому устройству.

Мищук Андрей.
Сбербанк: 5469 3800 8271 1366
energy4all@inbox.ru
Буду признателен за поддержку!