Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1574
Скачиваний: 1
Примеры выражений: |
|||||
Idi |
rl6, LOW(RAMEND) |
;RAMEND=0x025f, LOW(RAMEND)~0x5f |
|||
out |
SPL, rl6 |
инициализация |
младшего байта указателя |
стека |
|
Idi |
rl6, HIGH(RAMEND) |
; HIGH(RAMEND) =0x02 |
|||
out |
SPH, r!6 |
; инициализация старшего байта указателя |
стека |
||
Mi |
rl6, (1«OCIE1A)\(1«TOIEO) |
загрузить в г16 константу |
|||
;в виде выражения, определяющего разрешения прерываний |
|||||
;таймеров 0 и 1 с использованием символических имен флагов |
|||||
;этих прерываний, |
|||||
out |
TIMSK, г!6 |
;передать константу из г16 в регистр TIMSK. |
|||
Очевидно, что назначение команды с константой в форме выражения бо лее понятно, чем с константой в виде числа 0x11.
Для команды Ipm адрес FLASH указывается в регистре Z со сдвигом на 1 разряд, так как младший бит регистра Z определяет байт, который передается по этой команде из FLASH в гО (1 - старший байт, 0 - младший байт). Если адрес FLASH задан меткой (например, меткой ledbcd), про грамма чтения из FLASH будет следующая:
Idi |
ZL, LOW(ledbcd*2) |
определение адреса FLASH eZ со сдвигом |
|
Idi |
ZH, HIGH(ledbcd*2) |
;на 1 разряд умножением метки на 2 |
|
ipm |
; чтение в гО младшего байта константы по метке |
||
mov |
rl, гО |
;пересылка младшего байта в rl |
|
inc |
ZL |
;адрес старшего байта (если нет переноса в ZH) |
|
Ipm |
; чтение в гО старшего байта константы по метке |
||
Примеры показывают, что использование выражений делает текст про граммы более наглядным и освобождает от необходимости вычисления па раметров для команд вручную.
94
5. РЕАЛИЗАЦИЯ ТИПОВЫХ ФУНКЦИЙ
При подготовке программ необходимо учитывать, что многие стандарт ные задачи могут решаться или встроенными аппаратными средствами микроконтроллера, или программно (процессором микроконтроллера под управлением соответствующей программы). В предыдущих главах приве дено описание всех устройств микроконтроллера и показано, что аппарат ные ресурсы, их режимы и параметры предназначены для выполнения опе раций преобразования и формирования сигналов, которые часто использу ются в задачах управления техническими объектами.
Использование аппаратных средств для реализации стандартных функ ций, как правило, намного эффективнее. Во-первых, ресурсы процессора освобождаются для реализации других необходимых функций, а это при водит и к повышению быстродействия, и к уменьшению объемов рабочих программ. Во-вторых, различные аппаратные средства работают парал лельно и независимо друг от друга, самостоятельно выполняя необходимые функции, и это также повышает быстродействие и существенно расширяет функциональные возможности. В-третьих, система векторных прерываний позволяет достаточно просто организовать корректное взаимодействие и управление всеми ресурсами из рабочей программы микроконтроллера.
При составлении алгоритмов решения задач рекомендуется придержи ваться следующей последовательности:
1.Определить функции и состав средств микроконтроллера, необходимых для решения задачи, отдавая предпочтение аппаратной реализации тре буемых функций.
2.Для выбранных средств реализации определить необходимые рабочие режимы, параметры этих режимов, процедуры инициализации, средства и процедуры организации взаимодействия, а также необходимые для управления и координации работы ресурсы.
3.В начальной части рабочей программы описать вектора прерываний и процедуры инициализации с указанием режимов и параметров для всех используемых аппаратных средств микроконтроллера.
4.В основной части программы организовать выполнение всех программ но реализуемых функций, включая процедуры взаимодействия как аппаратно реализуемых, так и программно реализуемых функций.
5.Дополнить основную программу подпрограммами обслуживания векто ров прерываний, необходимых для программной поддержки работы ап паратных средств.
6.Проверить корректность работы всех средств, используемых для реше ния задачи. Конфликты между параллельно работающими средствами микроконтроллера наиболее часто могут возникать из-за конкуренции
95
при использовании общих ресурсов (регистров общего назначения, яче ек памяти данных, времени работы процессора и т.п.).
Предварительная проверка рабочей программы производится компиля тором при ассемблировании и симулятором инструментального пакета AVR Studio. Необходимо учитывать, что компилятор проводит только син таксический контроль текста программы, а моделирование работы аппа ратных средств симулятором возможно в весьма ограниченных пределах.
5.1. Примеры программ для микроконтроллеров AVR
Далее приводятся примеры программ для реализации стандартных функций.
Пример 1. Передать в последовательном формате из микроконтроллера во внешний регистр 4 байта данных, находящихся в RAM по адре сам: $060, $061, $062, $063, с формированием для внешнего ре гистра сигнала завершения цикла передачи - load.
Вариант "а". Задачу передачи данных в последовательном формате можно решить использованием интерфейса микроконтроллера SPI, для ад ресации данных в ОЗУ целесообразно использовать один из регистров кос венной адресации, например, регистр X.
Для передачи данных необходимо определить в SPI режим master с формированием сигналов SCK (PB7), MOSI (PB5). Вход MISO (PB6) в дан ной задаче не используется, сигнал завершения цикла может быть сформи рован только программно на одном из выходов, например, РВ4. Регистр управления интерфейса SRCR должен быть инициализирован следующим образом: 0Ь01011100, старший бит SPIE этого регистра должен программно устанавливаться в начале цикла и очищаться в конце цикла. Необходимо также использовать вектор прерывания SPITC с адресом $00а.
В приведенном далее тексте программы начальная часть, как и во всех последующих примерах программ, содержит файл определения символиче ских имен и обязательную процедуру инициализации стека. Текст про граммы (и всех остальных программ) записан в соответствии с требова ниями компилятора.
; программа примера 1, вариант "а"
.NOLIST
.INCLUDE "8535def.inc"
.LIST
.DEFtemp = г 16 определить символическое имя temp регистру г16
.CSEG
.ORG $000
rjmp init прерывание по reset
.ORG $00a
96
rjmp |
spite |
прерывание по завершению передачи байта |
||
.ORG $011 |
||||
ink: |
ldi |
temp, iow(RAMEND) |
||
out |
SPL, temp |
|||
ldi |
temp, high(RAMEND) |
|||
out SPH, temp |
; определить в указателе стека адрес RAMEND |
|||
ldi |
temp, SfO |
|||
out DDRB, temp |
; 4 старших бита PORTB на вывод данных |
|||
ldi |
temp, ОЬОЮШОО |
|||
out |
SPCR, temp |
; инициализация SPI |
||
;запуск цикла с выводом первого байта в последовательном формате
start: clr |
XH |
Idi |
XL, $60 ; занести начальный адрес данных в регистр X |
Id temp, X+ ; занести в temp байт с постинкрементом адреса в X |
|
out |
SPDR, temp ; переслать байт в регистр данных SP1 |
sbi |
SPCR, SPIE ; установить разрешение прерывания SPI |
sei |
; установить флаг общего разрешения прерываний |
;бессодержательный бесконечный цикл, может быть заменен любой
;программой
main: nop |
|||
rjmp |
main |
||
;п/программа для вектора прерывания SP1 |
|||
spite: cpi |
XL, $64 |
||
breq end |
; перейти, если цикл завершен |
||
Id temp, X+ |
; занести в temp байт с постинкрементом адреса в X |
||
out SPDR, temp |
; переслать байт в регистр данных SPI |
||
reti |
; возврат из прерывания |
||
; завершение цикла |
|||
end: sbi PORTB, PB4 |
; установить сигнал load |
||
cbi SPCR, SPIE |
; запретить прерывание SPI |
||
cbi PORTB, PB4 ; сбросить сигнал load |
|||
reti |
; возврат из прерывания |
||
В этом варианте программы в течение цикла выдачи 4-х байт данных в последовательном формате процессор используется для запуска цикла (метка start - 6 команд), три раза для обслуживания прерывания (метка spite - 5 команд) и для завершения цикла (метки spite, end - 6 команд). То есть для решения задачи требуется всего 27 команд, остальные операции реали зуется аппаратно.
97
Процедура вывода данных может быть запущена программно командой передачи управления на метку start в любой момент времени после завер шения цикла. Пока работает интерфейс SPI можно программно реализовать параллельное выполнение других функций. В приведенном примере это отражено бессодержательным циклом (метка main), который можно заме нить какой-либо прикладной программой.
Вариант "б". Задачу передачи данных в последовательном формате можно решить программно, передавая на те же выходы порта В программ но формируемые сигналы, для адресации данных в RAM также будем ис пользовать регистр косвенной адресации X.
; программа примера 1, вариант "б"
.NOLIST
.INCLUDE "8535def.inc"
.LIST
.DEF temp = r16 |
определить символическое имя temp регистру г16 |
|||
.CSEG |
||||
.ORG $000 |
||||
rjmp |
init |
прерывание по reset |
||
.ORG $011 |
||||
init: |
Idi |
temp, low(RAMEND) |
||
out |
SPL, temp |
|||
ldi |
temp, high(RAMEND) |
|||
out SPH, temp |
; определить в указателе стека адрес RAMEND |
|||
ldi |
temp,$f0 |
|||
out DDRB, temp |
; 4 старших бита PORTB на вывод данных |
|||
sbi |
PORTB, PB7 |
|||
;запуск цикла с выводом первого байта в последовательном формате
start: cli |
; очистить флаг разрешения прерываний |
|||
clr |
XH |
|||
ldi |
XL, $60 ; занести начальный адрес данных в регистр X |
|||
byte: Id temp, Х+ |
; занести в temp байт с постинкрементом адреса в X |
|||
ldi |
г17, $08 |
; определить количество бит в байте |
||
bit: |
sbrs temp, 7 |
; пропустить, если бит 7 установлен |
||
cbi |
PORTB, PB5 |
; очистить РВ5 |
||
sbrc temp, 7 |
; пропустить, если бит 7 очищен |
|||
sbi |
PORTB, PB5 |
; установить РВ5 |
||
cbi |
PORTB, PB7 |
; очистить РВ7 (сигнал SCK) |
||
lsl |
temp |
; сдвиг влево байта данных |
||
sbi |
PORTB, PB7 |
; установить РВ7 (сигнал SCK) |
||
98
dec |
rl 7 |
; декремент числа бит для вывода |
|
brpl |
bit |
;вернуться к метке bit, если не все |
|
cpi |
XL, S64 |
;биты в байте переданы |
|
; сравнить адрес с конечным для цикла |
|||
brne byte |
; перейти, если цикл не завершен |
||
; завершение цикла |
|||
end: sbi |
PORTB, PB4 |
; установить сигнал load |
|
nop |
|||
cbi |
PORTB, PB4 |
; сбросить сигнал load |
|
sei |
; общее разрешение прерываний |
||
; бессодержательный бесконечный цикл, может быть заменен любой про граммой
main: nop rjmpmain
В варианте программной реализации фрагмент программы для вывода ка ждого бита (метка bit - 9 команд) повторяется 32 раза, фрагмент запуска цикла (метка start - 3 команды) и завершения цикла (метка end - 4 коман ды) - 1 раз, фрагмент подготовки байта для вывода (метка byte - 2 коман ды) - 4 раза, т.е. необходимо выполнить 303 команды.
Таким образом, вариант программной реализации по объему операций, выполняемых процессором, существенно больше и, самое главное, полно стью загружает процессор, не позволял параллельно с выводом данных вы полнять какие-либо другие функции.
Пример 2. Выполнить преобразование аналоговых сигналов, поступающих на входы РАО, РА1, РА2 и РАЗ, в цифровой код; преобразовать выходные коды АЦП в 8-битовый формат, пренебрегая значе ниями младших разрядов; записать полученные коды в ОЗУ по адресам: $060, $061, $062, $063.
Для решения задачи будем использовать АЦП в режиме однократного преобразования с повышенной тактовой частотой, так как младшие разря ды выходного кода АЦП не используются. Вектор прерывания АЦП необ ходимо использовать для приема и обработки выходного кода АЦП. Номер бита порта А, с которого поступает сигнал для преобразования, определя ется регистром ADMUX. Для адресации будем использовать регистр X.
99