Лекции.ИНФО


INCLUDE –вставить другой файл



Директива INCLUDE говорит Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.
Синтаксис:

.INCLUDE "имя файла"

Пример:

; iodefs.asm:
.EQU sreg = 0x3f ; Регистр статуса
.EQU sphigh = 0x3e ; Старший байт указателя стека.
.EQU splow = 0x3d; ; Младший байт указателя стека.
; incdemo.asm
.INCLUDE iodefs.asm ; Включить файл «iodefs.asm»
in r0,sreg ; Прочитать регистр статуса

EXIT – выйти из файла

Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.
Синтаксис:

.EXIT

Пример:

.EXIT ; выйти из этого файла

DEVICE - Указать для какого микроконтроллера ассемблировать
Директива позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.
Синтаксис:

.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

Пример:

.DEVICE AT90S8535 ; использовать AT90S8535
.CSEG
.ORG 0000
jmp label1; При ассемблировании появиться сообщение, что ;AT90S8535 не поддерживает команду jmp
1.5.2.4 Некоторые особенности программирования

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

Например, команда:

MOV R10,R15 - скопировать регистр R15 в регистр R10
делает абсолютно то же самое, что и команда:
LDS R10,$0015 - загрузить в регистр R10 содержимое ячейки с адресом $0015
То же самое относится и к регистрам ввода/вывода. Для них предусмотрены специальные команды:
IN Rd,P - загрузить данные из порта I/O с номером Р в регистр Rd
OUT P,Rd - записать данные из регистра Rd в порт I/O с номером Р.
При использовании этих команд номер порта указывается в диапазоне 0<P<63. При использовании команд адресации ячеек памяти для работы с регистрами ввода/вывода указывается адрес регистра в памяти данных $0020-$005F.
Пример применения разных команд:

LDI R16,$FF
OUT $12,R16 - записать в PORTD число 255.
STS $0032,R16 - записать непосредственно в ячейку $0032 число 255.
Адрес регистра ввода/вывода в СОЗУ получается прибавлением к номеру порта числа $20.
Память программ является ПЗУ и изменяется только при программировании кристалла. Константы можно располагать в памяти программ в виде слов.

Например: .dw $033f,$676d,$7653,$237e,$777f
Для работы с данными, расположенными в памяти программ, предусмотрена команда
LPM - загрузить байт памяти программ, на который указывает регистр Z в регистр R0.
Адрес байта константы определяется содержимым регистра Z. Старшие 15 битов определяют слово адреса (от 0 до 4к) состояние младшего бита определяет выбор младшего байта (0) или старшего байта (1).
При работе с портами ввода/вывода следует учитывать следующую особенность. Если вывод порта сконфигурирован как выход, то его переключение производится через регистр данных (PORTA, PORTB, PORTC, PORTD), если вывод сконфигурирован как вход, то его опрос следует производить через регистр выводов входа порта (PINA, PINB, PINC, PIND).
Особенностью использования арифметических и логических команд является то, что некоторые из них работают только с регистрами R16-R31.

Пример:

CPI Rd,K - сравнить регистр Rd с константой К. 16<d<31.
Команды CBI и SBI работают только с младшими 32-мя регистрами ввода/вывода.
При использовании подпрограмм нужно обязательно определять стек! Для этого нужно занести значения адреса вершины стека в регистры SPH и SPL.

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

 

Написание программы

Текст программы можно набирать в любом текстовом редакторе, такие как встроенный редактор Norton Commander, FAR, а также Microsoft Word, WordPad и других. Также можно использовать специально предназначенные для этого программы Wavrasm, AVR Studio
Для создания программы не обязательно использовать ассемблер, программное обеспечение AVR поддерживает также и язык C или С++. Но в лабораторном комплексе этот вариант не рассматривается.
Программа, написанная на ассемблере, должна иметь определенную структуру.
Предлагается следующий шаблон (для AT90S8535)

