Первая сборка на макетной плате


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

Делюсь.


Подсчитав свои финансовые возможности, я отказался от некоторых запланированных покупок. Я решил упростить программатор, поскольку не собираюсь в настоящий момент работать с множеством микросхем, а только с контроллером PIC16F628A. Я убрал из схемы программатора внешнее питание, из схемы адаптера к программатору убрал все панельки, кроме 18-ножечной, и использовал батарейку «Крона» в качестве внутреннего источника питания (для высоковольтного режима программирования).


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


К схеме конвертера я добавил, как говорил выше, стабилизатор на 5 вольт (в спецификации он есть, на схеме отсутствует). Кабель от разъема DB9 конвертера RS232-RS485 я распаял на плате конвертера. После исправления нескольких монтажных ошибок (и эти «грабли» имели место) первым делом я решил проверить программатор, поскольку не в полной мере был уверен, что правильно разобрался со схемой.


С программой MPLAB, что было бы идеально, программатор, естественно, не работает. Использую программу PonyProg2000, схему программатора к которой собрал. Приходится скачивать последнюю версию1 программы, поскольку в предыдущей нет контроллера PIC16F628A.




Рис.26


Первое, что я делаю после запуска программы, выбираю устройство в меню Device-Pic 16 micro, или в окошках на панели. После выбора устройства я проверяю работу порта в меню Setup (Interface Setup… используя COM2-порт), задаю номер порта и SI Prog I/O. После нажатия клавиши Probe, я получаю сообщение - Test Ok. Затем провожу калибровку (меню Setup-Calibration), и опять получаю одобрение.


На этом везение заканчивается.


Вставляю микросхему в панельку, и первое, на что отваживаюсь – нажимаю клавишу чтения Read Device на инструментальной панели. Итог:


Программа не распознает микросхемы. Обращаюсь на сайт, с которого «срисовал» программу. В разделе типовых вопросов и ответов нахожу похожую ситуацию и рекомендацию воспользоваться клавишей Ignore. Что и осуществляю.


Процесс проходит успешно, о чем сообщает программа, но в буфере сплошные единицы, а у меня сплошные сомнения – прочитал ли я хоть что-то? Я отключаю разъем от COM-порта, получаю сообщение об успешном чтении, но в буфере одни нули, и тест порта не проходит.

Появляется надежда, что я что-то читаю.




Рис.27


Вторая волна сомнений касается вопроса о работе микросхемы, если я не записал биты конфигурации, определяющие режим работы тактового генератора контроллера. Поэтому я решаюсь сделать первую запись – записать биты конфигурации, выбрав режим работы тактового генератора INTRC (сэкономил, отказавшись от покупки кварца). В меню Command-Security and Configuration Bits… устанавливаю флажки.





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


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


Но первые «мягкие» грабли, на которые я наступаю – программа ведет себя не так, как я от нее ожидаю. Я загружаю в программатор файл, созданный по версии, написанной на языке «С». В итоге, я могу записать в контроллер все нули, или все единицы. Но стоит мне попытаться изменить в буфере хотя бы один байт, используя возможность редактирования в меню Edit-Edit Buffer enabled, чтобы записать что-то другое, как контроллер полностью обнуляется. С этой проблемой я долго не могу разобраться по причине не понимания, вина ли это программы, или я что-то делаю не так. Я работаю с программой впервые, и, судя по ошибке с установкой бит конфигурации, могу сделать множество ошибок. Конечно, все попытки обойти проблему успехом не увенчались.


Устав от проб и ошибок, я решаю изменить подход – если я не смогу запрограммировать контроллер, то сама микросхема, которую я так берегу, мне будет не нужна. Либо я смогу ее запрограммировать, либо выброшу сразу.


Я решаюсь сделать попытку программировать ее как микросхему другого типа. Удачной оказывается попытка программирования PIC16X84. И я решаю, что именно так я буду ее программировать, а биты конфигурации запишу под эгидой PIC16F628. Это неудобно, но не покупать же достаточно дорогой программатор!


Итак, я могу записать в микросхему что-то кроме нулей и единиц.


Я загружаю, используя на инструментальной панели клавишу Read Program Memory (FLASH), HEX-файл откомпилированный программой, написанной на языке «С».


Вторые «мягкие» грабли, на которые я наступаю, выглядят так - вся программа не занимает и двух строк в буфере. Я в это не верю. Поскольку файл имеет расширение HEX, я пытаюсь просмотреть его HEX-редактором и не вижу ничего, кроме символьной записи. Тогда я открываю файл блокнотом и вижу:


:10000000830100308A0004282030840038300D201D

:100010008301392B04068001840A0406031D0A2883

:020020000034AA

:1004E20083018C1E712A1A0808008301B700831247

:1004F20003130C1E782A370899000800F401F5014D

:100502000310F30CF20C031C8D2A7008F407710817

:100512000318710AF5070310F00DF10D7208730448

:1005220003190034812A8301850107309F00831655

:100532008501FE30860090308312980006308316C3

:100542009800683099008312061083169B011C14D0 и т. д.


Признаться, не ожидал. Пришлось углубиться в руководства и понять, что этот файл предназначен для загрузки в программатор, что формат файла имеет вид:


:BBAAAATTHHHHHCC


Где BB – количество байт в строке файла, AAAA – адрес записи данных, TT – указатель типа строки (00 – данные, 01 – конец файла, 02 – адрес сегмента, 04 – линейный адрес), HHHHH – собственно данные, а СС – контрольная сумма строки.


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


Первой мысль - исправить адреса в файле HEX. Но это потребует изменения контрольных сумм, которые придется либо рассчитывать на калькуляторе, либо писать программу пересчета. Сущность же проблемы, если я правильно понимаю, либо в том, что файл подготовлен под загрузку в программатор, работающий с MPLAB, либо в том, что срок действия демонстрационной версии компилятора языка «С» закончился.


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


Делаю последнюю попытку – компилирую программу в MPLAB для микросхемы PIC16F627A, которая имеет объем памяти программы вдвое меньше, чем моя PIC16F628A.


Теперь, загружая HEX-файл в программу PonyProg2000, я вижу больше пары строк в буфере. Записываю этот файл (для микросхемы PIC16X84), используя клавишу Write Program Memory (FLASH). Записываю биты конфигурации (для микросхемы PIC16F628). Проверяю в меню Command-Verify All, и получаю подтверждение правильности записи, затем переношу микросхему на макетную плату, где собран интерфейс и установлены светодиоды.


С этого момента опять начинаются «железные» грабли. Ничего у меня, естественно, не работает.


Первое, что следует сделать, как я считаю, это определиться, что у меня работает, а что нет. Уверен ли я, что программатор у меня работает? Нет. Уверен ли я, что программа написана правильно? Нет. И т.д. Я понимаю, что «нет», это самое определенное, что я получил к настоящему моменту.


Тогда я решаю последовательно удалять эти «нет». В Интернете нахожу пример программирования на языке «С» - простая программа, которая заставляет светодиод мигать.



#include "pic16f62xa.h"


#define bitset(var,bitno) ((var) |= 1 << (bitno))

#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))


main() {

unsigned int k;

CMCON = 0x07; //компараторы выключены

TRISA = 0b11111110; //RA0 выход

repeat:

for (k=0; k<45000; k++); //"пустой" цикл для временной задержки

bitset(PORTA, 0); //выставить на RA0 высокий уровень

for (k=0; k<45000; k++);

bitclr(PORTA, 0); //выставить на RA0 низкий уровень

goto repeat; //повторить ещё раз

}


Я компилирую ее, и программирую микросхему. После установки на макетную плату и включения питающего напряжения я получаю первое «да». Светодиод мигает. По меньшей мере, программатор работает.


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


Кое-что, я все-таки проверить могу. Для этого мне потребуется программа работы с COM-портом. Совсем вылетело из головы, что терминал Windows предназначен для работы с телефоном. Можно написать что-то на любом из языков программирования, что работало бы с COM-портом. Но это займет время (позже это приходится сделать). Нахожу в Интернете программу под названием RS232Pro, которая позволит мне 25 дней поработать с ней. Есть, правда, предложение зарегистрировать программу, но сайт, где предлагается ее зарегистрировать, отсутствует. Думаю, двадцать пять дней – это срок, когда я либо получу положительные результаты, либо откажусь от всего.


