Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11 Программирование микроконтроллеров.pptx
Скачиваний:
24
Добавлен:
19.01.2023
Размер:
739.71 Кб
Скачать

Программирование микроконтроллеров

XOR.B – Исключающее «ИЛИ» источника и получателя. Над операндами источника и получателя выполняется поразрядная операция исключающего «ИЛИ» (сумма по модулю 2). Результат помещается в получатель. Операнд источника не изменяется.

Пример – Переключение битов в байте регистра P1OUT.

XOR.B #041h,&P1OUT ; Переключение битов P0 (красный) и P6 (зеленый) байта регистра P1OUT

XOR.B #01000001b,&P1OUT ; Переключение битов P0 (красный) и P6 (зеленый) байта регистра P1OUT

BIT.B – Проверка битов получателя. Над операндом источника и операндом получателя выполняется операция логического «И» (логическое умножение). Результат влияет только на биты статуса. Операнды источника и получателя не изменяются. Бит статуса Z: Устанавливается, если результат «0», в противном случае сбрасывается. Бит статуса C: Устанавливается, если результат не «0»; в противном случае сбрасывается (.NOT. Zero).

Пример – Если бит 3 регистра R8 установлен, выполняется переход к метке TOM:

BIT #8,R8

JС TOM

Программирование микроконтроллеров

Пример программы – управление красным светодиодом от кнопки (проект msp430g2xx2_P1_03.asm)

RESET

 

mov.w

#0280h,SP

 

; Initialize stackpointer

StopWDT

 

mov.w

#WDTPW+WDTHOLD,&WDTCTL ; Stop WDT

SetupP1

 

mov.b

 

#001h,&P1DIR

; P1.0 output, else input

 

 

mov.b

 

#008h,&P1OUT

; P1.3 set, else reset

 

 

bis.b

#008h,&P1REN

; P1.3 pullup

Mainloop

 

bit.b

#008h,&P1IN

 

; P1.3 hi/low?

 

 

jc ON

; jmp--> P1.3 is set

OFF

bic.b

#001h,&P1OUT

 

; P1.0 = 0 / LED OFF

 

 

jmp

 

Mainloop

 

;

ON

bis.b

#001h,&P1OUT

 

; P1.0 = 1 / LED ON

 

 

jmp

 

Mainloop

 

;

Программирование микроконтроллеров

Язык C/C++. Поразрядные (побитовые) операции

Эти операции применяются над 16-разрядными словами типа int (целое) или unsigned int (беззнаковое целое).

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

При выполнении арифметических операций над числами в разных форматах широко используются операции сдвига влево или вправо на заданное число зарядов. При этом число разрядов сдвига указывается через пробел сразу после знака соответствующей операции << или >>. Такой сдвиг является логическим — на освободившиеся места записываются логические нули, а «вытесняемые» за пределы слова разряды — теряются.

Программирование микроконтроллеров

Следует быть внимательным и отличать побитовые логические операции & и | от логических операций над булевыми переменными && и ||.

Примеры использования поразрядных операций:

int x,y,z;

...

x = y & 0xFF; //выделение младшего байта слова z = y >> 8; //выделение старшего байта слова

Оператор присваивания

В языке Си символом оператора присваивания является знак =. В программах на Си широко используются операторы составного присваивания: вначале над переменной выполняется указанная перед символом “=“ арифметическая или логическая операция, после чего результат операции сохраняется в переменной. Составное присваивание выполняется в режиме: «Чтение старого значения переменной — Модификация — Запись нового значения».

Варианты составных операций присваивания приведены в таблице.

Обратите внимание, что операции поразрядной конъюнкции И, дизъюнкции ИЛИ и Исключающего ИЛИ задаются с помощью символов &, | и ^ соответственно. В приведенных примерах для четырех младших битов переменной y производятся: очистка, установка и побитовое инвертирование соответствующих разрядов.

Программирование микроконтроллеров

Система обозначений для двоичных и шестнадцатеричных констант: окончание b в константе указывает на двоичную константу, а последовательность из расположенных впереди символов 0x или 0Х — на шестнадцатеричную константу. Например, десятичное число 31 можно записать как 00011111b в двоичной системе счисления и как 0x1F — в шестнадцатеричной.

Программирование микроконтроллеров

Доступ к регистрам встроенных периферийных устройств микроконтроллеров MSP430 на языке С/C++

На кристалл микроконтроллеров MSP430 интегрировано большое число периферийных устройств (ПУ): гибридных портов ввода-вывода, аналого-цифрового преобразователя, портов последовательного асинхронного и синхронного ввода/вывода и т. п. Работа с ними выполняется с помощью соответствующих регистров, которые отображены на память данных микроконтроллера. Соответствующие области памяти данных называются периферийными фреймами. Термин «отображены на память данных» следует понимать так, что некоторые ячейки внутренней памяти данных микроконтроллера жестко отведены производителем под регистры ПУ и не могут использоваться как память данных общего назначения (для размещения переменных пользователя).

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

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

Доступ к регистрам периферийных устройств наиболее удобно производить на основе структурного подхода. Texas Instruments поставляет уже готовую библиотеку файлов для работы с периферией для всех типов выпускаемых микроконтроллеров.

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

Откроем в качестве примера проект msp430g2xx2_1.c (мигание светодиода) и рассмотрим более подробно его содержимое, исходная программа которого представлена на рисунке.

Программирование микроконтроллеров

В состав проекта входит основная программа msp430g2xx2_1.c подключенным файлом – специальным заголовочным файлом описания периферии всех микроконтроллеров серии MSP430 — MSP430.h.

Программирование микроконтроллеров

Подключаемый заголовочный файл микроконтроллера содержит стандартные определения регистров и битов, а также полное описание периферийных устройств – их специфических регистров и битов. Этот файл поддерживает разработку программ как на ассемблере, так и на Си.

Примеры программирования цифрового порта:

oP1DIR |= 0x01; // Линия P1.0 настраивается на выход oP1DIR &= 0xFB; // Линия P1.2 настраивается на вход oP1DIR &= ~0x04; // Линия P1.2 настраивается на вход

oP1OUT ^= 0x01; // Инверсия выхода P1.0 через исключающее ИЛИ

o if ((0x10 & P1IN)) P1OUT |= 0x01;

// if P1.4 set, set P1.0

o else P1OUT &= ~0x01;

// else reset

Пример программы – управление красным светодиодом от кнопки (проект msp430g2xx2_P1_03.c)

o#include <msp430.h>

 

 

oint main(void)

 

 

o{

 

 

 

o WDTCTL = WDTPW + WDTHOLD;

// Stop watchdog timer

o P1DIR = 0x01;

// P1.0 output, else input

o P1OUT = 0x08;

// P1.3 set, else reset

o P1REN |= 0x08;

// P1.3 pullup

o while (1)

// Test P1.4

o {

 

 

 

o

if (0x08 & P1IN) P1OUT |= 0x01;

// if P1.3 set, set P1.0

o

else P1OUT &= ~0x01;

 

// else reset

o }

 

 

 

o}

 

 

 

Программирование микроконтроллеров

Язык Arduino Wiring C/C++

В отличие от языка CCS C/C++, в языке Arduino Wiring для ввода и вывода данных используются специальные функции – например, для цифрового ввода и вывода это соответственно функции digitalRead() и digitalWrite(). Эти функции одним из параметров имеют номера (имена) выводов микроконтроллера, по которым нужно осуществить обмен данными.

В программах выводы микроконтроллера могут именоваться несколькими способами:

по натуральным номерам выводов микроконтроллера. Например, для обращения к красному светодиоду можно использовать номер вывода 2, к которому он подключен: pinMode(2, OUTPUT); digitalWrite(2, HIGH);

по символическим именам линий портов микроконтроллера. Например, для обращения к красному светодиоду можно использовать номер линии P1_0 порта P1, к которой он подключен: pinMode(P1_0, OUTPUT); digitalWrite(P1_0, HIGH);

по символическим именам светодиодов (RED_LED, GREEN_LED), кнопок (PUSH2) и сигналов (XIN, XOUT, TEST, RESET, TXD, RXD).

Соответствия номеров выводов и их возможных символических имен, используемых в различных режимах, показаны на рисунке для микроконтроллера MSP430G2452.

Программирование микроконтроллеров