;*******************************************
; название программы,
; краткое описание, необходимые пояснения
:*******************************************
;******подключаемые дополнительные файлы
.include “8535def.inc” ; файл описания AT90S8535
.include «имя_файла1.расширение» ; включение дополнительных
.include «имя_файла2.расширение» ; файлов
;******глобальные константы
.equ имя1 = xxxx ;
.equ имя2 = nnnn
;******глобальные регистровые переменные
.def имя1= регистр
.def имя2= регистр
;*******сегмент данных
.dseg
.org xxxx ; адрес первого зарезервированного байта
label1: .BYTE 1 ; резервировать 1 байт под переменную label1
label2: .BYTE m ; резервировать m байт под переменную label2
;****** сегментEEPROM(ЭСППЗУ)
.eseg
.org xxxx ; адрес первого зарезервированного байта
.db выражение1,выражение2,… ; записать список байтов в EEPROM.
.dw выражение1,выражение2,… ; записать список слов в EEPROM.
;******сегмент кодов
.cseg
.org $0000 ; адрес начала программы в программной памяти
;****** вектора прерываний (если они используются)
rjmp reset ;прерывание по сбросу
.org $0002
rjmp INT0 ;обработчик прерывания IRQ0
.org $0004
rjmp INT1 ;обработчик прерывания IRQ1
.org adrINTx ;адрес следующего обработчика прерываний
rjmp INTx ;обработчик прерывания x
……. ;далее по порядку располагать обработчики остальных ;прерываний

;*******начало основной программы
main: <команда> xxxx
… …

;******* подпрограммы
;*******подпрограмма 1
subr1: <команда> xxxx
…… ………. ……
ret
;*******подпрограмма 2
subr2: <команда> xxxx
…… ………. ……
ret
…………….
;******* программы обработчиков прерываний
INT0: <команда> xxxx
…… ………. ……
reti
INT1: <команда> xxxx
…… ………. ……
reti
INTx: <команда> xxxx
…… ………. ……
reti
………………………
; конец программы никак не обозначается.

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

Как уже указывалось, программа простейшая: вычесть из числа 5 число 3. Если включен тумблер SA1 (рис. 1.2), то на индикацию выдать результат вычитания. Если тумблер SA1отключен – на индикацию вывести цифру ноль.
Алгоритм программы (рис. 1.5) соответствует программе №1, использующей директиву equ ассемблера.
Программа №2 отличается от программы №1 резервированием по одному байту оперативной памяти под семисегментные коды цифр от 0 до 9.

Программа №3 самая короткая. Она использует директиву .dw для определения слов в программной памяти. В программе используется команда LPM ассемблера. По этой команде загружается байт, адресуемый регистром Z в регистр R0. Команда обеспечивает доступ к любому байту памяти программы, организованной как 16 битное слово. Младший бит регистра Z определяет, осуществляется ли доступ к младшему байту слова (0) или к старшему (1).

Рис. 1.5 Алгоритм программы №1

;Программа №1.Использование директивы equ

.include "8535def.inc" ;включить файл – описание для AT90S8535
.dseg ;сегмент данных
.equ cod0=$64 ;присвоение имен ячейкам SRAM
.equ cod1=$65
.equ cod2=$66
.equ cod3=$67
.equ cod4=$68
.equ cod5=$69
.equ cod6=$6a
.equ cod7=$6b
.equ cod8=$6c
.equ cod9=$6d

.cseg
.org 0
rjmp reset
.org $30 ;начало программы

reset:
ldi r16,$00 ;определение стека с вершиной по адресу $00ff
out sph,r16
ldi r16,$ff
out spl,r16

ldi zl,$64 ;задание адреса начала зарезервированных ячеек
ldi zh,$00

ldi r16,$ff ;настроить порт С на выход
out ddrc,r16
ldi r16,00 ;настроить порт А на вход
out ddra,r16
ldi r16,$c ;настроить порт В: биты 2 и 3 на выход, остальные на вход
out ddrb,r16
ldi r16,$f0 ;настроить порт D: биты 0...4 на вход, остальные на выход
out ddrd,r16

sbi portB,3 ;выдать 1 на разряд 3 порта В

 