Проверяю, включив мультиметр на измерение постоянного напряжения на пределе 20В, входные напряжения от COM-порта. Некоторое время уходит на то, чтобы понять, что нужно нажимать кнопку RTS OFF в программе RS232Pro, но, наконец, я делаю и этот решительный шаг. Затем отправляю в порт последовательность символов 12345, и вижу, что у меня меняется напряжение на выводе TXD. Меньше, но меняется напряжение на выводе 3 микросхемы MAX1483 (см. Рис.14). Хотелось бы проверить линию RS485, тем более что я не стал добавлять резисторы 470 Ом, как это нарисовано на оригинальной схеме конвертера, а ограничился резистором 120 Ом в линии, как рекомендовано изготовителем микросхемы MAX1483.


Для этой цели я пытаюсь передать простой текстовый файл с помощью программы RS232Pro, встав мультиметром на линию (в режиме измерения постоянного напряжения на пределе 20В). Напряжение заметно меняется, что убеждает меня в том, что конвертер, может быть, и не совсем правильно, но работает. Что-то дышит и на соответствующем вводе контроллера.


Порт и модуль я настраиваю на скорость 9600, 8 бит данных, 1 стоповый бит без бита четности. Первым делом я упрощаю программу релейного модуля, оставив только один символ R на прием, который сразу зажигает светодиод. Модуль не работает, но обращение к документации на микросхему контроллера PIC16F628A заставляет меня задуматься в правильности выбора скорости. Я проверяю, меняя значение регистра SPBRG, и разные скорости (соответственно, каждый раз перепрограммируя контроллер), пока не зажигается светодиод. Скорость оказывается равной 2400 (Я даже не уверен, что ее не следует снизить до 1200). Модуль начинает реагировать на команды, передаваемые с компьютера.


В данный момент мне кажется, что дальше все образуется само собой, и модуль заработает. Но получается не совсем так. Мне даже удается получить ответ от модуля на запрос о состоянии реле. Ответ немного странный, но, хотя бы какой-то, он есть. Теперь беда другая. Одно выполнение команды, один ответ на запрос о состоянии реле, и модуль «виснет». Он не реагирует больше на команды до момента включения после сброса питания.


Я человек терпеливый, но и мое терпение истощается по мере продвижения к выполнению поставленной задачи. Главная беда - я не уверен, что программа RS232Pro, с которой я работаю, вполне достаточна для работы. По этой причине отправляюсь к знакомым, чтобы написать программку для работы с модулем. Думаю, я так надоел им, что они дарят мне старенькую версию Visual Basic (не совсем полную), которую кто-то из них получил на презентации во время одной из конференций. Мне важно, что версия работает.


Итак, я создаю заготовку для среды программирования (о чем речь пойдет в конце первой части), куда добавляю три кнопки – одну для отправки команд, другую для получения команд, последняя для того, чтобы полученные команды отобразить.


Используя оба варианта работы с COM-портом, я постепенно начинаю понимать, что после получения команды запроса состояния реле, модуль начинает передавать ответ, но одновременно читает, все, что есть на линии RS485. Прочитав же обращение к релейному модулю, прочитав свой номер модуля, он пытается реагировать на эти события. Т.е. при передаче модулем чего-либо в сеть нужно бы дать время на передачу, это, во-первых, и отключить на время передачи приемник, это, во-вторых.


Не с первого раза получилась и запись состояния реле в EEPROM - скоро сказка сказывается, да не скоро дело делается.


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


Когда я написал, что отправляюсь в магазин, и поделюсь впечатлениями, я и сам не ожидал, что впечатлений будет так много. Конечно, отсутствие опыта, не совсем подходящие средства разработки, разница между тем, что нарисовано на бумаге, и тем, что будет создано на основе этого рисунка – все так, но… Я не ожидал, что столько «граблей» окажется на пути реализации достаточно простой конструкции. Бывает.




1http://www.LancOS.com

Hosted by uCoz