Урок 2. Регистры микроконтроллера. Порты ввода/вывода

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

Для программиста понятие регистр может ассоциироваться с понятием переменной. В нашем курсе по микроконтроллерам мы будем учиться писать программы на языке С. Конечно же для более глубокого понимания принципа работы микроконтроллера лучше изучить его программирование на языке Assembler, но на мой взгляд этот язык будет сложен в понимания для начинающих программистов. В принципе, на ассемблере можно писать только небольшие и несложные программы, ну или подпрограммы (функции), где требуется высокое быстродействие. Лично я начинал изучать микроконтроллеры на языке C.

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

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

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

Например:

            unsigned char my_variable;

Данные, записываемые в эту переменную, будут занимать в оперативной памяти 1 байт, т.к. переменная типа unsigned char имеет размер 1 байт. Если мы захотим сложить два числа и получить результат, мы можем создать три переменных:

            unsigned char var1, var2, sum;

Затем произвести арифметическую операцию сложения:

            sum = var1 + var2;

Значение из регистров, которые связаны с переменными var1 и var2, поступят на обработку АЛУ. Затем АЛУ выдаст результат операции (в данном случае сложения) в ячейку памяти, связанную с переменной sum.

Помимо регистров общего назначения, в микроконтроллере есть регистры специального назначения, которые играют очень важную роль. Без них микроконтроллер был бы бессмысленной «железкой». С помощью регистров специального назначения выполняется управление функциями ядра и периферийными модулями  микроконтроллера (таймеры, АЦП, аналоговые компараторы, UART, USB и т.д.), а также портами ввода-вывода. В отличие от регистров общего назначения, регистрам специального назначения строго присвоены свои адреса. Меняя значения регистров специального назначения можно управлять работой всех модулей микроконтроллера. Для примера рассмотрим карту памяти микроконтроллера PIC12F675.

Ячейки, обозначенные серым цветом – не используемая область памяти. Как видно, данный микроконтроллер имеет 64 байта ОЗУ (General Purpose Registers– регистры общего назначения) и два банка памяти. Если необходимо писать программу на ассемблере, то всегда нужно помнить в каком банке памяти находится необходимый регистр и на протяжении всей программы нужно постоянно переключаться между банками памяти. Написание программы на языке Си избавляет программиста от этой головной боли.

Итак, рассмотрим для примера регистр специального назначения GPIO. GPIO - 8-разрядный регистр порта ввода/вывода. С помощью этого регистра мы можем установить на определенных цифровых выходах микроконтроллера логическую 1 или 0. Данный регистр обычно настраивается совместно с регистром TRISIO. Регистр TRISIO определяет направление работы порта. Как было сказано в предыдущем уроке, порты микроконтроллера можно настроить для работы в качестве выходов или входов.

Микроконтроллер PIC12F675 представляет собой 8-выводную микросхему, у которой есть только 6 цифровых входов/выходов:

Рассмотрим более детально описание регистров GPIO и TRISIO:

Если записать в программе следующие строки

            TRISIO = 0b00010100;

            GPIO = 0b00100011;

то это означает, что пины 7,6,4 и 2 будут работать на выход. Пины 7,6 и 2 будут установлены в 1, а пин 4 будет иметь низкий уровень – 0. Биты 6 и 7, обозначенные серым цветом,  в регистрах не используются и то, что будет в них записано не имеет никакого смысла. 0b00100011 – буква b данной записи обозначает двоичное представление числа.

Бывают также десятичное (привычное для нас), восьмеричное и шестнадцатеричное представление числа. В начале шестнадцатеричного числа записывается 0x, восьмеричного – цифра 0. Подробнее о системах счисления можно почитать здесь.

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

Комментарии

Уважаемые читатели, если Вы прочитали эту статью, то пожалуйста напишите мнение о ней.

 

Материал подан на отлично. Даже такой новичок, как я, понял практически все основные моменты. Большое спасибо за такие классные статьи . Теперь буду частенько заходить на этот сайт.

Очень хорошо написано! Простыми словами. до этого много читал,но конкретное понятии о микроконтроллерах было мало. Спасибо! Продолжайте таком же темпе! ЖДЕМ новых стати!

GPIO это же General Purpose in/out, получается, что это регистр НЕ специального назначения?