ldi r17,$3f ;задание семисегментных кодов
sts cod0,r17
ldi r17,$06
sts cod1,r17
ldi r17,$5b
sts cod2,r17
ldi r17,$4f
sts cod3,r17
ldi r17,$66
sts cod4,r17
ldi r17,$6d
sts cod5,r17
ldi r17,$7d
sts cod6,r17
ldi r17,$07
sts cod7,r17
ldi r17,$7f
sts cod8,r17
ldi r17,$6f
sts cod9,r17

ldi r17,5 ;задание уменьшаемого
ldi r18,3 ;задание вычитаемого

m1: sbis pina,4 ;если включен тумблер SA1,то пропустить
rjmp m2 ;следующую команду

mov r20,r17 ; в r20 поместить уменьшаемое
sub r20,r18 ; вычесть вычитаемое
rjmp vv
m2:
ldi r20,0
vv:
push zl ;сохранить zl в стеке
add zl,r20 ;сложить zl с результатом
ld r0,z ;семисегментный код результата переслать в r20
pop zl ;извлечь zl из стека
out portc,r0 ;выдать результат на индикацию
rjmp m1

;Программа №2. Использование оперативной памяти под переменные

.include "8535def.inc" ;подключение файла описания AT90S8535

.dseg ;сегмент данных
.org $64 ;адрес первого зарезервированного байта
cod0:.byte 1 ;резервирование по одному байту под переменные
cod1:.byte 1
cod2:.byte 1
cod3:.byte 1
cod4:.byte 1
cod5:.byte 1
cod6:.byte 1
cod7:.byte 1
cod8:.byte 1
cod9:.byte 1

.cseg ;сегмент кодов
.org $0 ;адрес начала программы в программной памяти
rjmp reset ;прерывание по сбросу при подаче питания
;или при нажатии на кнопку "Сброс"
reset:
ldi r16,$00 ;определение стека с вершиной по адресу $00ff
out sph,r16
ldi r16,$ff
out spl,r16

ldi zl,$64 ;задание адреса начала зарезервированных ячеек
ldi zh,$00

ldi r16,$ff ;настроить порт С на выход
out ddrc,r16
ldi r16,00 ;настроить порт А на вход
out ddra,r16
ldi r16,$c ;настроить порт В: биты 2 и 3 на выход, остальные на вход
out ddrb,r16
ldi r16,$f0 ;настроить порт D: биты 0...4 на вход, остальные на выход
out ddrd,r16

sbi portb,3 ;выдать 1 на разряд 3 порта В

 

ldi r17,$3f ;задание семисегментных кодов
sts cod0,r17
ldi r17,$06
sts cod1,r17
ldi r17,$5b
sts cod2,r17
ldi r17,$4f
sts cod3,r17
ldi r17,$66
sts cod4,r17
ldi r17,$6d
sts cod5,r17
ldi r17,$7d
sts cod6,r17
ldi r17,$07
sts cod7,r17
ldi r17,$7f
sts cod8,r17
ldi r17,$6f
sts cod9,r17

ldi r17,5 ;задание уменьшаемого
ldi r18,3 ;задание вычитаемого

m1: sbis pina,4 ;если включен тумблер SA1,то пропустить
rjmp m2 ;следующую команду

mov r20,r17 ; в r20 поместить уменьшаемое
sub r20,r18 ; вычесть вычитаемое
rjmp vv
m2:
ldi r20,0
vv: push zl ;сохранить zl в стеке
add zl,r20 ;сложить zl с результатом
ld r0,z ;семисегментный код результата переслать в r20
pop zl ;извлечь zl из стека
out portc,r0 ;выдать результат на индикацию
rjmp m1

;Программа №3. Использование директивы .dw

.include "8535def.inc" ;подключение файла описания AT90S8535

.cseg
.org 0
rjmp reset
.dw $063f,$4f5b,$6d66,$077d,$6f7f,$7c77,$5e39,$7179 ;семисегментные коды
reset:
ldi r16,$00 ;определение стека с вершиной по адресу $00ff
out sph,r16
ldi r16,$ff
out spl,r16
ldi r16,$ff
out ddrc,r16 ;настроить порт С на выход
ldi r16,00
out ddra,r16 ;настроить порт А на вход
ldi r16,$c
out ddrb,r16 ;настроить порт В: биты 2 и 3 на выход, остальные на вход
ldi r16,$f0
out ddrd,r16 ;настроить порт D: биты 0...4 на вход, остальные на выход

