Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Программирование на ассемблере для pic

Программирование pic микроконтроллеров. USB и CAN

пятница, 21 июня 2013 г.

Второй урок. Простой код на ассемблере и устройство вкратце. (устаревшее MPLAB 8.91)

project wizard,

Переписываем туда программу. Цифирки слева следует убрать. Вот код нашей первой программы:

;подключение заголовков
list p=18f2550 ; выбор контроллера
CONFIG FOSC=INTOSCIO_EC ; Выбран внутренний генератор
CONFIG MCLRE = OFF ; отключаем сигнал сброса
CONFIG WDT = OFF ; отключаем сторожевой таймер

DELAYCOUNTER EQU 0x00 ; задаем две переменные для создания задержки (паузы)
DELAYCOUNTER1 EQU 0x01; в программе. Они по адресу 0x00 и 0x01
A EQU 0; под буквой A будем подразумевать, что используется access bank

ORG 0 ; начинаем с 0 адреса памяти программы
GOTO main ; перейти на метку main
ORG 28h ; теперь пишем с 28 адреса. (сделано это для работы с прерываниями)
main ;(начинается программа main- просто метка для нашего удобства)

CLRF BSR,A; ; — выбираем нулевой блок памяти данных
CLRF PORTA,A ; — обнуляем выход на порту а ;

CLRF WDTCON,A; выключаем сторожевой таймер
MOVLW 0x0F ; записываем 0x0F в аккумулятор
MOVWF ADCON1,A ; перебрасываем значение в ADCON1 — настраиваем порт A на цифровой вход/выход
CLRF TRISA,A ;- настраиваем порт а — только на выход

endloop ; это цикл, в который будет без конца гонять наша программа
BTG LATA,2,A; мигнуть светодиодом
CALL delay255; вызвать паузу
GOTO endloop; вернуться к началу цикла

delay255 ; функция вызова паузы
SETF DELAYCOUNTER,A; записать 0xFF в счетчик времени
GOTO delay; перейти к delay
delay
SETF DELAYCOUNTER1,A; записать 0xFF во 2й счетчик времени
delaysub1 ;
DECFSZ DELAYCOUNTER1,F,A; уменьшить 2й счетчик на 1. если >0
GOTO delaysub1; то вернуться на шаг назад
DECFSZ DELAYCOUNTER,F,A; иначе — уменьшить 1й счетчик, если >0
GOTO delay; вернуться на метку delay
RETLW 0; иначе — выйти из функции

END ;конец программы

Пояснения к коду программы

Мы их рлдключаем для того. чтобы вместо того, чтобы всегда и везде мы записывали цифрами. мы могли использовать некоторые уже привычные нам обозначения.
напирмер, без подключения заголовков. команда записи в регистр выбора блока (BSR) -строка 16 нашей программы выглядела бы так
MOVWF 0FE0;

так. Еще директива.
list p=18f2550
Она просто говорит
компилятору, какой контроллер будем прошивать.

Дальше уже интереснее. Нам нужно задать управляющее слово. это — настройки контроллера.
Задает их директива CONFIG
По поводу всех настроек контроллера обращаемся так же к техническому описанию. ТО:288

Конфигурационные биты

CONFIG FOSC=INTOSCIO_EC
Эта настройка говорит о том, что мы будем использовать внутренний генератор импульсов. Он — внутри контроллера. Читаем в ТО:25

CONFIG MCLRE = OFF
Здесь мы отключаем сигнал сброса. То есть контроллер будет включаться сразу с подачей на него питания.

CONFIG WDT = OFF
Отключаем сторожевой таймер. Просто. чтобы не «запариваться». Он служит защитой от зависания контроллера. Читаем в ТО:299

Более подробно конфигурационные биты рассмотрены во 2-й главе к этому уроку. ссылка

Тело программы

DELAYCOUNTER EQU 0x00
Эта директива (EQU) ставит в соответствие к DELAYCOUNTER 0x00
То есть мы пишем DELAYCOUNTER, а программа думает «0x00»
Вообще мы будем использовать DELAYCOUNTER как переменную. а 0x00 — просто адрес, где она хранится в общих регистрах.
Кстати. Забыл сказать. 0x00 — это просто число. Так мы записываем числа в 16ричной системе счисления.
то есть 0x6B = 107

Мы используем для нашей программы память, входящую в access RAM, поэтому мы вольны использовать ячейки памяти от 0x00 до 0x5F. А ячейки от 0x60 до 0xFF — это регистры общего назначения.

ORG 0
Этим мы указываем компилятору, чтобы он писал все последующие команды последовательно с адреса 0.

Переходим на метку main. И начиная с 0x28 адреса пишем программу дальше. Метка main — адрес 0x28
Обратите внимание, мы оставили свободное место между адресом программы 0x1 и 0x28. Зачем? Если мы будем в последствии использовать прерывания, то в случае. если прерывание будет требовать на время приостановить программу. оно начнет выполнять команды по адресу 0x8 или 0x18. и это место нужно будет заполнить программой обработки прерывания.

Все последующие команды смотри в главе 3. Команды ассемблера. ссылка

MOVWF ADCON1
Когда мы записываем значение в регистр ADCON1. мы меняем настройки АЦП. По поводу
использования встроенных устройств контроллера смотри главу 4. ссылка

Самоучитель по программированию PIC контроллеров для начинающих

В 2006-м году возникло у меня желание освоить ассемблер для PIC микроконтроллеров. Решение осваивть именно PIC-и сформировалось не случайно. Для начала всего лишь 35 команд ассемблера. Запомнить наизусть их можно за несколько дней применяя на практике, при написании собственной программы. Или же просто заучить, пользуясь даташитом на любой из PIC контроллеров. Благо, что часть документации доступна на русском языке.

Ну и первая конструкция — само-собой часы. И несложно(во всяком случае в начале мне так казалось) и дома и на работе часам или таймеру применение найти легко. Единственное препятствие, с которым пришлось столкнуться — это отсутствие ясной и последовательно изложенной информации по, непосрественно, способам программирования.

В сети много сайтов с микроконтроллерной тематикой, но часто эта информация выложена в виде этакого винигрета, в котором разобраться, имея нулевой опыт в программировании чипов очень трудно.
После запуска схемы «первый проект на микроконтроллере» — мигания светодиодом начался судорожный поиск дельной информации. И совершенно случайно, рыская по сети в поисках информации по очередной схеме из журнала «Радио» (частотомер Денисова) вышел на сайт Евгения Корабельникова.

Не могу сказать, что на этом мои поиски закончились. Некоторые подходы придумывал сам, а свой код, он как правило всегда лучше, чем придуманный кем-то другим.
Но более последовательного и методичного изложения вопросов по структуре микроконтроллеров, вариантам протоколов обмена информацией PIC-а с внешними устройствами(индикаторы, датчики), работы с микросхемами памяти и многого другого, не встретил пока больше нигде.

Евгений — Автор с большой буквы, сумел упорядочить и переложить в нормально читаемый текст огромное количество материала, сделав его понятным и доступным, даже для тех, кто никогда раньше с программированием не сталкивался.

Если Вам нужен быстрый старт и программирование на ассемблере для PIC контроллеров, то рекомендую сайт Евгения Александровича.

Программирование на ассемблере для

PIC микроконтроллеров

Самоучитель по программированию PIC контроллеров для начинающих

(руководство по конструированию устройств на микроконтроллерах)

Общие замечания по стратегии «въезда».

«Самоучитель. » составлен таким образом, что, в случаях наличия каких-то неясностей, возникающих после прочтения предыдущих разделов, в последующих разделах, они постепенно проясняются за счет дополнительной информации. На первичной стадии «въезда», главное — понять смысл, а все остальное к нему, со временем, приложится.

Содержание

Введение
1. Готовим инструменты. Изготовление программатора и работа с ним.
2. Что такое микроконтроллер, и как он работает.
3. Система команд PIC16F84A.
4. Что такое программа и правила ее составления. Пример создания программы автоколебательного мультивибратора. Директивы. Принципиальная схема мультивибратора
5. Интегрированная среда проектирования MPLAB IDE и работа в ней.
6. Что дальше?
7. Пример создания программы (начало).
8. Пример создания программы (продолжение).
9. Работа в симуляторе. Отладка программы.
10. Как отследить выполнение программы
11. Прерывания. Стек. Пример разработки программы с уходом в прерывания.
12. Организация вычисляемого перехода. Работа с EEPROM памятью данных.
13. Флаги. Работа с флагами. Как работает цифровой компаратор. Перенос и заем.
14. Пример задействования флага С в трехбайтном суммирующем устройстве. Циклический сдвиг. Операция умножения.
15. Введение в принцип построения подпрограммы динамической индикации. Косвенная адресация.
16. Преобразование двоичных чисел в двоично-десятичные. Окончательное формирование текста подпрограммы динамической индикации.
17. Принцип счета. Работа с таймером TMR0. Принцип установки групп команд счета в текст программы.
Заключение

Скачать приложения
Приложения к самоучителю с сайта автора
формат PDF
размер файла 2,5 Мб

Программирование микроконтроллеров PIC. Часть 3. Структура программы на ассемблере

Итак, давайте разберёмся, какую структуру имеет программа на языке ассемблер и для чего предназначены отдельные части программы.

Для дальнейшего чтения неплохо иметь под рукой текст какой-нибудь программы и документацию на контроллер (либо распечатку, либо просто открыть их в соседних окошках), чтобы можно было в процессе чтения находить в тексте программы и в документации то, о чём читаешь. Так информация лучше доходит и запоминается.

Читать еще:  Типы задач линейного программирования

Ниже показана типичная структура программы на ассемблере.

;— Шапка программы — list p=16f628a __config b’11111100110001′ CBLOCK 0x20 variable1 ; первая запись variable2 ; вторая запись variable3 ; третья запись variable4 ; четвёртая запись ENDC Const1 equ .1 Const2 equ .5 TRISB equ 06h (1-й банк) PORTB equ 06h (0-й банк) Status equ 03h Z equ 02h

;— Тело программы — org 0h ; можно выполнить 3 команды ; основной программы goto start org 4h ; подпрограмма обработки ; прерываний start ; продолж. основной программы ; инициализация ; решение задачи end

1. Шапка программы.

В шапке указывается различная служебная информация для компилятора. То есть, практически всё, что находится в шапке, служит инструкциями не для контроллера, а для компилятора (кроме слова конфигурации).

list — директива, которая имеет кучу опций и может быть использована для управления процессом ассемблирования. Её можно и не использовать вовсе (настройки компилятор всё равно возьмёт из менеджера проекта), но указав этой директивой тип процессора, программа становится удобнее для восприятия. Во-первых, сразу видно для какого контроллера она написана. Во-вторых, если контроллер, указанный директивой list, не совпадает с контроллером, указанным в менеджере, то при компиляции будет сгенерирована ошибка (чтобы вы уже точно заметили, что программа написана под другой контроллер).

__config значение — эта директива указывает значение слова конфигурации контроллера. Слово конфигурации определяет основные параметры контроллера (какой будет использоваться генератор, будет ли установлена защита памяти программ и т.д.).

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

CBLOCK число — блок поименованных констант. Число — определяет константу, которой будет соответствовать первая запись (имя). Вторая запись будет соответствовать константе число+1, третья — константе число+2 и так далее. То есть, в нашем примере, везде, где компилятор увидит запись variable1, он вместо этой записи подставит число 20h (другая запись 0x20), вместо variable2 будет подставлено 21h и т.д.

С помощью этой директивы очень удобно присваивать имена сразу целому блоку пользовательских регистров (в которых программа будет хранить свои переменные или константы).

Пользовательские регистры контроллера PIC16F628A начинаются по адресу 20h. В нашем примере, поименовав константы, начиная со значения 20h, мы фактически назначили регистру по адресу 20h имя variable1, регистру по адресу 21h имя variable2 и т.д. Допустим, мы используем регистр по адресу 20h в качестве счётчика. Для того, чтобы увеличить значение счётчика нам нужно прибавить 1 к значению, записанному в этом регистре. На ассемблере это можно записать так: incf 20h. Но, у нас константе 20h соответствует имя variable1. То есть, мы можем записать incf variable1 и компилятор сам заменит variable1 на 20h. Согласитесь, вторая запись гораздо более наглядна.

То есть, с помощью директивы CBLOCK можно фактически определить блоки регистров (присвоить имена регистрам, расположенным по определённым адресам), которые будут использоваться в программе как переменные.

Блоков может быть несколько, главное внимательно следить, чтобы они не пересекались, а то получится, что две разных переменных расположены в одном и том же регистре. Конец блока обозначается директивой ENDC.

equ — эта директива сообщает компилятору, что запись, расположенная перед этой директивой соответствует числу, стоящему после этой директивы (компилятор будет заменять запись на число). В нашем примере, записи Const1 будет соответствовать число 1 (точка перед числом обозначает десятичную систему исчисления, а буква h — шестнадцатиричную), записи Const2 — число 5, записи TRISB — число 6 и т.д. С помощью этой директивы обычно задают константы, адреса используемых в программе регистров и присваивают имена отдельным битам в регистре.

Допустим в программе мы несколько раз в разных местах оперируем константой, значение которой равно 1 (например загружаем её в аккумулятор командой movlw .1). Если нам понадобится перекомпилировать программу с другим значением этой константы, то надо будет искать все куски кода, где мы её используем и в каждом случае отдельно менять код. Если же мы директивой equ указали, что записи Const1 соответствует константа 1, то теперь мы везде можем писать movlw Const1 и для изменения константы нам нужно всего лишь изменить её значение в шапке программы.

Аналогичным образом именуются используемые регистры. Например, мы хотим работать с портом B. Открываем документацию и смотрим, какие нам понадобятся регистры для работы с ним и по каким адресам они расположены. Мы видим, что для работы с портом B нам понадобится регистр, расположенный в нулевом банке по адресу 06h, который в доке называется PORTB и регистр, расположенный в первом банке по адресу 06h, который в доке называется TRISB. Пока компилятор не знает, что такое PORTB и TRISB, — мы можем обращаться к ним только по адресу. Например, если мы напишем movwf 06h, находясь в нулевом банке, то контроллер запишет данные из аккумулятора в регистр PORTB, а если та же команда будет выполнена, когда мы находимся в первом банке, то данные из аккумулятора будут записаны в регистр TRISB. Если мы в шапке программы пропишем, что имя PORTB соответствует числу 06h (PORTB equ 06h), то теперь в программе, для записи данных из аккумулятора в порт B, код может выглядеть так: movwf PORTB и компилятор будет знать, что запись PORTB нужно заменить на 06h. Точно так же можно поименовать и биты, указав, что, например, бит Z в регистре Status — это второй бит и везде, где мы пишем Z, компилятору нужно заменить эту запись на число 02h.

Короче говоря, шапка программы (за исключением слова конфигурации) нужна для облегчения последующего процесса программирования. То, что в ней записано, — это не код, который будет исполняться контроллером, а инструкции для компилятора, поясняющие как работать с написанным в теле программы кодом.

2. Тело программы.

В теле программы пишутся те инструкции, которые будут исполняться контроллером, то есть это как раз и есть сама программа для контроллера. Хотя, здесь тоже встречаются директивы, предназначенные для компилятора, например для правильного размещения участков программы в памяти контроллера.

ORG число — эта директива как раз предназначена для компилятора. Число в данном случае — это адрес, начиная с которого в памяти программ контроллера располагается код, следующий за директивой ORG. При старте, счётчик команд (указатель на текущую выполняемую команду) всегда устанавливается на нулевой адрес, поэтому логично, что мы должны разместить программу так, чтобы первая инструкция оказалась в памяти программ по нулевому адресу. Для этого в начале тела программы пишут ORG 0.

При возникновении прерывания счётчик так же всегда устанавливается по какому-то определённому адресу, например для PIC16F628A это будет адрес 0004h. Следовательно, если мы используем в программе прерывания, то перед подпрограммой обработки прерываний нужно написать ORG 04h, чтобы первая инструкция этой подпрограммы располагалась по адресу 0004h. Кроме того, в этом случае, необходимо обеспечить, чтобы основная программа не пересекалась с подпрограммой обработки прерывания.

Помните, мы указали, что программа должна располагаться в памяти программ, начиная с нулевого адреса. Соответственно, первая её инструкция будет по нулевому адресу, вторая по адресу 0001h, третья — по адресу 0002h, четвёртая по адресу 0003h, а пятая — по адресу 0004h. Опа! Начиная с пятой инструкции мы оказались в той области памяти, где должна располагаться подпрограмма обработки прерываний. Чтобы такого пересечения не произошло, подпрограмму обработки прерываний обходят командой goto. То есть, начиная с нулевого адреса до адреса 0002h можно разместить основную программу, а потом нужно сделать переход в ту область памяти, которая располагается за подпрограммой обработки прерывания и оставшуюся часть основной программы расположить там. В нашем примере (рисунок наверху) такой переход выполняется командой goto start.

Тело программы также можно поделить на 2 части — инициализацию и, собственно, выполнение какой-то задачи.

Читать еще:  Переменная в программировании считается

Инициализация — это настройка контроллера для решения нашей задачи. Поскольку контроллер — вещь многофункциональная и разные его части могут работать по разному, в зависимости от настроек (например, коэффициенты деления предделителя могут быть разные, ноги могут работать как входы или как выходы и т.д.), то сначала его нужно настроить для выполнения нашей конкретной задачи. Инициализация заключается в установке или сбросе определённых битов в соответствующих регистрах специального назначения. Как проводить инициализацию тех или иных частей контроллера (какие именно биты, в каких регистрах и в каком порядке нужно установить или сбросить) нужно читать в документации.

Пусть мы (для примера) хотим организовать мигание светодиодом, подключенным к 7-й ноге PIC16F628A. Для этого нам нужно, чтобы седьмая нога работала как выход. Седьмая нога — это канал RB0 порта B. Открываем доку и смотрим, что нужно сделать, чтобы настроить RB0 как выход. Мы видим, что направлением работы порта B управляет регистр TRISB, который находится по адресу 86h. 86h — это первый банк, смещение 06h от начала банка. Для того, чтобы RB0 работал как выход, нужно установить нулевой бит регистра TRISB в 0. То есть инициализация будет заключаться в следующем:

bcf PORTB, 0 ; устанавливаем начальное состояние ; (уровень, который установится на RB0 ; после переключения направления работы ; на выход, 0 — низкий уровень, 1 — высокий bsf Status, RP0 ; переходим в первый банк (нужный ; нам регистр TRISB находится там), для чего ; устанавливаем в 1 бит RP0 регистра Status bcf TRISB, 0 ; устанавливаем в 0 нулевой бит регистра TRISB ; (устанавливаем направление работы RB0 — на выход) bcf Status, RP0 ; возвращаемся в нулевой банк

Только теперь (после инициализации), изменяя соответствующий бит в регистре PORTB, мы можем управлять уровнем сигнала на выводе RB0. (В данном примере показана настройка только одного из каналов порта, хотя на практике обычно настраивают порт целиком, соответственно используются команды, оперирующие с байтами, а не с битами).

На самом деле, несмотря на то, что инициализация находится в начале программы, процедуры инициализации, так же как регистры и переменные в шапке программы, прописываются в процессе разработки рабочей части программы. Мы ведь не можем заранее знать, какие нам понадобятся переменные, сколько, какими регистрами и модулями мы будем оперировать.

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

Микроконтроллеры PIC для начинающих

На современном рынке есть ряд семейств и серий микроконтроллеров от разных производителей, среди них можно выделить AVR, STM32 и PIC. Каждое из семейств нашло свою сферу применения. В этой статье я расскажу начинающим о микроконтроллерах PIC, а именно, что это такое и что нужно знать для начала работы с ними.

Что такое PIC

PIC – это название серии микроконтроллеров, которые производятся компанией Microchip Technology Inc (США). Название PIC происходит от Peripheral Interface Controller.

Микроконтроллеры PIC имеют RISC-архитектуру. RISC – сокращённый набор команд, используется также в процессорах для мобильных устройств. Есть целый ряд примеров её использования: ARM, Atmel AVR и другие.

Компания Microchip в 2016 году купила Atmel – производителя контроллеров AVR. Поэтому на официальном сайте представлены микроконтроллеры семейства и PIC и AVR.

Семейства

Среди 8-битных микроконтроллеров PIC она состоит из 3-х семейств, которые отличаются архитектурой (разрядностью и набором команд).

Baseline (PIC10F2xx, PIC12F5xx, PIC16F5x, PIC16F5xx) ;

Mid-range (PIC10F3xx, PIC12F6xx, PIC12F7xx, PIC16F6xx, PIC16F7xx, PIC16F8xx, PIC16F9xx) ;

Enhanced Mid-range (PIC12F1xxx, PIC16F1xxx) ;

High-end или PIC18 (18Fxxxx, 18FxxJxx and 18FxxKxx).

Характеристики, которых приведены в таблице ниже.

Кроме 8 битных микроконтроллеров компания Microchip производит 16-битные:

DsPIC30/33F для обработки сигналов.

Представители 16-битного семейства работают со скоростью от 16 до 100 MIPS (выполнено миллионов инструкций в секунду). Стоит отметить и особенности:

машинный цикл – 2 такта;

разрядность АЦП – 16 бит;

поддерживают ряд протоколов связи (UART, IrDA, SPI, I2S™, I2C, USB, CAN, LIN and SENT), ШИМ и прочее.

Также есть семейство 32 битных микроконтроллеров – PIC32MX, основные особенности:

работают на частоте до 120 мГц;

выполняют до 150 MIPS;

АЦП: 10-бит, 1 Msps (скорость квантования), до 48 каналов.

С какого PIC начать?

Новичкам стоит начать осваивать микроконтроллеры PIC с 8-битной линейки. Вообще, производитель заявляет о том, что особенностью всего семейства является лёгкая переносимость программ с одного семейства на другое и совпадения цоколевки ряда моделей.

Одним из популярнейших в среде радиолюбителей микроконтроллеров является PIC16f628A. Его технические характеристики такие:

Есть встроенный тактовый генератор. Вы можете настроить для работы с частотой 4 или 8 МГц;

18 пинов, из них 16 – ввод/вывод, а 2 – питание;

Для работы на частотах до 20 МГц можно подключить кварцевый резонатор, но в этом случае на ввод/вывод останется не 16, а 14 ног;

В маркировке есть буква F, это значит, что используется FLASH-память, объёмом в 2048 слов;

14-битные инструкции, 35 штук;

4 аналоговых входа;

На входах PORTB есть подтягивающие резисторы;

Два 8-битных таймера и один 16-битный;

Машинный цикл – 4 такта кварцевого резонатора или внутреннего генератора);

128 байт EEPROM;

USART – последовательный порт;

внутренний источник опорного напряжения;

питается от 3.3 до 5 В.

Причинами популярности является низкая цена и возможность тактирования от внутреннего генератора.

Какая цоколевка у 16f628 изображено ниже:

Блочная внутренняя схема этого микроконтроллера изображена ниже.

На что следует обратить внимание на схеме в первую очередь?

У этого микроконтроллера есть два порта PORTA и PORTB. Каждый пин, каждого из них может использоваться как вход и выход, а также для подключения периферии или задействования других модулей микроконтроллера.

Рассмотрим эту часть схемы крупно.

Например, порты RB0-RB3 – могут выступать в роли аналоговых. К RA6, RA7 в случае необходимости подключается источник тактирования (кварцевый резонатор). Сами же выводы микроконтроллера настраиваются в режим входа/выхода с помощью регистра TRIS.

Для этого есть команды типа:

TRISA = 0; // Все выводы порта А устанавливаются как выходы
TRISB = 0xff; // Все выводы порта B назначаются как входы
TRISA0 = 1; // Так назначается отдельный пин как вход (1) или выход (0)
TRISA5 = 1 ; // здесь 5 вывод порта А – назначен входом

Вообще режимы работы, включение WDT (сторожевого таймера) выбор источника тактирования микроконтроллера и прочее настраивается с помощью регистров специального назначения — SFR, а память и данные хранятся в GFR – простыми словами это статическое ОЗУ.

В официальном Datasheet, на страницах 18-21 вы найдете 4 банка памяти регистров специального назначения SFR и регистров общего назначения GFR. Знание регистров важно, поэтому распечатайте и выучите указанные страницы из Datasheet .

Для удобства ниже приведены эти таблицы в виде картинок (нумерация регистров, как и всё в цифровой электронике начинается с 0, поэтому номер четвертого – 3).

Как подключить и на каком языке программировать?

Чтобы запустить этот микроконтроллер достаточно подать плюс на Vdd и минус на Vss. Если нужен кварцевый резонатор, то он подключается к выводам 16 и 15 (OSC1 и OSC2) микроконтроллера PIC16f628, для других контроллеров с большим или меньшим числом выводов – смотрите в datasheet. Но этот момент нужно указывать при программировании и прошивке.

Кстати о переносимости и совпадении цоколевки – на 16f84A – она аналогична, и на многих других.

Фрагмент схемы с подключенным к pic16f628a внешним резонатором:

Есть два основных языка для программирования микроконтроллеров PIC – это assembler и C, есть и другие, например PICBasic и т.д. Еще можно выделить упрощенный язык программирования JAL (just another language).

Для примера ниже приведена программа для «мигания светодиодом» — своего рода «Hello World» для микроконтроллера PIC на языке C.

В 1 строке подключается библиотека микроконтроллеров PIC, далее подключается библиотека программы задержки.

В функции main(void) в начале устанавливаются начальные параметры, подобно тому как мы это делали в функции Void setup () – в статьях об ардуино. Далее в строках 11-16 объявляется бесконечный цикл while(1), в ходе которого и выполняется программа «мигания светодиодом».

Читать еще:  Не загружается безопасный режим

В примере состояние порта постоянно инвертируется, т.е. если он был в «0», то перейдет в «1» и наоборот. На C для PIC есть следующие команды управления команды:

PORTA = 0; // переводит все пины порта А в низкий уровень (лог. 0)
PORTB = 0xff; // переводит все пины порта B в высокий уровень (лог. 1)
RB5 = 1; // На пятом выводе порта B высокий уровень

А так выглядит та же программа, но уже на языке JAL, я перевел на русский язык комментарии от разработчиков встроенных примеров в JALedit (среда разработки).

Возникает соблазн выбрать JAL, и вам он может показаться проще. Безусловно на нём можно реализовать любые проекты, но с точки зрения пользы для вас как для специалиста – это бесполезный язык. Значительно больших результатов вы добьетесь, изучая синтаксис и принципы программирования на языке C (большая часть популярных сейчас языков C-подобны) или на Assembler – это низкоуровневый язык, который заставит вас понимать принцип работы устройства и что происходит в программе в каждый конкретный момент времени.

В чем работать

Если сказать совсем обобщенно для работы с любыми микроконтроллерами нужно:

1. Текстовый редактор.

3. Программа для загрузки прошивки в микроконтроллер.

И я даже читал старые учебники, где автор, работая из-под DOS писал код, компилировал и прошивал его разными средствами. Сейчас же под все популярные операционные системы есть среды для разработки, как узкоспециализированные (для конкретного семейства микроконтроллеров или семейств от одного производителя) так и универсальные (либо содержат все необходимые инструменты, либо они подключаются в виде плагинов).

Например, в цикле статей об Arduino мы рассматривали среду Arduino IDE в ней же мы и код писали и с её помощью «заливали» прошивку в «камень». Для микроконтроллеров PIC есть такие программы, как:

MPASM — используется для разработки на языке Assembler от фирмы Microchip ;

MPLAB — также IDE от Microchip для PIC-контроллеров. Состоит из множества блоков для тестирования, проверки, работы с кодом и компиляции программ и загрузки в микроконтроллер. Также есть версия MPLAB X IDE – отличается большим функционалом и построена на базе платформы NetBeans ;

MikroC — универсальная среда (не только для ПИКов) для разработки. Как видно из названия «заточена» под программирование на C, а также есть такие программы как MikroBasic и MikroPascal, для соответствующих языков ;

JALedit — подходит для языка JAL, о котором мы упоминали выше ;

И ряд других менее известных.

Как прошивать микроконтроллер?

Для PIC-микронотроллеров есть ряд программаторов. Официальным считается PICkit. Их 4 версии. Но можно прошивать и универсальными, например, TL866 (он поддерживает почти всё, что может понадобится начинающему радиолюбителю, при этом очень дешевый).

Также в сети есть ряд различных схем программаторов для ПИКов, как для работы через COM-порт:

Так и через USB (на самом деле тоже com, только через преобразователь на ИМС MAX232).

Заключение

Микроконтроллеры PIC16 подходят для простых проектов, типа простой автоматики, вольтметров, термометров и прочих мелочей. Но это не значит, что нельзя делать на этом семействе сложные и большие проекты, я привел пример того для чего чаще всего их используют. Для общего представления рекомендую посмотреть несколько видео:

В одной статье рассматривать темы о том, как программировать микроконтроллеры, неважно какого семейства, безсмысленно. Поскольку это очень большой объём информации. Для начинающих советую к прочтению:

Катцен С. — PIC-микроконтроллеры. Все что вам необходимо знать;

Кёниг А. — Полное руководство по PIC микроконтроллерам;

Шпак Ю.А. — Программирование на языке С для AVR и PIC микроконтроллеров;

Магда Ю.С. — Микроконтроллеры PIC: архитектура и программирование;

Яценков В.С. — Микроконтроллеры Microchip. Практическое руководство.

Программирование pic микроконтроллеров. USB и CAN

пятница, 21 июня 2013 г.

Второй урок. Простой код на ассемблере и устройство вкратце. (устаревшее MPLAB 8.91)

project wizard,

Переписываем туда программу. Цифирки слева следует убрать. Вот код нашей первой программы:

;подключение заголовков
list p=18f2550 ; выбор контроллера
CONFIG FOSC=INTOSCIO_EC ; Выбран внутренний генератор
CONFIG MCLRE = OFF ; отключаем сигнал сброса
CONFIG WDT = OFF ; отключаем сторожевой таймер

DELAYCOUNTER EQU 0x00 ; задаем две переменные для создания задержки (паузы)
DELAYCOUNTER1 EQU 0x01; в программе. Они по адресу 0x00 и 0x01
A EQU 0; под буквой A будем подразумевать, что используется access bank

ORG 0 ; начинаем с 0 адреса памяти программы
GOTO main ; перейти на метку main
ORG 28h ; теперь пишем с 28 адреса. (сделано это для работы с прерываниями)
main ;(начинается программа main- просто метка для нашего удобства)

CLRF BSR,A; ; — выбираем нулевой блок памяти данных
CLRF PORTA,A ; — обнуляем выход на порту а ;

CLRF WDTCON,A; выключаем сторожевой таймер
MOVLW 0x0F ; записываем 0x0F в аккумулятор
MOVWF ADCON1,A ; перебрасываем значение в ADCON1 — настраиваем порт A на цифровой вход/выход
CLRF TRISA,A ;- настраиваем порт а — только на выход

endloop ; это цикл, в который будет без конца гонять наша программа
BTG LATA,2,A; мигнуть светодиодом
CALL delay255; вызвать паузу
GOTO endloop; вернуться к началу цикла

delay255 ; функция вызова паузы
SETF DELAYCOUNTER,A; записать 0xFF в счетчик времени
GOTO delay; перейти к delay
delay
SETF DELAYCOUNTER1,A; записать 0xFF во 2й счетчик времени
delaysub1 ;
DECFSZ DELAYCOUNTER1,F,A; уменьшить 2й счетчик на 1. если >0
GOTO delaysub1; то вернуться на шаг назад
DECFSZ DELAYCOUNTER,F,A; иначе — уменьшить 1й счетчик, если >0
GOTO delay; вернуться на метку delay
RETLW 0; иначе — выйти из функции

END ;конец программы

Пояснения к коду программы

Мы их рлдключаем для того. чтобы вместо того, чтобы всегда и везде мы записывали цифрами. мы могли использовать некоторые уже привычные нам обозначения.
напирмер, без подключения заголовков. команда записи в регистр выбора блока (BSR) -строка 16 нашей программы выглядела бы так
MOVWF 0FE0;

так. Еще директива.
list p=18f2550
Она просто говорит
компилятору, какой контроллер будем прошивать.

Дальше уже интереснее. Нам нужно задать управляющее слово. это — настройки контроллера.
Задает их директива CONFIG
По поводу всех настроек контроллера обращаемся так же к техническому описанию. ТО:288

Конфигурационные биты

CONFIG FOSC=INTOSCIO_EC
Эта настройка говорит о том, что мы будем использовать внутренний генератор импульсов. Он — внутри контроллера. Читаем в ТО:25

CONFIG MCLRE = OFF
Здесь мы отключаем сигнал сброса. То есть контроллер будет включаться сразу с подачей на него питания.

CONFIG WDT = OFF
Отключаем сторожевой таймер. Просто. чтобы не «запариваться». Он служит защитой от зависания контроллера. Читаем в ТО:299

Более подробно конфигурационные биты рассмотрены во 2-й главе к этому уроку. ссылка

Тело программы

DELAYCOUNTER EQU 0x00
Эта директива (EQU) ставит в соответствие к DELAYCOUNTER 0x00
То есть мы пишем DELAYCOUNTER, а программа думает «0x00»
Вообще мы будем использовать DELAYCOUNTER как переменную. а 0x00 — просто адрес, где она хранится в общих регистрах.
Кстати. Забыл сказать. 0x00 — это просто число. Так мы записываем числа в 16ричной системе счисления.
то есть 0x6B = 107

Мы используем для нашей программы память, входящую в access RAM, поэтому мы вольны использовать ячейки памяти от 0x00 до 0x5F. А ячейки от 0x60 до 0xFF — это регистры общего назначения.

ORG 0
Этим мы указываем компилятору, чтобы он писал все последующие команды последовательно с адреса 0.

Переходим на метку main. И начиная с 0x28 адреса пишем программу дальше. Метка main — адрес 0x28
Обратите внимание, мы оставили свободное место между адресом программы 0x1 и 0x28. Зачем? Если мы будем в последствии использовать прерывания, то в случае. если прерывание будет требовать на время приостановить программу. оно начнет выполнять команды по адресу 0x8 или 0x18. и это место нужно будет заполнить программой обработки прерывания.

Все последующие команды смотри в главе 3. Команды ассемблера. ссылка

MOVWF ADCON1
Когда мы записываем значение в регистр ADCON1. мы меняем настройки АЦП. По поводу
использования встроенных устройств контроллера смотри главу 4. ссылка

Ссылка на основную публикацию
Adblock
detector