Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
LED ами От LED0 (самый младший, до (самый старший. Например, если результат измерения (подсчета) нужно вывести на индикацию как- разрядное, десятичное число, то двоичный результат измерения "прогоняется " через двоично- десятичное преобразование (о нем, позднее, в итоге которого, результат измерения помещается в младшие полубайты 8- ми LED ов Далее , содержимое этих регистров, с соблюдением порядка старшинства, поочередно копируется в регистр W , подвергается кодовому преобразованию ( call TABLE ) и выводится на индикацию в виде символов Что касается последнего, то "технология " вывода на индикацию проста результат кодового преобразования, из регистра W, копируется в регистр того порта, к выводам которого подключены выводы секторов 7- сегментного индикатора А теперь представился удобный случай для того чтобы, в общем виде, разобраться с таким понятием как динамическая индикация Для определенности, предположим, что водном полном цикле индикации, результаты кодового преобразования выводятся на индикацию, начиная с младшего , десятичного разряда линейки 7- сегментных индикаторов (в порядке возрастания старшинства. По окончании последовательного вывода результатов кодового преобразования вовсе знакомест линейки, происходит переход (по кольцу) на вывод символа в младшее знакоместо линейки И так далее До конца линейки После этого, все опять повторяется снова и снова Вот Вам и типичный пример "двойной закольцовки ": один "виток " большого кольца индикации равен 8- ми "виткам " малого кольца индикации, "дислоцирующегося " внутри большого кольца индикации Если речь идет о фиксированном количестве "витков " (8), то количество "витков " малого кольца индикации нужно "поставить на счетчик ". Количество "витков " большого кольца индикации тоже нужно "поставить на счетчик ", ведь нельзя же допустить, чтобы рабочая точка программы все время находилась в подпрограмме вывода данных на индикацию В противном случае, "не будут делаться другие, важные дела ", например, замер А без него, такая индикация и даром ненужна То есть, должно быть "отмотано " фиксированное количество "витков " большого кольца индикации, после чего рабочая точка программы должна покинуть ПП вывода данных на индикацию и "сделать другие, важные дела ". После того как "она их сделает ", ив результате этого, в наличии будет иметься то, что нужно вывести на индикацию, снова начинается отработка ПП вывода данных на индикацию Все повторяется снова Ну итак далее Много раз В интервале времени каждой такой "отлучки ", 7- сегментные индикаторы "гасятся " вплоть до начала следующей отработки ПП вывода данных на индикацию Это и является причиной так называемых " мерцаний ", являющихся недостатком динамической индикации "Заход на второй круг ". В отдельно взятом, 7- сегментном индикаторе, символ индицируется (высвечивается ") в течение интервала времени формирования одного "витка " малого кольца индикации В этом интервале времени, он активен В начале следующего "витка " малого кольца индикации, этот 7- сегментный индикатор переводится из активного, в пассивное состояние (гасится "), а следующий , по разрядности, 7- сегментный индикатор активируется Ну итак далее До окончания активации последнего, 7- сегментного индикатора линейки Таким образом, речь идет о последовательном , поразрядном выводе результатов измерения ( счета ) на индикацию "Привязка " конкретных, десятичных разрядов результата измерения (счета) к конкретным знакоместам линейки 7- сегментных индикаторов, осуществляется путем последовательной ( в порядке старшинства) " запитки " 7- сегментных индикаторов, входящих в состав линейки В зависимости оттого, какие именно 7- сегментные индикаторы применены (с общим катодом или с общим анодом, эта " запитка " осуществляется либо коммутацией точки соединения общих выводов сегментов на плюс источника питания, либо ее коммутацией на корпус 167 Остальные выводы сегментов объединяются в группы (по принципу одноименности секторов) ив пределах этих групп, " параллелятся ". Получается 8 выводов, которые и подключаются к выводам порта, который задействован для управления линейкой Сказанное относится к тому случаю, если линейка создается из отдельных, 7- сегментных индикаторов Если речь идет о промышленных вариантах такой линейки, то ничего " параллелить " ненужно, так как разработчики об этом позаботились Для того чтобы обеспечить нужный порядок коммутации 7- сегментных индикаторов линейки, необходим дешифратор, то есть, устройство, у которого может быть активен только один из его выходов То , какой именно из них будет активен, зависит от адресного кода, подаваемого на его входы управления При наличии необходимого количества выводов портов, такой дешифратор можно реализовать программно (позднее, будет показано, как это делается. Ноне всегда выводов портов хватает Например , Все 8 выводов порта В задействованы (через них осуществляется вывод символов на индикацию. Остается 5 выводов порта А Но для линейки из 8- ми 7- сегментных индикаторов, этого явно недостаточно, так как нужно 8. Да еще и под другие нужды нужно что- то выделить Поэтому ничего другого не остается, как применить внешний (по отношению к ПИКу ) дешифратор на 3 адресных входа и 8 выходов Это уже вполне приемлемо, так как 3 это не 8. "Извернуться " можно Составив соответствующим образом программу, на этих 3- х входах , можно программно сформировать сигналы управления дешифратором, который, в свою очередь, будет осуществлять необходимые коммутации Ниже Вы видите практическую иллюстрацию сказанного Это принципиальная схема частотомера- цифровой шкалы На ней Вы видите то, о чем говорилось выше выводы порта В подключены к выводам секторов 7- сегментных индикаторов (одноименные секторы " запараллелены " внутри АЛС 318), 8 общих выводов 7- сегментных индикаторов подключены к выходам дешифратора 168 (555 ИД 7), а адресные входы дешифратора подключены к первым трем выводам порта А Резисторы R16...R23 - гасящие Они нужны для предотвращения токовых перегрузок оконечных каскадов защелок порта В Пояснение В примере № 1, говорилось о реализации вычисляемого перехода, осуществляемого по внешнему, управляющему сигналу, сформированному клавиатурой, и имелось ввиду то устройство, принципиальную схему которого Вы видите выше Посмотрите на схему Кнопки клавиатуры подключены к выводам RA0 и RA1 Значит , эти выводы должны быть настроены на работу " на вход " Но к этим же выводам подключены и первые два адресных входа дешифратора 555 ИД 7. Значит, эти выводы должны быть настроены на работу " на выход " Вопрос : "Как же тогда все это "мирно сосуществует " и работает в комплексе "? Ответ : бОльшую часть полного цикла программы, выводы RA0 и RA1 работают " на выход ", то есть, управляют дешифратором (обеспечивают процесс динамической индикации. Для опроса клавиатуры, требуется очень малое время (доли процента от времени полного цикла программы. В данном случае, опрос клавиатуры производится вначале полного цикла программы и непосредственно перед этим опросом, выводы и RA1 программно " перенастраиваются " с работы на выход на работу на "входа после окончания опроса сразу же программно " перенастраиваются " с работы на вход" на работу на выход " Эти "перенастройки " происходят очень быстро Вот Вам и типичный пример того, как одни и те же выводы портов задействуются для выполнения функционально различных действий, а "рулит всем этим делом " программа По этому же принципу, можно задействовать группу выводов портов и для выполнения большего количества различных "функциональностей " (возможность этого нужно рассматривать в каждом конкретном случае, что, согласитесь со мной, весьма существенно И особенно для "слабосильных " микроконтроллеров, имеющих небольшое количество выводов портов В данном же случае, без такого рода комплексного "задействования " просто не обойтись, так как если выделять для каждой "функциональности " отдельные группы выводов порта А , то пяти его выводов окажется недостаточными придется задействовать микроконтроллер с бОльшим количеством выводов портов Работа с EEPROM памятью данных. память данных также, как и память программ, является энергонезависимой памятью, но к памяти программ она отношения не имеет, и по этой причине, она как бы "стоит особняком " (выполняет свои специфические функции. Ее функции, в конечном итоге, сводятся к сохранению либо констант, либо числовых результатов операций после выключения питания микроконтроллера, с целью их дальнейшего использования после следующего включения питания Например , в моем частотомере- цифровой шкале, память данных задействована в двух случаях в нее записывается, определяемое пользователем (и по умолчанию, значение промежуточной частоты, которое в дальнейшем используется при формировании показаний индикатора в режиме цифровой шкалы, иона же выполняет функции энергонезависимой памяти настроек (установка, после включения питания, тех режимов работы прибора, которые были установлены на момент предшествующего выключения питания. В демонстрационной версии программы, которая предлагалась до замены ее на рабочую, память данных дополнительно задействовалась ив системе блокировки, которая срабатывала на третьем, после прошивки, включении питания, ив системе защиты от несанкционированных попыток изменения содержимого счетчика разрешенного количества включений питания Это только отдельный пример Есть еще масса всевозможных вариантов задействования EEPROM памяти данных, в результате которых, любое устройство на микроконтроллере можно сделать более "интеллектуальными удобным в использовании или / и ввести некие, трудно устранимые пользователем, ограничения, проявляющиеся после "выхода заграницы дозволенного ". Что касается ограничений, то это одно из моих "хобби ". 169 И не по той причине, что я "враг народа ". Просто интересно В связи с этим , спешу успокоить тех людей, которые пользуются моими "прошивками ": никаких "сюрпризов " они не содержат и на этот счет можно быть абсолютно спокойным EEPROM память , сама по себе, "тупая как валенок ". Из нее можно только или считать данные, или записать их в нее Если , при ее задействовании, речь идет о какой - то "интеллектуальности ", то эту "интеллектуальность " нужно "закладывать " в рабочую часть программы В простейшем случае, данные (числа) в EEPROM память записываются при "прошивке " ПИКа, а в ходе выполнения программы они периодически считываются из нее При выключении питания, эти данные не уничтожаются и с ними можно работать при последующих включениях питания В частотомере - цифровой шкале, этот вариант задействования EEPROM памяти применен для установки первичного значения промежуточной частоты (по умолчанию. Другой, более востребованный случай нужные программисту данные, могут быть записаны в EEPROM память данных, а также считаны из нее, при помощи специальных подпрограмм, рекомендованных разработчиками Запись и / или чтение данных можно "спровоцировать " различными способами Таким образом, можно многократно, пожеланию пользователя или автоматически, записывать в EEPROM память данных различные числа, которые, после считывания их из нее, используются в работе программы и которые сохраняются при выключении питания В частотомере - цифровой шкале, этот вариант задействования EEPROM памяти применен для организации режима работы типа "запись в EEPROM память значения промежуточной частоты, определяемой пользователем ". Данные, в EEPROM память данных, могут быть записаны при "прошивке " ПИКа, а затем , походу исполнения программы, считаны После этого, они могут быть видоизменены, ив этом виде, снова записаны в EEPROM память данных Таких циклов " считывания / записи " может быть много и они будут происходить до тех пор, пока результат чтения, например, не "войдет в зону " чисел, которую задал программист По факту этого события, производится какое- то действие С привлечением EEPROM памяти данных, можно организовать парольный доступ к чему - либо Можно еще перечислить множество различных случаев задействования EEPROM памяти данных Во всех случаях, "рулить " ей будет либо рабочая часть программы, либо она же, плюс директивы записи в EEPROM память данных, располагающиеся в "шапке " программы Что это за директивы, Вы узнаете ниже Естественно , что сейчас я не буду "обрушивать на Вас лавину информации ", связанной с рассмотрением сложных случаев задействования EEPROM памяти данных Примеры я привел только стой целью, чтобы показать Вам перспективность работы с EEPROM памятью данных Для начала, нужно понять, "что это вообще такое и с какого бока к этому подойти ". Объем EEPROM памяти данных невелик Для, это 64 ячейки В других типах ПИКов , может быть и больше В каждую из этих ячеек может быть записан один байт (число от .00 до .255). После записи, этот байт (байты) можно считать и результат этого считывания использовать в программе Каждая из этих 64- х ячеек , в диапазоне адресов от .00 до .63 (00h .. 3Fh), имеет свой адрес, который обязательно нужно указывать как при чтении из EEPROM памяти данных, таки при записи в нее . Походу составления программы, программист определяет, содержимое какой именно ячейки ( ячеек ) нужно считать, ив какую именно ячейку (ячейки) нужно произвести запись, c привязкой " этих действий к логике программы Запись , в ту или иную ячейку EEPROM памяти данных, того или иного числа производится " по верху " " старого " числа При этом, "старое число погибает ". То есть, речь идет о замене одного числа другим . Во время "прошивки " ПИКа, в EEPROM память данных может быть произведена предварительная запись данных 170 Этим "рулит " директива (или несколько таких директив) DE (см ниже, которая, в "шапке " программы, должна располагаться до директивы Поставим перед собой достаточно простую и конкретную задачу (что- то типа задания на разработку. До начала исполнения рабочей части программы, необходимо записать, в ячейку , например, с адресом 02h, число, например, .100 (64h). Затем, входе исполнения программы, нужно скопировать содержимое этой ячейки (.100) в регистр регистр общего назначения с названием , например, Registr_,_после_чего,_произвести_какую-_нибудь_операцию_ссодержимым_этого_регистраНапример,_увеличим_его_содержимое_на_единицу_(.101'>Registr , после чего, произвести какую- нибудь операцию с содержимым этого регистра Например , увеличим его содержимое на единицу (.101), с сохранением результата операции в этом же регистре Registr Затем , запишем число .101 в ту же ячейку EEPROM памяти данных По ходу этих "разборок ", я буду объяснять общие положения работы с EEPROM памятью данных Обращаю Ваше внимание наследующую, хотя и достаточно примитивную, но "имеющую право на жизнь ", аналогию, которая поможет Вам понять суть работы с EEPROM памятью : ячейки EEPROM памяти можно представить себе в виде специфических регистров общего назначения И в самом деле, с содержимым этих ячеек можно производить те же операции, что и с содержимым регистров общего назначения (имеется ввиду чтение или запись, и не более того, и если не требуется сохранить данные после выключения питания, то задачу, сформулированную выше (а также и множество других задач, можно решить, задействуя только регистры общего назначения, что, в этом случае, всегда и делается на практике ( оперативная память. К "услугам " памяти данных прибегают только тогда, когда "деваться некуда " (если не сохранить данные после выключения питания, тоне будет реализована задумка программиста. Главное отличие ячеек EEPROM памяти данных, от регистров общего назначения, состоит в том , что в них сохраняются данные после выключения питания Это хорошо, ноне "шустро ". В том смысле, что процедуры чтения / записи (особенно записи) довольно- таки "громоздки " достаточно большое количество команд, и они отрабатываются не за 1 м ц И даже не за 5, а поболее Это и есть специфика Файл с примером работы с EEPROM памятью данных eeprom.asm находится в папке " Тексты программ. Это выглядит так ;******************************************************************************** ; РАБОТА С EEPROM ПАМЯТЬЮ ДАННЫХ ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;================================================================================ ;............................................................. ;............................................................. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ |