sanyaav | Дата: Пятница, 08.02.2013, 00:46 | Сообщение # 1 |
Репутация:
Группа:Журналист
Сообщений: 134
Награды: 8
Статус:Offline
Для начала открываем созданный ранее проект в MPLAB (или создаём новый, как это сделать описано в уроке по MPLAB).
Теперь самое главное определиться с целью нашего проекта. Начнём с самого простого- генератор импульсов, он пригодится и для мигания светодиодом и для различных пищалок. Писать будем для PIC12F675, поэтому лезем в настройки и указываем там именно этот микроконтроллер.
Первой строкой указываем тип микроконтроллера (возникнет вопрос: зачем 2 раза указывать тип МК? возможно в поздних версиях MPLAB можно обойтись без этой строки, но в ранних версиях МК указывается в шапке программы)
LIST p=12F675 ; Установка типа микроконтроллера.
привыкайте к отступам, отступы создаются с помощью клавиши TAB, набор строки выше на клавиатуре будет выглядеть так: (TAB)>LIST > (TAB)> (p=12F675)> (TAB)> ; Установка типа микроконтроллера.
Всё что написано после ; является комментарием и для программы не имеет никакого смысла, пишется только ради "ориентирования в пространстве". Данная программа будет коротенькой, можно не писать комментарии, но если программа будет на все 1024 слова, то лучше пользоваться комментариями, иначе запутаетесь.
Второй строкой описываются биты конфигурации, обратите внимание, что вначеле идёт 2 подчёркивания:
__CONFIG 3F9Ch
Как определить эти биты объясню подробнее. Открываем скачанный ранее даташит на 12F675, ищем там страницу с битами конфигурации (стр 53.) биты 13-12 описывают предел калибровки сброса по снижению питания. У данного МК есть сброс BOR, если напряжение снизилось ниже определённого уровня, то происходит сброс и МК находися в этом состоянии до тех пор, пока не восстановится нормальный уровень питающего напряжения. Эти биты указывают на этот "определённый" уровень. Пределы описана в таблице 12.4, это 2,0 и 2,1 вольта, соответсвенно нижний (00) и верхний (11) пределы калибровки.
Так как нам не нужен такой сброс, ставим любое значение (пусть это будет 11)
Далее идут неиспользуемые биты, их все пишем как 1
Потом идёт бит защиты энергонезависимой памяти и следом бит защиты памяти программ, если вы хотите защитить свои программы от плагиата, то эти биты для вас. В данной же программе мы не будем защищаться, поэтому ставим оба бита в 1
Бит 6 служит для включения того самого сброса по снижению питания, который был описан выше. Мы уже определились, что не будем сбрасывать микроконтроллер. Устанавливаем этот бит в 0
Бит 5 - это настройка порта GP3, этот порт может работать как канал ввода-вывода, так и в качестве сброса MCLR., в других типах микроконтроллеров вывод сброса MCLR делается отдельным и не зависящим от других портов, здесь у нас мало ножек, и производитель совместил его с каналом GP3. Если нам нужно принудительно сбрасывать микроконтроллер то этот бит ставим в 1, и если подать на 4 ножку нашего микроконтроллера низкий уровень сигнала, то произойдёт сброс, в других МК вывод MCLR подключается к + питания через резистор номиналом выше 1 кОм (я всегда ставлю 4,7 кОм, так как их у меня много), если же сбросить бит 5 в 0, то канал GP3 будет работать как вход, что мы и сделаем.
Бит 4 относится к работе таймера вкл питания, этот таймер используется сбросом BOR, который был описан выше, и поддерживает уровень сигнала сброса в течение 72 мс. после установки нормального уровня напряжения питания (см. рисунок 9-6) Сброс BOR мы уже отключили, отключаем и этот таймер установкой бита 4 в 1
Бит 3 - сторожевой таймер, придуман для того, чтобы сбрасывать микроконтроллер при "зависаниях" программы, если программа не дошла до определённой команды, то это будет расценено как "зависание" и микроконтроллер сбросится, при этом программа начнеёт исполняться сначала. Разрешаем работу этого таймера установкой бита 3 в 1. (как его сбрасывать опишу в программе)
И последние три бита это выбор тактового генератора (в даташите ошибка в заглавии) Так как наша программа простая, то ставим внутренний генератор, для этого установим биты 2,1,0 в 1,0,0 соответственно. (так же можно поставить 101, тогда c порта GP4 можно будет снимать сигнал для синхронизации с внешними устройствами)
В итоге у нас получилась комбинация:
11111110011100
Теперь самое время применить на практике перевод чисел. Разбиваем это число на тетрады. (справо налево!!!!):
11 1111 1001 1100
дополняем старшую тетраду нулями
0011 1111 1001 1100
Теперь переведём в 16 ричную систему счисления, получим:
3F9C
вот это число и пишем в строку конфигурации, добавляем h на конце, что указывает на 16-ричную систему счисления: 3F9Ch
После этого идут строки присвоения названий регистрам общего и специального назначения, внутри микроконтроллера нет никаких названий, там только нули и единицы, у каждого регистра есть адрес, составленный из этих нулей и единиц. Открываем страницу 10 даташита и смотрим на регистры справа у столбиков есть числа в 16-ричной системе счисления-это и есть адрес регистра. Чтобы не запоминать кучу чисел присвоим этому регистру название, которым будем пользоваться в программе. Название можно выбирать любое, но всё же для регистров специального назначения я рекомендую пользоваться стандарными названиями из даташита, чтобы было меньше путаницы. Для присвоения используем директиву equ, пишем:
Status equ 03h
Больше ничего не требуется, при каких либо действиях с регистром Status программа фактически будет обращаться по адресу 03h. Регистр статус нужен для выбора банка, также в нём есть биты флагов нуля, переноса-заёма. Всего используется 5 битов. Подробнее о этом регистре см. стр.13
Также для работы нам понадобятся регистры GPIO и TRISIO, присваиваем им сооттветствующие адреса:
GPIO equ 05h TRISIO equ 05h
Возникает вопрос: почему одинаковые адреса?
Ответ очень прост: потому что используются разные банки, достаточно провести аналогию со станицами в книге, откроем например 4 страницу и там будет 8 строка сверху, так же можно открыть и на 50 стр. и там тоже будет 8 строка сверху, при этом если посчитать общее количество строк в книге, то данная строка будет иметь номер 1008, так же и с банками общий номер у TRISIO 85h, но именно в 1 банке он будет 05h. Выбор этих банков будем делать в программе через регистр STATUS.
Теперь нужно рарезервировать один регистр общего назначения для переменной длительности импульса. Пусть он будет называться IMP, адрес его берём любой начиная с 20h до 5Fh
IMP equ 20h
Если все регистры указаны, то можно перейти к написанию основной программы
Для начала напишем эту строчку:
org 0
Это значит, что наша программа начинается с нулевого адреса
Дальше нужно определить работу нашего порат ввода вывода, сигнал будем снимать с GP0, то есть физически это 7 ножка. За направление работы порта ввода-вывода отвечает регистр TRISIO, он находится в 1 банке, открываем страницу 13 даташита и смотрим на 5 бит регистра Status, чтобы перейти в 1 банк нужно установить его в 1, для установки бита в 1 служит команда BSF (bit setup f-установить бит в регистре F), после команды нужно указать нужный регистр, а после запятой номер бита регистра, в нашем случае это будет выглядеть так:
bsf Status,5
Теперь нужно настроить порт GP0 в регистре TRISIO на выход, для установки любого порта на выход нужно сбросить соответствующий бит регистра TRISIO в ноль. Для сброса бита в 0 служит команда BСF (bit clean f-очистить бит в регистре F), после команды нужно указать нужный регистр, а после запятой номер бита регистра, в нашем случае это будет выглядеть так:
bcf TRISIO,0 ;сбросить нулевой бит в регистре TRISIO
В случае, если нужно изменить несколько битов одновременно, то нужно выполнить 2 команды: записать переменную в аккумулятор, а затем переслать её из аккумулятора в регистр TRISIO (помните: все действия только через аккумулятор!!!), для пересылки переменной в аккумулятор пользуемся командой movlw, для пересылки из аккумулятора в регистр - movwf, и выглядеть это будет так:
mowlw b'111110' movwf TRISIO
этими двумя командами мы настроили нулевой бит на выход, остальные 5 битов на вход (опять же помните: считаем биты с нулевого, справа-налево!!!) С этим регистром разобрались теперь нужно выйти обратно в нулевой банк, для этого нужно сбросить 5 бит регистра Status:
bcf Status,5
Теперь можно подавать сигнал на выход, путём установки или сброса нулевого бита в регистре GPIO- он служит защёлкой нашего порта ВВ. Для этого пишем такие строки:
bcf GPIO,0 bsf GPIO,0
Этими 2 строками мы заставляем переключатся канал GP0 с нуля на единицу, теперь нужно как то зациклить программу, так как она никогда не должна прерываться, для этого введём метку перед командой bcf GPIO,0 назовём её START, а после выполнения этих 2 команд выполним команду перехода: goto и укажем нашу метку:
START bcf GPIO,0 bsf GPIO,0 goto START
в конце любой программы добавляем end - директива конца программы
Самая простейшая программа готова, выглядит она так:
LIST p=12F675 ; Установка типа микроконтроллера. __CONFIG 3F9Ch
Status equ 03h GPIO equ 05h TRISIO equ 05h
IMP equ 20h
org 0
bsf Status,5 bcf TRISIO,0 bcf Status,5 START bcf GPIO,0 bsf GPIO,0 goto START end
НО!!! здесь изначально уже есть ошибка, о чём MPLAB нам не сообщит, но она всплывёт при симуляции. Самое время откомпилировать нашу прошивку и запустить её на симуляторе, заходим в меню Project и выбираем пункт Build all если выскочило окно с зелёной строкой, то всё нормально, можно переходить к симуляции в протеусе. (как работать в протеусе описано Володей во 2 части 1 урока) Открываем протеус и "собираем" схему. Для этого в библиотеке выбираем PIC12F675, ставим его в главное поле и щёлкаем 2 раза, путь к прошивке в строке Program File, в строке Processor Clock должно стоять 4 МГц. Теперь чтобы убедиться в генерации импульсов "подсоединим" к 7 ножке осцилограф. В итоге должна получиться вот такая схема: Запускаем схему и настраиваем осцилограф, видим генерацию импульсов:
Помните я говорил про удобную частоту в 4 МГц, теперь смотрим как это выглядит на практике:
длительность имульса составляет 3 мкс, вопрос: как так получилось? анализируем программу: импульс возникает по команде bsf GPIO,0 длительность 1 мкс, потом уровень сигнала не изменен и выполняется команда goto START + 1мкс итого 2 мкс, откуда взялась ещё одна? для ответа обратимся к странице 78 даташита, чёрным по белому написано: команда GOTO исполняется за 2 такта, вот и "нашлась" 3 микросекунда, с низким уровнем всё просто: команда bcf выполняется за 1 такт, то есть в нашем случае за 1 мкс. Теперь об ошибке! Нажав внизу на надпись Message(s) , выскакивает окно: Как видим наш микроконтроллер сбрасывается в начало сторожевым таймеров каждые 2,3 секунды. Чтобы такого не происходило нужно добавить команду сброса: clrwdt (clr-очистка wdt-сторожевой таймер) после bcf, а для того чтобы длительность высокого уровня равнялась длительности низкого добавим пустую команду nop, в итоге наша программа приобретает вид:
LIST p=12F675 __CONFIG 3F9Ch
Status equ 03h GPIO equ 05h TRISIO equ 05h
IMP equ 20h
org 0
bsf Status,5 bcf TRISIO,0 bcf Status,5 START bcf GPIO,0 clrwdt nop bsf GPIO,0 goto START
end
Компилируем и убеждаемся в правильном выполнении программы:
Также убеждаемся, что наш МК больше не сбрасывается каждые 2,3 секунды.Исходники для проекта можно скачать ТУТ ПРОДОЛЖЕНИЕ СЛЕДУЕТ..........
Сообщение отредактировал sanyaav - Пятница, 08.02.2013, 00:53 | |
|
I'll be back
|
|
| |
sanyaav | Дата: Вторник, 16.04.2013, 23:10 | Сообщение # 5 |
Репутация:
Группа:Журналист
Сообщений: 134
Награды: 8
Статус:Offline
там должно быть 2 окна: одно с программой, а другое с ошибкой. Внизу показывается текущая строка, на которой стоит курсор. Нужно смотреть в окно с ошибками, прочитать номер строки и что там за ней написано, а потом искать это в тексте программы. Самая распространённая ошибка это несоответствие регистра, например, в начале объявлено STATUS equ 03h, а в программе строка bcf Status,0. Или вариант с метками, когда метка называется MET, а обращаешься к ней goto met. Можно кинуть проект сюда, я скачаю попробую, что там за ошибки.
| |
|
I'll be back
|
|
| |
tsb_ | Дата: Среда, 17.04.2013, 00:59 | Сообщение # 7 |
Репутация:
Группа:Проверенный паятель
Сообщений: 48
Награды: 0
Статус:Offline
Цитата (redis) Объясните пожалуйста как всё что я записал в MPLAB IDE превратить в HEX файл? Поймите, MPLAB IDE это не одна программа. Это среда программирования - целый комплекс разных программ, каждая из которых выполняет свою функцию. Текст программы для микроконтроллера Вы пишете в текстовом редакторе, который входит в состав MPLAB. Потом, когда Вы через меню "Project" выбираете функцию "Build All" или "Make" (или нажимаете F10) - начинает выполняться программа "Assembler", которая переводит текст вашей программы в "машинные коды" микроконтроллера. Результатом работы ассемблера, в частности, и является файл HEX, который в определенном текстовом формате содержит те данные, которые нужно будет записать в микроконтроллер. Этот HEX-файл "понимают" различные программы: программаторы, отладчики, симуляторы... Цитата (redis) так она мелькнула с красной полоской ,я даже не успел понять что такое. Где исправлять? Если окно с результатами выполнения функций "Build All" или "Make" пропало с экрана, попробуйте найти его таким способом: В меню MPLAB щелкните кнопку Window. В появившемся списке, внизу, перечислены все открытые в вашем проекте окна. Найдите в этом перечне Output и щелкните по нему. В появившемся окне может быть несколко вкладок (они показаны в верхней части окна) - вас интересует вкладка Build. Именно на ней вы увидите сообщения об успешном выполнении (BUILD SUCCEEDED) или об ошибках.
| |
|
|
|
| |