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

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

1 19 99

Разобрался почему глючила прошивка SAK'a. Он не включил в листинг директиву CONFIG
Когда я отключил, то что не нужно (WDT, например) все стало ОК!

 

Различия между 628 и 628А:
http://www.microchip.ru/files/d-sheets-rus/PIC16F62x-PIC16F6xxA.pdf

Splav56, Вы правы, тут причина в конфигурации. Поэтому лучше задавать слово конфигурации в программе. Наглядный пример того, о чём я уже упоминал.

SAK, мне, признаться, не вполне понятен этот фрагмент:

org 20h
TEMP res 1

Почему сделано именно так? Обычно ведь используют EQU или cblock.

Splav56, какие дальнейшие планы? Предлагаю тщательно проанализировать программу с подробными разъяснениями для тех, кому что-либо неясно. А также научиться использовать симулятор MPLAB с имитацией внешних воздействий (нажатий на кнопки). Так, чтоб работа программы была хорошо видна.

Кстати, я TEMP разместил по адресу 073h случайно. Это совсем не ошибка, это моё право. Просто логичнее было бы разместить по адресу 072h, подряд. Особенности адресов 070h - 07Fh всем понятны? (см. стр.15 даташита)

 

Splav56: Разобрался почему глючила прошивка SAK'a. Он не включил в листинг директиву CONFIG
Да, я в том посте об этом упоминал.

picmaniac: org 20h TEMP res 1 Почему сделано именно так?
Это делает программу легко переносимой. Вначале объявлается с какого адреса начинается выделение переменных (регистров) а затем только объявляем сколько байтов (регистров) резервируем. Например, программа была написана для PIC16F84 и адресное пространство выделялось с 0Ch (взято из конкретной программы):

org 0Ch
_port0 res 1
_port1 res 1

__BeginInitData res 0 ; Начало области инициализации данных
_keyb res 1
_keytmr res 1
_keyold res 1
_level res 1
_Water res 1
_Fabric res 1
_EMode res 1
_Process res 1
_Mode res 1
_TimerMS res 1
_TimerS res 1
_TimerM res 1

__EndInitData res 0 ; конец области инициализации данных
_CycleTime res 1
_PauseTime res 1
_DirectWash res 1
_WashTimer res 1
_WashMode res 1
_Blink res 1
_SubMode res 1
_BeepFlag res 1
__Save_W res 1
__Save_STATUS res 1
_counter res 1
_kbrddelay res 1

Если теперь захотим перенести эту программу на PIC16F628 достаточно поменять org 0Ch на org 20h.
В случае использования EQU придётся менять каждое значение, да и ошибиться с распределением регистров в этом случае гораздо легче. А почему именно так, обыяснить сразу трудно, просто этот принцип более похож на принцип распределения памяти в x86, который для меня ближе.

 

Ясно. Обычно в MPASM испольуется cblock в таких случаях.

 

picmaniac: Предлагаю тщательно проанализировать программу с подробными разъяснениями для тех, кому что-либо неясно. А также научиться использовать симулятор MPLAB с имитацией внешних воздействий (нажатий на кнопки). Так, чтоб работа программы была хорошо видна.
Кстати, я TEMP разместил по адресу 073h случайно. Это совсем не ошибка, это моё право. Просто логичнее было бы разместить по адресу 072h, подряд. Особенности адресов 070h - 07Fh всем понятны? (см. стр.15 даташита

Это все уже пройденный для меня этап. И в MPLAB я Вашу программу, также как и SAK'a прогнал вдоль и поперек, в том числе и задавая асинхронные стимулы на pin'ы RB7:RB4. А иначе я не смог бы проверить правильность отработки алгоритма и понять почему моя программа часть алгоритма отрабатывала правильно (в части соответсвия загорания с/д нажатым клавишам), а часть нет - неправильно работале при нажатии более одной клавиши. Насчет использования РОН и их адресов я тоже в курсе. Сейчас добрался до модели этого алгоритма в Протеусе, схему нарисовал, файл загрузил, но не работает. . Видно где-то что-то не допер. Предлагаю в новой ветке (а может быть и здесь) пока смоделировать likbez01 в Протеусе, а остальные пока поработают над программой, а то только я и тренируюсь. Правда я не против одиночного обучения.

 

Вот проект в Протеусе

 

Я уже выкладывал проект для Proteus См. выше
Приаттачу и здесь. Работает нормально, проверил.
Эх, хорошо - выходные впереди! Немного принял...

Ждём пожеланий от начинающих - надо ли объяснять подробно про имитацию нажатий кнопок в симуляторе?

35965.zip

 

picmaniac: Я уже выкладывал проект для Proteus См. выше

Я не могу его открыть. У меня Протеус версии 6.1

 

Как я говорил, эту же задачу можно (а внекоторых случаях будет и нужно) решить с использованием цикла. Операторов я много не сэкономил, но это потому что всего 4 кнопки и всего 4 комбинации, а если бы например задача стояла отображать HEX-код нажатых кнопок, экономия бы была очень даже существенная. За основу взял программу picmaniac ◊ , то что вставил я набрано бльшими буквами и на позицию табуляции меньше. В MPLab-е всё работает замечательно, на макете не проверял- до паяльника доберусь только в понедельник.

35984.asm

 

Ну и как мы договорились, блок-схема того куска, который я изменил. Кстати в этой программке очень полезный приёмчик- считывание констант из памяти программ. Очень часто используется, например при выводе 7-сегментного кода на индикатор. Так что следующим шагом можно выводить код нажатых кнопок в виде HEX-цифр от 0 до F на знаковый 7-сегментный индикатор.