Первая сборка на макетной плате
Пришло время поделиться впечатлениями.
Подсчитав свои финансовые возможности, я отказался от некоторых запланированных покупок и решил упростить программатор, поскольку в настоящий момент собираюсь работать только с контроллером PIC16F628A. Я убрал из схемы программатора внешнее питание, из схемы адаптера к программатору - все панельки, кроме 18-ножечной, и использовал батарейку «Крона» в качестве внутреннего источника питания (для высоковольтного режима программирования).
На макетной плате я тоже установил панельку под микросхему, с тем, чтобы проверить все схемы на одной макетной плате.
К схеме конвертера я добавил стабилизатор на 5 В. Кабель от разъема DB9 конвертера RS232-RS485 я распаял на плате конвертера, хотя вначале собирался использовать разъем. После исправления нескольких монтажных ошибок (и эти «грабли» имели место) я решил проверить программатор, поскольку не в полной мере был уверен, что правильно разобрался со схемой.
С программой MPLAB программатор, естественно, не работает. В Интернете есть схемы программаторов, работающих с MPLAB. Они не настолько сложны, чтобы их не использовать, но я решил, что лучше воспользоваться программой PonyProg2000, схему программатора к которой собрал. Приходится скачивать последнюю версию программы, поскольку в предыдущей нет контроллера PIC16F628A.
Рис. 1.42. Программа РопуРгод2000 |
Первое, что я делаю после запуска программы - выбираю устройство в меню Device Ріс 16 micro (Устройство Ріс 16 micro) или в окошках на панели. После выбора устройства проверяю работу порта в меню Setup (Interface Setup... (Установки интерфейса), используя СОМ2-порт), задаю номер порта и SI Prog I/O. После щечка кнопки Probe (Проба) я получаю сообщение - Test Ok. Затем провожу калибровку (меню Setup Calibration (Установки Калибровка)) и опять получаю одобрение.
На этом везение заканчивается.
Вставляю микросхему в панельку, и первое, на что отваживаюсь - щелкаю кнопку чтения Read Device (Прочитать устройство) на инструментальной панели. Итог показан на рис. 1.43.
:L. > ЩЩЩ Ш
Г Device ткяпд or unknown device (£4) I Abort 1 Jflnofe.#
Рис. 1.43. Первое сообщение программы PonyProg2000
Программа не распознает микросхему. Обращаюсь на сайт, с которого «срисовал» программу. В разделе типовых вопросов и ответов нахожу похожую ситуацию и рекомендацию воспользоваться кнопкой Ignore (Игнорировать). Что и осуществляю.
Процесс проходит успешно, о чем сообщает программа, но в буфере сплошные единицы, а у меня сплошные сомнения - прочитал ли я хоть что-то? Я отключаю разъем от СОМ-пор - та, получаю сообщение об успешном чтении, но в буфере одни нули, а тест порта не проходит. Появляется надежда, что я что-то читаю.
Вторая волна сомнений касается вопроса: работает ли микросхема, если я не записал биты конфигурации, определяющие режим работы тактового генератора контроллера, ведь я еще ничего не записывал. Поэтому решаюсь записать биты конфигурации, выбрав режим работы тактового генератора INTRC (сэкономил, отказавшись от покупки кварца). В меню Command Security and Configuration Bits...
(Команда Биты конфигурации и защиты) устанавливаю флажки (рис. 1.44).
C«»f%ur«ttenaiu! Security toll»
'"Шг 'mcip mm
M - г ■ і 0*
Jja^Lj&f»-MR
Рис. 1.44. Задание слова конфигурации микроконтроллера
Сознаюсь, что, не разглядев, как устанавливаются биты, я сделал все наоборот - поставил галочки там, где должны быть нули. Я полагал, что, отметив биты, установлю их в единицу, а в результате закрыл все программирование. Пришлось исправить свою ошибку.
Биты конфигурации записались, я сбрасываю их и читаю. Появляется надежда, что вопрос с программированием решен.
Но первые «мягкие» грабли, на которые я наступаю - программа ведет себя не так, как я от нее ожидаю. Я загружаю в программатор файл, созданный по версии, написанной на языке С. В итоге, я могу записать в контроллер все нули или все единицы. Но стоит мне попытаться изменить в буфере хотя бы один байт, используя возможность редактирования в меню Edit Edit Buffer enabled (Редактирование Буфер редактирования доступен), чтобы записать что-то другое, как контроллер полностью обнуляется. С этой проблемой я долго не могу разобраться, поскольку не понимаю, вина ли это программы, или я что-то делаю не так. Я работаю с программой впервые и, судя по ошибке с установкой бит конфигурации, могу сделать множество ошибок. Конечно, все попытки обойти проблему успехом не увенчались.
Устав от проб и ошибок, я решаю изменить подход - если я не смогу запрограммировать контроллер, то сама микросхема, которую я так берегу, мне будет не нужна. Либо я смогу ее запрограммировать, либо выброшу сразу.
Я решаюсь сделать попытку программировать ее как микросхему другого типа. Удачной оказывается попытка программирования РІС 16X84. И я решаю, что именно так я буду ее программировать, а биты конфигурации запишу под эгидой PIC16F628. Это неудобно, но не покупать же дорогой программатор!
Итак, я могу записать в микросхему что-то кроме нулей и единиц.
Я загружаю НЕХ-файл, созданный программой, написанной на языке С, используя на инструментальной панели кнопку Read Program Memory (FLASH) (Прочитать память программы).
Вторые «мягкие» грабли выгладят так - вся программа не занимает и двух строк в буфере. Я в это не верю. Поскольку файл имеет расширение HEX, я пытаюсь просмотреть его НЕХ-редактором и не вижу ничего, кроме символьной записи. Тогда я открываю файл блокнотом:
:10000000830100308A0004282030840038300D201D :100010008301392B04068001840A0406031D0A2883 :020020000034АА
:1004Е20083018С1Е712А1А0808008301В700831247 :1004F20003130C1E782A370899000800F401F5014D :100502000310F30CF20C031C8D2A7008F407710817 :100512000318710AF5070310F00DF10D7208730448 :1005220003190034812A8301850107309F00831655 :100532008501FE30860090308312980006308316C3 :100542009800683099008312061083169B011C14D0 и т. д.
Признаться, не ожидал. Пришлось углубиться в руководства и понять, что этот файл предназначен для загрузки в программатор и формат файла имеет вид:
: BBAAAATTHHH... ННСС
Где ВВ - количество байт в строке файла, АААА - адрес записи данных, ТТ - указатель типа строки (00 - данные, 01 - конец файла, 02 - адрес сегмента, 04 - линейный адрес), ННН...НН - собственно данные, а СС - контрольная сумма строки.
И данных в файле, конечно, больше, чем я получаю в буфере. В чем причина? После того как я понял, что после первых строк идет безусловный переход по адресу, находящемуся в конце программной области, а первый адрес после перехода лежит вне буфера, стало понятно, почему я не получил в буфере ничего интересного.
Первой приходит мысль исправить адреса в файле HEX. Но это потребует изменения контрольных сумм, которые придется либо рассчитывать на калькуляторе, либо писать программу пересчета. Сущность же проблемы состоит либо в том, что файл подготовлен под загрузку в программатор, работающий с MPLAB, либо в том, что срок действия демонстрационной версии компилятора языка С закончился.
В размышлениях - купить компилятор (каким-то образом) или найти знакомых, работающих с микроконтроллерами и «напроситься в гости», чтобы поработать некоторое время на чужом компьютере (меня эти походы изрядно «притомили»), я решаю поступить иначе.
Делаю последнюю попытку - компилирую программу в MPLAB для микросхемы PIC16F627A, которая имеет объем памяти программы вдвое меньше, чем моя PIC16F628A.
Теперь, загружая НЕХ-файл в программу PonyProg2000, я вижу больше пары строк в буфере. Записываю этот файл (для микросхемы РІС 16X84), используя кнопку Write Program Memory (FLASH) (Записать память программы). Записываю биты конфигурации (для микросхемы PIC16F628). Проверяю в меню Command Verify All (Команда Проверить все) и получаю подтверждение правильности записи, затем переношу микросхему на макетную плату, где собран интерфейс и установлены светодиоды.
С этого момента опять начинаются «железные» грабли. Ничего у меня, естественно, не работает.
Первое, что следует сделать, - определиться, что у меня работает, а что нет. Уверен ли я, что программатор у работает? Нет. Уверен ли я, что программа написана правильно? Нет. И т. д. Я понимаю, что «нет» - это самое определенное, что я получил к настоящему моменту.
Тогда я решаю последовательно удалять эти «нет». В Интернете нахожу пример программирования на языке С для микроконтроллеров РІС - простая программа, которая заставляет светодиод мигать.
#include "picl6f62xa. h"
#define bitset(var, bitno) ((var) 1= 1 « (bitno)) #define bitclr(var, bitno) ((var) &= -(1 « (bitno)))
Main() {
Unsigned int k;
CMCON = 0x07; //Компараторы выключены.
TRISA = OblllllllO; //RAO выход,
Repeat:
For (k=0; k<45000; k++); //"Пустой" цикл для временной задержки.
Bitset (PORTA, 0); //Выставить на RAO высокий уровень, for (k=0; k<45000; k++);
Bitclr (PORTA, 0); //Выставить на RAO низкий уровень.
Goto repeat; ■ //Повторить ещё раз. }
Я компилирую ее и программирую микросхему. После установки на макетную плату и включения питающего напряжения я получаю первое «да». Светодиод мигает. По меньшей мере, программатор работает.
Теперь я хочу проверить работу конвертера RS232-RS485. Удобнее всего было бы использовать осциллограф. Но у меня нет ничего кроме мультиметра с набором обычных функций измерения напряжения, тока, сопротивления.
Кое-что я, все-таки, проверить могу. Для этого мне потребуется программа работы с СОМ-портом. Можно написать на любом из языков программирования то, что работало бы с СОМ-портом. Но это займет время (позже это приходится сделать). Нахолсу в Интернете программу под названием RS232Pro, в которой я смогу 25 дней поработать бесплатно. Есть, правда, предложение зарегистрировать программу, но сайт, где предлагается ее зарегистрировать, отсутствует. Думаю, 25 дней - это срок, когда я либо получу положительные результаты, либо откалсусь от всего.
Проверяю, включив мультиметр, на измерение постоянного напряжения на пределе 20 В входные напряжения от СОМ-порта. Некоторое время уходит на то, чтобы понять, что нужно щелкать кнопку RTS OFF в программе RS232Pro, но, наконец, я делаю и этот решительный шаг. Затем отправляю в порт последовательность символов 12345, и вижу, что у меня меняется напряжение на выводе TXD. Меньше, но меняется напряжение на выводе 3 микросхемы МАХ1483. Хотелось бы проверить линию RS485.
Для этой цели я пытаюсь передать простой текстовый файл с помощью программы RS232Pro, встав мультиметром на линию (в режиме измерения постоянного напряжения на пределе 20 В). Напряжение заметно меняется. Это убеждает меня, что конвертер, может быть, и не совсем правильно, но работает.
Порт ц, модуль я настраиваю на скорость 9600, 8 бит данных, 1 стоповый бит без бита четности. Первым делом, я упрощаю программу релейного модуля, оставив только один символ R на прием, который сразу зажигает светодиод. Модуль не работает, но обращение к документации на микросхему контроллера PIC16F628A заставляет меня задуматься в правильности выбора скорости. Я проверяю, меняя значение регистра SPBRG, разные скорости (соответственно, каждый раз перепрограммируя контроллер), пока не зажигается светодиод. Скорость оказывается равной 2400 (я даже не уверен, что ее не следует снизить до 1200). Модуль начинает реагировать на команды, передаваемые с компьютера.
В данный момент мне кажется, что дальше все образуется само собой, и модуль заработает. Но получается не совсем так. Мне даже удается получить ответ от модуля на запрос о состоянии реле. Ответ немного странный, но, хотя бы какой - то, он есть. Теперь беда другая. Одно выполнение команды, один ответ на запрос о состоянии реле, и модуль «виснет». Он не реагирует больше на команды до момента включения после сброса питания.
Я человек терпеливый, но и мое терпение истощается по мере продвижения к выполнению поставленной задачи. Главная беда - я не уверен, что программа RS232Pro подходит для работы. По этой причине отправляюсь к знакомым, чтобы написать программку для работы с модулем. Думаю, я так надоел им, что они дарят мне старенькую версию Visual Basic (не совсем полную), которую кто-то из них получил на презентации во время одной из конференций. Мне важно, что версия работает.
Итак, я создаю заготовку для среды программирования (о чем речь пойдет в конце этой части книги), куда добавляю три кнопки: одну - для отправки команд, другую - для получения команд и последнюю - для того, чтобы полученные команды отобразить.
Используя оба варианта работы с СОМ-портом, я постепенно начинаю понимать, что после получения команды запроса состояния реле модуль начинает передавать ответ, но одновременно читает все, что есть на линии RS485. Прочитав же обращение к релейному модулю, свой номер модуля, он пытается реагировать на эти события. То есть, при передаче модулем в сеть каких-либо данных нужно дать время на передачу - это во-первых, и отключить на время передачи приемник - это во- вторых.
Не с первого раза получилась и запись состояния реле в EEPROM - скоро сказка сказывается, да не скоро дело делается.
Вот такие впечатления, которыми я обещал поделиться, остались у меня после посещения магазина и попытки претворить в жизнь компьютерную версию разработанного модуля.
Когда я написал, что отправляюсь в магазин, и поделюсь впечатлениями, я и сам не ожидал, что впечатлений будет так много. Конечно, отсутствие опыта, не совсем подходящие средства разработки, разница между тем, что нарисовано на бумаге, и тем, что будет создано на основе этого рисунка - все так, но... Я не ожидал, что столько «граблей» окажется на пути реализации достаточно простой конструкции.
Однако продолжим создание запланированных модулей.