sbi portb,3 ;выдать 1 на разряд 3 порта В

ldi zl,02 ;установить адрес семисегментного кода нуля в регистр Z
ldi zh,00

ldi r17,5 ;задание уменьшаемого
ldi r18,3 ;задание вычитаемого

m1: sbis pina,4 ;если включен SA1, то пропустить следующую команду
rjmp m2
mov r20,r17 ;в r20 поместить уменьшаемое
sub r20,r18 ;вычесть вычитаемое
rjmp vv
m2:
ldi r20,0 ;присвоить результату значение нуль
vv: push zl ;сохранить zl в стеке
add zl,r20 ; сложить zl с результатом
lpm ;загружаем бит, адресуемый регистром Z, в регистр R0
pop zl ;извлечь zl из стека
out portc,r0 ;выдать результат на индикацию
rjmp m1

 

Ввод программы

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

Переключатель режима работы платы ЖКИ рабочего места необходимо поставить в положение “Программирование”. При нажатии на кнопку “Сброс” блока управления на ЖКИ появляется надпись “Место” с соответствующим номером. Этому номеру будет соответствовать окно на экране дисплея ПЭВМ.

Программное обеспечение располагается в каталоге STAND90, в котором есть два подкаталога SERVER и PK&MK. Программное обеспечение работает в среде WINDOWS. Программа SERVER запускается файлом server.bat, программа PK&MK – файлом Pk&mk.exe.
Сразу после запуска программы-сервера на экран выводится меню из трех пунктов: 1 – удалить старые файлы (например, оставшиеся после предыдущей работы), 2 – загрузить старые файлы (для продолжения работы с ними), 3 – любая другая клавиша (например, пробел или Esc) – не удалять и не загружать. После нажатия соответствующей клавиши на экране появляется восемь окон.
Пример содержимого экрана ПЭВМ во время работы программы представлен на рис. 1.6.

Каждое окно имеет надпись “Место” с номером рабочего места и область размером 4х16 знакомест, в которой отображается информация, выводимая на ЖКИ соответствующего рабочего места. Внизу экрана имеется строка, в которой описаны “горячие” клавиши – клавиши и сочетания клавиш, нажатия на которые вызывают определенные действия.

Из “горячих” клавиш студенту доступна только клавиша F6 (просмотр ошибок). Назначение “горячих” клавиш представлено в табл. 1.3.
Узлы набора программ рабочих мест имеют встроенный микроконтроллер AT89C51 для управления ЖКИ и клавиатурой. Микроконтроллер передает клавиатурные коды с рабочих мест в ПЭВМ и отображает принятые от ПЭВМ данные на ЖКИ.

 

Рис. 1.6. Изображение на экране ПЭВМ

 

 

Таблица 1.3.
«Горячие» клавиши

Alt–X Выход из программы
Alt–номер Выбор номера места, с которым работает преподаватель: “номер” – число от 1 до 8. Выбранное окно выделяется цветной рамкой
F2 Запись программы выбранного места из ОЗУ на винчестер
F4 Включение режима редактирования (и листания) преподавателем программы выбранного места; при этом запрещен ввод программы с соответствующего рабочего места
F5 “Распахивание” выбранного окна на половину экрана; при этом преподаватель может листать текст программы независимо от студента. Повторное нажатие F5 возвращает экран в исходное состояние
F6 Переключение на режим просмотра ошибок в программе выбранного места; это переключение возможно только из режима редактирования.
F8 Очистка текстового буфера выбранного места; для сохранения очистки нужно после этого нажать клавишу F2.
F9 Запуск процесса компиляции или печати

После появления восьмиоконного изображения на экране, студент нажимает кнопку «Сброс» блока управления и клавишу «Пробел» на клавиатуре рабочего места. Появляется на ЖКИ точно такое же изображение как в соответствующем окне монитора ПЭВМ. Теперь можно проводить на своем рабочем месте набор подготовленной дома программы.

Так как у ЖКИ в строке только 16 знакомест, в которые должна укладываться директива или команда, то возникают сложности с размещением «длинных» директив или команд. К «длинной» директиве, требующей более 16 знакомест, относится и необходимая в каждой программе в обязательном порядке директива .include “8535def.inc”. С клавиатуры ЖКИ ввести её в ПЭВМ невозможно. Поэтому в программном обеспечении комплекса предусмотрено ввод этой директивы в программу, которую набирает обучаемый, до компиляции. Таким образом, если эта директива не будет введена в программу, то она будет проставлена автоматически и ошибки не возникнет. Но необходимо отметить, что если эта директива будет введена с рабочего места не полностью, то это вызовет ошибку компиляции. Поэтому эту директиву с рабочего места вводить не нужно.

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

После набора и просмотра программы студент подходит к преподавателю и сообщает о завершении набора программы. Преподаватель предупреждает студентов о временном прекращении их работы и выбирает окно на экране дисплея нажатием клавиш Alt + цифра номера рабочего места. Нажимает клавишу F4 (редактирование), просматривает программу и при необходимости вводит соответствующие коррективы в программу. Затем нажимает клавишу F9 (компиляция программы).
После компиляции программы появляется на экране монитора сообщение о наличии и количестве ошибок в программе (если они есть), например, такого вида “Assemble complete with 1 error”. Или сообщение об их отсутствии “Assemble complete with no errors” и предложение выбора действия в виде сообщения:
Выберите:

ESC – продолжение редактирования;
1 – прошивка микроконтроллера;
2 – печать текста программы;
3 – печать листинга.
При наличии ошибок необходимо нажать клавишу ESC. Восстанавливается связь с рабочими местами. Студент идет на рабочее место для анализа и исправления ошибок. В его распоряжении «горячая» клавиша F6. При нажатии этой клавиши на экране ЖКИ появляется сообщение о первой ошибке, например, такого вида, если вместо .org $000 напечатано в программе .rg $000.


Студент оценивает, как нужно исправить ошибку, нажимает вновь на клавишу F6 и возвращается в режим редактирования. Курсор стоит на строке с ошибкой. Студент исправляет ошибку и вновь нажимает клавишу F6. Опять высвечивается та же строка, но уже с исправлениями, однако сообщение об ошибке сохраняется. Это сообщение об ошибке будет устранено потом при компиляции исправленной программы, разумеется, если исправление сделано правильно. Для перехода к следующей ошибке нужно нажать клавишу курсора . Появляется очередная строка с ошибкой. Анализируется ошибка этой строки, принимается решение об её устранении, нажимается вновь клавиша F6. Курсор указывает строку с ошибкой. После устранения ошибки вновь нажимается клавиша F6 и клавиша курсора для выявления очередной ошибки и т.д. После устранения последней ошибки нажатие клавиши курсора не приводит к очередному переводу.

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

 









Читайте также:

  1. Безусловно, этот метод применим и к текстовым файлам.
  2. Вертикальные коммуникации – это перемещение информации внутри организации с одного уровня на другой.
  3. Дифференциальные – признаки, позволяющие отличить одну фонему от другой. Дифференциальные признаки фонем определяются с помощью противопоставлений.
  4. Добавление к проекту существующего файла
  5. Дон Файла. 10 уроков на салфетках
  6. Дополнительные файловые функции
  7. Другой мальчик стал возбуждаться и сказал: «Расскажи еще что-нибудь о них — это мужчины или женщины?» Мальчик, стоявший на плечах, сказал: «Как я могу это знать, если они все голые?»
  8. Другой путь приносит результаты
  9. Если имя файла заключено в угловые скобки, то поиск файла будет осуществляться в одном или нескольких специальных каталогах, определенных конкретной реализацией.
  10. Загрузка style-файлов с карты.
  11. Занятие 4.1. Файловая структура диска


Последнее изменение этой страницы: 2016-03-22; Просмотров: 103;


lektsia.info 2017 год. Все права принадлежат их авторам! Главная