Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 11 99

gan: когда прога приближается к 1000 команд и в ней море переходов, условных-безусловных- с прямой- косвенной адресацией- кучей подпрограмм, а метки переходов в самых разных концах
Это означает плохую структурированность программы, программа должна строиться из функционально законченных блоков, по возможности полностью умещающихся на экране. Тогда будет трудно запутаться и избавит от сложного поиска ошибок. Как показывает практика - это всегда возможно. Лично я никогда не пытаюсь написать весь алгоритм сразу в один приём. Вначале описываются более общие действия, а затем дополняются фрагменты выполняющие более мелкие операции, в этом очень помогают подпрограммы. К текущему заданию это не относится т.к. здесь вся программа поместится на экране.

picmaniac: Седьмую пока не пробовал, не вижу надобности.
У меня установлена седьмая, но отличия от шестой пока не заметил

 

ОК! Я тоже голосую за версию алгоритма предложенную SAK'om. Но тогда просьба к SAK'y:
дополнить алгоритм, начиная от "начало" (т.е. инициализацию), т.е опубликовать полную версию алгоритма и снабдить подробным описанием каждой части. Помните, что это предназначено для людей, не имеющих опыта в программировании. После этого я смогу присоединить его к уже утвержденным частям проекта: ТЗ и схеме.

 

Ну не надо присваивать мне чужие идеи, ведь этот алгоритм фактически предложен picmaniac'ом, а я только совсем чуть-чуть его изменил. Но раз народ требует. Инициализация представляет собой отдельный блок с одним входом и одним выходом, потому я выделил его отдельно. Там происходит конфигурирование выводов на ввод/вывод, включение подтягивающих резисторов, ну и отключение компараторов для pic16f628, хотя последнее, наверное, и не особо нужно т.к. мы не используем порт A. В основном алгоритме после инициализации задаётся начальное значение для вывода в порт B, а дальше начинается бесконечный цикл в котором выводится подготовленное значение W в порт B для обновления состояния светодиодов, читается значение того же порта для определения состояния кнопок, обнуляются биты не относящиеся к кнопкам, полученное значение последовательно сравнивается с заданными значениями для нахождения нажатой кнопки. Далее в зависимости от состояния кнопок в W попадает новое значение для порта B и цикл начинается сначала. Собственно, во всём алгоритме уже нет ничего нового уже всё было описано ранее и я не знаю что ещё можно добавить. Слов уже написано больше чем их будет в программе . Обычно в таких случаях я предпочитаю отвечать на возникающие вопросы, чем описывать каждый шаг.

 

как выглядит в коде конфигурирование портов? включение подтягивающих резисторов? вообще в пике по умолчанию всё включено? (таймеры, юсарты, и пр.) или выключено? если не трудно приведите пару строчек кода конфигурирование portB и включение подтягивающих резисторов.
ЗЫ: у меня стоял мплаб 5.70, поставил 7.20 всё заработало нормально.

 

Конфигурирование порта В:
bsf STATUS,RP0 ;Обращение к банку 1 для доступа к TRIS и OPTION_REG
movlw B'11110000' ; грузим в аккумулятор константу
movwf TRISB ;Устанавливаем выводы порта B как '11110000' (1-in, 0-out)
bcf STATUS,RP0 ;Возврат в банк 0

Подключение подтягивающих резисторов порта В:
bsf STATUS,RP0 ; обращаемся к банку 1
bcf OPTION,7 ;устанавливаем бит 7 (-RBPU) в ноль
bcf STATUS,RP0 ;возвращаемся в банк 0
Естественно обе процедуры можно и нужно объединить после выбора банка 1.

 

semm: вообще в пике по умолчанию всё включено? (таймеры, юсарты, и пр.) или выключено?

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

 

SAK: Но раз народ требует.

Если всем всё понятно в алгоритме и он всех устраивает, то можем его утвердить и присоединить к ТЗ и схеме.
Если непонятно, после прочтения описАния алгоритма SAK'а, то задавайте вопросы.

 

picmaniac Я курсе насчёт #include <P16F628.inc, просто не стал грузить дополнительными операциями, чтоб было понятней и меньше шансов споткнуться на ровном месте.

<b>Левон а не могли бы Вы написать ту же программу с комментариями

Левон, я взял эту программу из аппноута AN526 (поищите на сайте Микрочипа), там описываются математ. операции, в том числе и эта см. APPENDIX H:BINARY (16-BIT) TO BCD LISTING, правда на английском но с блок-схемами, если всё-же будут вопросы, давайте заведём отдельную ветку, чтоб не раздувать эту.

SAK: Это означает плохую структурированность программы
Если у вас перед глазами будет блок-схема алгоритма, шансы создать программу с плохой структурированностью резко уменьшаются, и наоборот. Об этом собственно и шла речь. Оптимизировать программу надо на уровне квадратиков, ромбиков и стрелок, а не на уровне ассемблерных команд. Речь, конечно, не идёт о профессиональных программистах, которые могут пропустить этот шаг в силу своего профессионализма.
По поводу предложенного алгоритма- согласен. Пример того, каким в конечном итоге д.б. алгоритм. Проще уже наврное, придумать сложно. Меня только смущают СИ-операции, вроде ":=" , "==", "!=". Не всем, наверное это будет понятно.

 

gan: ":=" , "==", "!=". Не всем, наверное это будет понятно.
да. не всем......
Splav56 спасибо за примеры....
блин мплаб 7.30 от 5.70 как небо и земля...... проблем пока небыло....

 

Cегодня подвернулся случай и я уломал админа, чтобы он мне инсталлировал MPLAB. Версия 5.70.40. Столкнулся с той же фигней, что и semm. Обмануть удалось так: взял первый попавшийся файл с расширением .asm и поместил его в папку EXAMPLE MPLAB (там будут размещаться проекты). При создании нового проекта присоединил его как файл - источник. Система на компе - Вин 2000. Дома с ХР таких проблем не было.