Суббота, 11 февраля 2012 21:54

Краткий курс основ программирования микроконтроллеров фирмы MICROCHIP. Featured

Written by
Rate this item
(0 votes)

altНам часто задают вопросы, как научится писать программы практически с нулевого уровня, поэтому инициативная группа сайта chipmk.ru решила создать краткий курс для первичного обучения. Нужно уточнить, мы не считаем себя большими специалистами в этой области. Практически все самоучки. Надеемся, что наши знания помогут другим начать.
Задача ставится: объяснить основные понятия и помочь сделать первый шаг в этот увлекательный мир. Возможно, последует и дальнейшее развитие этого проекта.

 

 

 

 

Все зависит от его необходимости, о которой мы будем судить по вопросам на форуме.

 
Урок 1. Введение
В этом уроке мы даем общие понятия и  основные первичные определения. Не стоит ждать подробного описания. Для желающих быстро усвоить, приведены необходимые ссылки на официальную документацию. Этот урок для людей с нулевым уровнем знаний и своеобразный начальный справочник основных определений.

 

1.1 Язык ассемблер. Системы счисления. Основные понятия цифровой техники.

    Язык ассемблер — язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют  инструкциям микроконтроллера.
Мнемонические команды – это символьные команды, определяемые производителем для данного типа микроконтроллера.

{jcomments on}
Инструкция микроконтроллера – это команда в двоичной системе счисления, понятная микроконтроллера и определяющая определенную операцию с числами.
Например:
 
nop - мнемоническая команда, понятная человеку.
 
b’00000000’ - код команды nop, понятная микроконтроллеру
Ассемблер очень прост, поэтому он относится к языкам низкого уровня. Существуют языки высокого уровня, намного ускоряющие создание программ. Но знать ассемблер, очень полезно и нужно любому программисту.
  
Компилятор – это программа преобразующая команды  написанные на каком-либо одном языке программирования в машинные коды, понятные микроконтроллеру. В так называемый HEX –файл. Hex обычно записывается в шестнадцатеричной системе счисления.
 Например: 0800080064008B13B300030E2A
  
Система счисления — это  способ представления (записи) любого числа с помощью определенного количества символов (цифр). Основание системы счисления – это и есть количество разных символов (цифр) используемое для записи чисел в этой системе.
  
Двоичная система счисления — это  система счисления с основанием 2. В этой системе счисления числа записываются с помощью двух символов (0 и 1).
  
Десятичная система счисления — это  система счисления с основанием 10. В этой системе счисления числа записываются с помощью десяти символов (0;1;2;3;4;5;6;7;8;9).
  
Шестнадцатеричная система счисления  — это система счисления по основанию 16. В этой системе счисления числа записываются с помощью десятичных цифр от 0 до 9 и латинских буквы от A до F, то есть (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F).
Двоичная система применяется в цифровой техники, т.к. удобно цифры 0 и 1 обозначить двумя уровнями напряжения (обычно 0…0,8 В и 2…5 В ). Их соответственно называют:
0 – низкий уровень, 1 – высокий уровень.
Десятичная система удобно для человеческого восприятия и более привычна.
Шестнадцатеричная система широко используется в низкоуровневом программировании и вообще в компьютерной документации, поскольку в современных компьютерах минимальной единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами.

   Обозначение
Двоичная    – bin (B)
Десятичная – dec(D)
Шестнадцатеричная – hex (H)
Основание системы счисления в математике принято указывать в  нижнем индексе.


В ассемблере MICROCHIP.
Двоичное число обозначают. b’00000101’
Шестнадцатеричные числа обозначаются, используя префикс «0x». Например, 0x5A3.
также можно использовать букву «h», которую ставят после числа. Например, 5A3h. При этом, если число начинается не с десятичной цифры, впереди ставится «0» (ноль): 0FFh (25510)

Пример быстрого перевода из одной системы в другую.  (Таблица1)

dec      bin        hex
0    b’00000000’    0x00
1    b’00000001’    0x01
2    b’00000010’    0x02
3    b’00000011’    0x03
4    b’00000100’    0x04
5    b’00000101’    0x05
6    b’00000110’    0x06
7    b’00000111’    0x07
8    b’00001000’    0x08
9    b’00001001’    0x09
10   b’00001010’    0x0A
11   b’00001011’    0x0B
12   b’00001100’    0x0C
13   b’00001101’    0x0D
14   b’00001110’    0x0E
15   b’00001111’    0x0F

И чтобы было понятней, продолжим счет.

dec      bin        hex
16   b’00010000’    0x10
17   b’00010001’    0x11
18   b’00010010’    0x12
19   b’00010011’    0x13
---- -------------- ------
26   b’00011010’    0x1А
27   b’00011011’    0x1B
28   b’00011100     0x1C
---- -------------- ------
60   b’00111100’    0x3C
---- -------------- ------
192  b’11000000’    0xC0
---- -------------- ------
255  b’11111111’    0xFF


Удобно пользоваться для перевода чисел из одной системы в другую, проводить с ними различные арифметические операции с помощью различных калькуляторов, например стандартный  калькулятор  Windows.

Бит (англ. binary digit; также игра слов: англ. bit — немного)
 (один двоичный разряд в двоичной системе счисления) — одна из самых известных единиц измерения информации.

Байт (англ. byte) — единица хранения и обработки цифровой информации. Байт считается равным восьми битам, в этом случае он может принимать одно из 256 (28) различных значений
Наименование и обозначение единицы количества информации «байт» (1 байт = 8 бит) применяются с двоичными приставками «Кило», «Мега», «Гига», которые соответствуют множителям «210», «220» и «230» (1 Кбайт = 1024 байт, 1 Мбайт = 1024 Кбайт, 1 Гбайт = 1024 Мбайт).
В байте биты расположены  справа налево. И счет начинается с 0.

Разряд (позиция, место) – это элемент представления чисел в системах счисления. Разряд является «рабочим местом» цифры в числе. В нашем случае разрядом можно назвать 1 бит в байте.
Регистр — последовательное логическое устройство, используемое для хранения
n-разрядных двоичных чисел и выполнения преобразований над ними. Грубо говоря, несколько ячеек памяти, в которых могут храниться значения 1 или 0. Обычно ячейки памяти называют разрядами регистра.

Слово – определенное количество разрядов, байт или бит. Например говорят: 14 разрядное слово, 22 разрядное слово, 2-х байтное слово… .
Счетчик – регистр, в котором производится двоичный счет, обычно счетчик прибавляет 1
(1 бит). Как только счетчик досчитает до 255 (b’11111111’) и +1, он переполнится и начнет счет опять с нуля.
Если обратить внимание на  Таблицу 1, то в средней колонки виден двоичный счет.

Все правила и обозначения 8 разрядного регистра приведены на рис.1
 
 alt

                                                              рис.1

 Константа – число, не меняющее свое значение в процессе выполнения программы.
 
Переменная – число, которое может изменяться в процессе  выполнения программы

Подведем итог.
  Регистр - физическое устройство с несколькими разрядами, в которых может быть записано слово. Слово может состоять из нескольких байт и бит,  или разрядов
В среднем семействе микроконтроллеров  MICROCHIP применяется 8 разрядный регистр, в который можно записать 1 байт.


1. 2 Что такое программа. Структура программы. Алгоритм. Пример простого алгоритма.


  Программа – это определенный порядок команд, последовательное выполнение которых позволяет получить заданный результат. Программа может быть написана на любом языке программирования, который может быть прочтен человеком.
В таком виде она называется «исходный код», в общем смысле это входные данные для компилятора. Результатом работы, которого будет «исполняемый код» понятный машине.
 
Структура программы

Программа циклична, т.е. программа состоит из циклов, и сама является циклом. В этих циклах, возможны условия, на которые в зависимости, от внешних воздействий или внутренних изменений надо давать однозначный ответ, да – нет. Программа может состоять из подпрограмм, каждая из которых может содержать другие подпрограммы и т.д. Одна и та же подпрограмма может вызываться несколькими подпрограммами.
 Подпрограмма, это часть программы описывающий функционально законченный процесс.
Например: В программе управляющей работой цифрового вольтметра, подпрограммами будут, программа аналого-цифрового измерения, программа работы кнопок, программа работы индикатора и т.д.
  Задача программиста, учитывая структуру применяемого микроконтроллера (мк), предусмотреть все возможные варианты выхода из циклов, при выполнении всех возможных условий.
Если этого не предусмотреть, программа будет выполняться не так как задумано, это может привести  к различным ошибкам  или остановки  программы в одном  цикле. Наглядно, это будет сбой ( зависание, глюк). Устройство не реагирует на клавиатуру, исполнительные устройства включаются или не включаются, как задумано, индикаторы показывают непонятную информацию и т.д.
По этому очень важно на начальном этапе продумать алгоритм программы.
  Алгоритм – это порядок действий, необходимый для выполнения требуемой задачи.
Существует много определений алгоритма, мы остановились на таком варианте, как наиболее понятном. Много теорий построения алгоритмов и они не просты, поэтому в упрощенной форме попробуем определить основные правила создания алгоритма.

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

Пример1:
Задача: Необходимо зажечь красный светодиод 3 раза через 0,5 сек., потом 3 раза зеленый светодиод через 0,5 сек., потом 3 раза оба светодиода через 0,5 сек., и повторить с начала.
Алгоритм программы будет выглядеть так: Рис.2
Видно 3 цикла, 3 условия и общий цикл. Алгоритм программы начинает в точке Старт и там же и заканчивается. Но это не значит, что выполнение программы остановится. Приходя в точку Старт, программа начинает следующий общий цикл и так до бесконечности.

alt

                                                                          Рис.2

1.3 Архитектура микроконтроллера.

     Архитектура. Микроконтроллер представляет собой законченную систему обработки данных. В одном физическом корпусе микросхемы собраны все узлы для самостоятельной работы системы. Все микроконтроллеры фирмы Microchip разделены на три группы по разрядности команд.
1.    Базовое семейство: 12 разрядные команды
2.    Среднее семейство: 14 разрядные команды
3.    Высококачественное семейство: 16 разрядные команды

 Мы будем рассматривать среднее семейство.
Микроконтроллер состоит из ядра и периферийных модулей.
Ядро мк - это основная часть  с помощью которого он и работает.
В состав ядра входит:
1. Тактовый генератор
2. Устройство сброса
3. Центральный процессор (CPU)
4. Арифметическо - логическое устройство (АЛУ)
6. Память
7. Система команд
8. Система прерываний

Периферийные модули это различные модули, выполняющие определенные задачи.
- универсальные порты ввода/вывода
- таймеры (счетчики)
-  АЦП (8 или 10 разрядные)
-  Компараторы
-  источники опорного напряжения
-  модули различных интерфейсов
-  модули ШИМ

Рассмотрим коротко составные части ядра микроконтроллера.
   Тактовый генератор формирует с определенной частотой, импульсную последовательность. Вся работа микроконтроллера синхронизируется с этой импульсной последовательностью. Она называется входным тактовым сигналом. Выполнение одной команды соответствует 4 тактовым входным импульсам или одному циклу выполнения команды. Есть исключения, команды условий (ветвления) выполняются за два  цикла. Следовательно, при частоте тактового генератора 4МГц, частота выполнения команд будет равна 4/4=1МГц.
  
Устройство сброса необходимо для приведения микроконтроллера, всех его модулей, в  заведомо известное состояние. Проще, это устройство внутри ядра, которое при необходимых условиях (включении питания, перепада напряжения питания, помехах, программных сбросах) приведет микроконтроллер в исходное состояние. Обычно у микроконтроллера определен один вход, как вход сброса MCLR.  
  
Центральный процессор (ЦПУ или CPU) предназначен для определения типа команды, расположенной в памяти программ и выполняет определенный порядок действий характерный для данной команды.  Также управляет шиной адреса памяти программ и памяти данных, управляет стеком. ЦПУ выполняет роль своеобразного диспетчера отвечающего за общее функционирования микроконтроллера.

  Арифметическо - логическое устройство (АЛУ или MCU) состоит из арифметического устройства и рабочего регистра W  (аккумулятор). Предназначено для проведения арифметических и логических (булевых) операций  с 8 битными числами (для среднего семейства) между рабочим регистром (W) и любым регистром памяти данных.
 
Память предназначена для хранения информации. Состоит из двух видов памяти
-памяти программа, в неё записываются непосредственно текст программы, порядок действий мк, как мы говорили выше. Команды, это что должен делать мк.
-памяти данных, она структурно сложней. По определенным адресам в ней находятся регистры специального назначения РСН. Эти регистры созданы производителем для настройки режимов работы мк, его внутренних модулей, следить за изменениями при выполнении команд и сигнализировать о полученном результате.
Также в памяти программ находятся регистры общего назначения РОН. Их можем загружать данными по своему усмотрению при разработке программы. Это просто пустые ячейки памяти, пока программист их не выберет.
 
Система команд это система управляющих слов, которые может выполнить микроконтроллер, выполняя программу. Программа состоит из команд. Команды определены производителем. Для человека в символическом виде, для контроллера в двоичном виде. Среднее семейство отличается очень небольшим набором команд. Их очень легко запомнить и их синтаксис подчиняется определенным правилам.  
 
Система прерываний позволяет прерывать выполнение основной программы при возникновении определенных условий. Прерывание бывает необходимо для срочной программной обработки определенного события, предусмотренного программистом.   Например, на входном выводе порта произошел перепад напряжения с низкого в высокий уровень или переполнился регистр таймера и т.д.. Условия и разрешение прерывания задаются программистом с помощью настройки бит в специальных регистрах (РСН). При прерывании также должно быть предусмотрено, что делать в прерывании и когда из него выйти. При выходе из прерывания программа возвращается на тот же адрес памяти программ, откуда она прервалась.

- универсальные порты ввода/вывода предназначены для взаимодействия с внешними устройствами. Порт состоит из нескольких выводов, физических выводов в корпусе микроконтроллера. Каждый вывод при желании, может быть настроен как вход или выход. Также к выводам порта можно подключать входы/выходы внутренних, периферийных модулей.

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

Read 4552 times Last modified on Среда, 03 сентября 2014 14:30

Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru