Запись числа в один из регистров ввода/вывода
.include "m8def.inc"
.macro OUTI // Начало макроса "Запись числа в регистр ввода-вывода"
PUSH R16 // Записываем исходное значение временного регистра R16 в стек
ldi R16, @1 // Записываем во временный регистр R16 число
.if @0 < 0x40 // Not memory mapped
OUT @0, R16 // Записываем значение временного регистра R16 в РВВ
.else // Memory mapped
STS @0,R16 // Записываем значение временного регистра R16 в РВВ
.endif
POP R16 // Записываем во временный регистр R16 исходное значение из стека
.endm // Конец макроса
Обмен значений двух регистров местами без использования третьего.
.macro CHANGE ;начало макроса "Обмен содержимого 2-ух регистров"
PUSH @0 ;сохраняем исходное значение 1-ого регистра в стек
PUSH @1 ;сохраняем исходное значение 2-ого регистра в стек
POP @0 ;записываем в 1-ый регистр исходное значение 2-ого регистра из стека
POP @1 ;записываем во 2-ой регистр исходное значение 1-ого регистра из стека
.endm ;конец макроса
ИЛИ
.macro CHANGE // Начало макроса "Обмен содержимого 2-ух регистров"
PUSH @0 // Сохраняем исходное значение 1-ого регистра в стек
MOV @0, @1 // Записываем значение 2-ого регистра в 1-ый регистр
|
|
POP @1 // Записываем во 2-ой регистр исходное значение 1-ого регистра из стека
.endm // Конец макроса
Установка определённого бита в регистре ввода/вывода
.macro OUTB // Начало макроса "Запись определенного бита в регистр ввода-вывода"
.if @2>0 // Устанавливаем бит
.if @0 < 0x20 // Low I/O
SBI @0,@1 // Устанавливаем бит на нужную позицию
.else // High I/O
.if @0<0x40 // Not memory mapped
PUSH R17 // Записываем исходное значение временного регистра R17 в стек
IN R17,@0 // Записываем во временный регистр R17 значение РВВ
ORI R17,1<<@1 // Устанавливаем бит на нужную позицию во временном регистре R17
OUT @0,R17 // Записываем измененное значение временного регистра R17 в РВВ
POP R17 // Записываем во временный регистр R17 его исходное значение из стека
.else // Memory mapped
PUSH R17 // Записываем исходное значение временного регистра R17 в стек
LDS R17,@0 // Записываем во временный регистр R17 значение РВВ
ORI R17,1<<@1 // Устанавливаем бит на нужную позицию во временном регистре R17
|
|
STS @0,R17 // Записываем измененное значение временного регистра R17 в РВВ
POP R17 // Записываем во временный регистр R17 его исходное значение из стека
.endif
.endif
.else // Сбрасываем бит
.if @0 < 0x20 // Low I/O
CBI @0,@1 // Сбрасываем бит на нужной позиции
.else // High I/O
.if @0<0x40 // Not memory mapped
PUSH R17 // Записываем исходное значение временного регистра R17 в стек
IN R17,@0 // Записываем во временный регистр R17 значение РВВ
ANDI R17,~(1<<@1)// Сбрасываем бит на нужной позиции во временном регистре R17
OUT @0,R17 // Записываем измененное значение временного регистра R17 в РВВ
POP R17 // Записываем во временный регистр R17 его исходное значение из стека
.else // Memory mapped
PUSH R17 // Записываем исходное значение временного регистра R17 в стек
LDS R17,@0 // Записываем во временный регистр R17 значение РВВ
ANDI R17,~(1<<@1)// Сбрасываем бит на нужной позиции во временном регистре R17
STS @0,R17 // Записываем измененное значение временного регистра R17 в РВВ
|
|
POP R17 // Записываем во временный регистр R17 его исходное значение из стека
.endif
.endif
.endif
.endm // Конец макроса
Написать одну из следующих программ
Затухание светодиода
.include "m8def.inc"
.macro OUTI // Начало макроса "Запись числа в регистр ввода-вывода"
PUSH R16
ldi R16,@1
OUT @0,R16
POP R16
.endm // Конец макроса
.CSEG
JMP INT_VECTORS_SIZE // Переход к концу таблицы прерываний, чтоб не выполнить прерывание в начале программы
.ORG OVF2addr // Прерывание Timer/Counter2 Overflow
RJMP Overflow // Переход на метку Overflow, если случилось прерывание по переполнению
.ORG OC2addr // Прерывание Timer/Counter2 Compare Match
RJMP Compare // Переход на метку Compare, если случилось прерывание по совпадению
.ORG INT_VECTORS_SIZE // Конец таблицы прерываний
ldi R16,low(RAMEND) // Инициализация стека
OUT SPL,R16
ldi R16,high(RAMEND)
OUT SPH,R16
OUTI DDRC, (1 << PC0) // Конфигурирование ножки PC0 на выход
OUTI PORTC, (1 << PC0) // Подать на ножку лог.единицу
OUTI TIMSK,(1<<TOIE2),(1 << OCIE2)// Разрешение прерывания по переполнению и совпадению
|
|
OUTI TCCR2, (1<<CS21) // Предделитель на 8
OUTI OCR2, 255 // Устанавливаем значение 255 в регистр сравнения
sei
M1: NOP
RJMP M1 // Бесконечный цикл
Compare:
cli
PUSH R17 // Записываем в стек значение временного регистра R17
PUSH R18 // Записываем в стек значение временного регистра R18
IN R17,PINC // Считываем состояние ножки PC0
// Меняем состояние ножки PC0 на противоположное
ldi R18,(1 << PC0)
EOR R17,R18
OUT PORTC,R17
sei
POP R18 // Записываем во временный регистр R18 исходное значение из стека
POP R17 // Записываем во временный регистр R17 исходное значение из стека
RETI
Overflow:
cli
PUSH R17 // Записываем в стек значение временного регистра R17
PUSH R18 // Записываем в стек значение временного регистра R18
IN R17,PINC // Считываем состояние ножки PC0
// Меняем состояние ножки PC0 на противоположное
ldi R18,(1 << PC0)
EOR R17,R18
OUT PORTC,R17
IN R18, OCR2 // Считываем значение регистра сравнения
subi R18, 1 // R18 --
OUT OCR2, R18 // Заносим измененное значение в регистр сравнения
POP R18 // Записываем во временный регистр R18 исходное значение из стека
POP R17 // Записываем во временный регистр R17 исходное значение из стека
sei
RETI
Дата добавления: 2018-04-05; просмотров: 350; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!