Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
MPLAB, нужно щёлкнуть по слову, а в раскрывшемся списке, щёлкнуть по строке Откроется окно Window , в котором Вы увидите область EEPROM памяти данных В ней можно определить и адрес , и содержимое любой ячейки Если после открытия файла примера "программы ", Вы откроете окно Window , то во всех ячейках, Вы увидите значения чисел, установленных по умолчанию FFh, хотя, казалось бы, в соответствии с текстом программы, в части из них, должны "лежать " числа, отличные от. В чем дело А дело в том , что если ассемблирования текста программы ни разу не производилось, тов окне Вы увидите, во всех ячейках, значения чисел, установленных по умолчанию (FFh). Если текст программы проассемблирован , тов том случае, если EEPROM память данных в программе не задействована, то будет тоже самое Если проассемблирован текст программы, в которой ячейки EEPROM памяти данных задействованы, то после ассемблирования , Вы увидите, в этих ячейках, те числовые значения, которые "дислоцируются " в рабочей части директивы в 16- ричной форме исчисления, без указания буквы h). Если это символы, то они будут указаны в виде чисел Обращаю Ваше внимание наследующий, общий принцип : в окнах, показывающих содержимое области оперативной памяти, памяти программ и EEPROM памяти данных, отражается результат последнего ассемблирования . То есть, если в текст программы внесены изменения, и после этого, ассемблирование не производилось, то проконтролировать эти изменения нельзя. Вопрос "Если изменения вносятся не в текст программы, а в комментарии или в оформление программы (вовсе то, что располагается правее точек с запятыми ), то нужно ли, для того чтобы сохранить эти изменения, производить ассемблирование "? Ответ есть 2 варианта сохранения изменений в комментариях и / или в оформлении программы Первый вариант произвести ассемблирование В этом случаев файле ничего не изменится ( MPLAB "не видит " ничего, что расположено правее точек с запятыми ). Значимая часть программы, в которую не внесены изменения, просто " перезапишется ", но при этом, будет обновлено то, что расположено правее точек с запятыми Второй вариант так как файл обновлять ненужно, то можно сохранить, указанные выше изменения, только в ASM- файле Для этого, нужно произвести стандартное действие в главном меню MPLAB, нужно щёлкнуть по слову, а в выпадающем списке, по строке Save На первых порах, проще всего (чтобы не "распылять внимание "), после любых изменений, внесенных в тексте программы, производить ассемблирование Вернемся кокну Для того чтобы увидеть результат использования директивы, с учетом сказанного, текст программы (файл) нужно проассемблировать Если Вы попробуете сделать это, то получите сообщение о 21 ошибке При этом, в окне EEPROM ничего не изменится (во всех ячейках FFh), что является закономерным результатом неисполнения требований, предъявляемых к оформлению текста программы 176 MPLAB "заругался " абсолютно обоснованно, так как программа неправильно оформлена и поэтому , "сего точки зрения " (и по факту тоже, она является "неполноценной ". Вопроса как же в этом случае, при помощи симулятора , убедиться в том , что директивы DE исполняются ? Ответ никак Вывод : проверить результаты исполнения директив DE можно только в том случае, если текст оформлен в виде "полноценной" программы, и этот текст проассемблирован без ошибок. Это относится не ко всем директивам Например , результаты исполнения директив, end и т д .), в симуляторе , проконтролировать нельзя, так как контролируются изменения только того, что отображается в "контрольных " окнах, а не результаты действий, обеспечивающих функционирование программы Но это не свидетельствует о том , что "самоустранился от этого дела ". Это не так Если "что- то пошло наперекосяк ", то, после ассемблирования , выдаст соответствующие сообщения об ошибках и / или предупреждения Обращаю Ваше внимание на пояснения, находящиеся в тексте примера между "шапкой " программы " и ее рабочей частью Вы видите варианты заполнения ячеек EEPROM памяти данных, для 2- х случаев "оформления " директив DE Это именно то, что будет наблюдаться, в окне EEPROM Window , после проведения успешного ассемблирования , если предположить, что текст примера оформлен как "полноценная " программа Разбираем текст программы. Дои после интересующих нас операций, программа может работать множеством различных способов и реализовывать какие угодно замыслы программиста В данном случае, это неважно Важно то, как именно происходит работа с EEPROM памятью данных На момент начала исполнения рабочей части программы, 46 ячеек EEPROM памяти заполнены числами (сработала " директива, а остальные ячейки заполнены числами, устанавливаемыми по умолчанию (FFh). Из всех этих ячеек, нас интересует только одна - третья, с адресом 02h, так как в ней , предварительно, записано число, с которым нужно производить интересующие нас операции или .100). В этом смысле, все остальные, предварительно записанные числа, можно рассматривать как "архитектурные излишества ", не влияющие на ход исполнения программы В данном случае, уходов в прерывания нет Исполнение программы начинается стандартно С ПП START В рабочей части программы, я не стал обозначать начало этой ПП Имейте это ввиду После "запуска в эксплуатацию " рабочей части программы, она исполняется до тех пор, пока не возникнет необходимость в работе с EEPROM памятью данных Если такая необходимость имеется, то рабочая точка программы должна "перейти " на начало исполнения группы команд, которая работает с EEPROM памятью данных В данном случае, переход на это "начало " происходит "естественным образом " (на "линейном участке программы ". Без задействования. Если используются команды переходов, то переход на это "начало " может происходить из любого "места " программы В этом случае, группе команд, обеспечивающей работу с EEPROM памятью данных, нужно либо "присвоить статус " подпрограммы, либо выставить метку на первой команде этой группы Разбираемся стем, что же должна из себя представлять эта группа команд В соответствии со сформулированной выше задачей, это должна быть группа команд, обеспечивающая считывание числа, из 3- й ячейки EEPROM памяти данных, в регистр оперативной памяти Следовательно , под это дело, нужно задействовать один из регистров общего назначения Назначаем ему название, например, и "прописываем " его в "шапке " программы по адресу, например, 0Ch. 177 Теперь мы конкретно знаем, откуда считывать и куда "закладывать на временное хранение " результат этого считывания Остается только выяснить, как конкретно это сделать Вы видите перед собой "кучу туманных " команд и по всей видимости, думаете, что "разборки " сними будут достаточно трудоемкими Ничего подобного Группа команд чтения данных из EEPROM памяти данных (и записи тоже) является стандартным "набором" команд, рекомендованных к применению разработчиками То есть, "изобретать колесо " ненужно Нужно только "врезать " эту стандартную группу команд в нужное "место " текста программы Внутри этой группы команд, нужно выставить адрес ячейки, из которой производится чтение (в нашем случае, 02h ), и указать название регистра, в который запишется считываемое число (в нашем случае, Registr ). О том , что после этого будет происходить в "дебрях " ПИКа, программисту знать необязательно Если группа команд чтения не содержат ошибок, то и беспокоиться не о чем То же самое относится и к процессу записи данных в EEPROM память данных Тем не менее, хотя бы "для общего развития ", разобраться с этим стандартным набором команд стОит Чтение данных, из EEPROM памяти данных, начинается с перехода в 0- й банк ( bcf Status,RP0 ). Если входе составления программы выяснится, что на момент начала процедуры чтения, происходит работа в 0- м банке , то команду из текста программы можно (и нужно) удалить (какой смысл выбирать 0- й банк , если работа итак происходит в нем ?). А можно и оставить все как есть (это для ленивых. Следующие 2 команды - стандартные команды записи константы, о которых многократно говорилось ранее В данном случае, константой является адрес 3- й ячейки (02h). Обратите внимание на то, что число 2 указано без атрибута системы исчисления В этом случае, оно "воспринимается " как 02h (о том, в каких случаях можно указывать число без атрибутов, я объяснял ранее. Эта константа записывается в регистр специального назначения, который используется только при работе с EEPROM памятью данных Число , которое в него записывается, определяет адрес той ячейки, из которой будет производиться считывание Вот Вам и "место закладки " адреса ячейки, из которой будет производится считывание Итак , ячейка выбрана и далее нужно инициализировать чтение (разрешить считывание, из нее, числа. Этим делом "рулит " нулевой бит регистра специального назначения, который находится в 1- м банке и используется только при работе с EEPROM памятью данных Следовательно , нужно перейти в 1- й банк , установить вбит регистра EECon1 и опять вернуться в 0- й банк , так как следующая команда ( movf EEData,W ) обращается к регистру , который "лежит " в 0- м банке После команды перехода в 0- й банк , располагается группа из двух команд После исполнения первой команды этой группы ( movf EEData,W ), предварительно записанное в ячейку , с адресом 02h, число 64h (.100), копируется в регистр W (аккумулятора после исполнения второй команды этой группы ( movwf Registr ), число 64h (.100) копируется, из регистра W, в регистр оперативной памяти, с содержимым которого (с числом 64h), в дальнейшем , можно произвести ту или иную операцию Вот Вам и ответ на вопрос " В какое место группы команд чтения данных, из EEPROM памяти данных, нужно вставить название регистра, в который считывается байт "? Регистр специального назначения (регистр данных) задействуется только при работе с EEPROM памятью данных Теперь , в соответствии с алгоритмом работы программы, нужно произвести операцию инкремента Итак , после исполнения команды Registr , процедура чтения данных, из 3- й ячейки , закончилась и можно увеличить на 1 число .100, хранящееся в регистре Registr Это делается при помощи команды Registr,F 178 После ее исполнения, в регистре Registr будет "лежать " число .101 (65h), которое, в соответствии со сформулированным ранее алгоритмом работы программы, необходимо записать все в ту же, 3- ю ячейку EEPROM памяти данных Делаем это Разработчики ПИКов рекомендуют начинать процедуру записи с команды глобального запрета прерываний Обратите внимание на то, что номер бита (7- го) регистра Intcon в команде не указан, так как в "шапке " программы, биту с номером 7, директивой, присвоено название GIE. По этой причине, можно указывать не номер бита, а его название Можно эту команду оформить так bcf Intcon,7 В этом случае, из "шапки " программы, можно убрать строку equ Глобальный запрет прерываний также можно осуществить при помощи байт- ориентированной команды Если на момент начала исполнения одной из этих команд, в 7- м бите регистра Intcon ранее уже был записан 0, то (по аналогии с командой bcf Status,RP0 ) эту команду можно исключить из текста "программы ". Формальная необходимость запрета прерываний обусловлена тем, что если прерывания по окончанию записи в (см. 6- й бит регистра) будут разрешены, то после окончания записи, рабочая точка программы "улетит " в ПП прерывания , которой, в данном случае, нет (глюк "). Для недопущения этого, нужно просто глобально запретить все прерывания командой Intcon,GIE ( bcf Эта команда, в отличие от команды Intcon , не "выключает " прерывания от других источников прерываний, а только (в интервале времени от исполнения команды и до исполнения команды Intcon,GIE ) запрещает их После команды глобального запрета прерываний, следуют 2 команды адресного выбора ячейки Они в точности такие же, как и команды адресного выбора ячейки при чтении (задействована одна ячейка) и останавливаться на них я не буду После выполнения следующей пары команд, число .101 (65h), через регистр W, копируется из регистра оперативной памяти Registr, в регистр специального назначения EEData и на этом, процесс предварительной подготовки к записи заканчивается Теперь нужно сначала разрешить, а затем и произвести запись Запись в выбранную ячейку EEPROM памяти данных, разрешается установкой в 1 второго бита регистра EECon1 Он "лежит " в 1- м банке Следовательно , перед тем как это сделать, нужно выбрать 1- й банк ( bsf Status,RP0 ). После разрешения записи ( bsf EECon1,2 ), можно произвести эту запись Для этого используется обязательная последовательность из пяти команд (см текст примера. При этом, производятся операции с так называемым "физически нереализованным" регистром, технические детали которых достаточно "туманны " (разработчики не объясняют. Собственно говоря, программисту от этого "не тепло и не холодно ", так как возможность " манёвра " начисто отсутствует, и по этой причине, ничего кроме этой обязательной последовательности команд, они не сможет применить Вот и применяем ее После исполнения обязательной последовательности команд, флаг прерывания по окончанию записи в EEPROM устанавливается в 1 (флаг поднят. Это и есть критерий окончания записи То есть, запись завершена и можно выйти из процедуры записи Но для того чтобы можно было осуществить следующую запись, этот флаг нужно программно (" принудительно ") сбросить ( bcf EECon1,4 ). Это единственный вариант его сброса Аппаратно (автоматически) он не сбрасывается Теперь можно перейти из 1- го банка в 0- й ( bcf Status,RP0 ). Вопрос "Почему переход в 0- й банк осуществляется именно в этом месте, а не ранее "? Ответ потому, что предшествующие команды, начиная с команды bsf EECon1,2 , работают с регистрами 1- го банка 179 В тексте примера предполагается, что следующие, после команды Status,RP0 , операции будут производиться с регистрами 0- го банка (вероятность этого - большая, но если после завершения процедуры записи, следующие операции будут производиться с регистрами 1- го банка (вероятность этого - маленькая, то команду нужно "вырезать " из концовки процедуры записи и перенести ниже (по тексту программы, "врезав " ее в то "место ", в котором заканчиваются операции с регистрами 1- го банка и начинаются операции с регистрами 0- го банка Осталось только обратить внимание на "шапку " программы Рассмотрев ее, Вы сможете убедиться в том , что всё , относящееся к рассмотренной части программы, в ней "прописано " и ответ на вопрос "что откуда взялось" должен быть Вам понятен Советую Вам переписать эти стандартные процедуры на листок и "приобщить " его к имеющимся у Вас распечаткам Примечание : в данном случае, рассмотрена процедура типа чтение - модификация – запись, в "границах " только одного полного цикла программы Не трудно догадаться, что произойдет входе исполнения последующих, полных циклов программы с каждым циклом, значение числа, записываемого в 3- ю ячейку EEPROM памяти данных, будет увеличиваться на 1. До числа .255 включительно После этого, входе отработки следующего, полного цикла программы, произойдет переход от числа .255 к числу .0. Затем к числу .1, .2 и т д Это называется счетом по кольцу Если применить операцию декремента, то все будет наоборот Для того чтобы можно было отследить изменения, я "модифицировал " нерабочую программу eeprom.asm таким образом, чтобы ассемблирование прошло успешно Эта "модифицированная" программа называется eeprom_a.asm ( находится в папке " Тексты программ. ;******************************************************************************** ; РАБОТА С EEPROM ПАМЯТЬЮ ДАННЫХ ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;================================================================================ ;............................................................. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ |