Запись числа в один из регистров ввода/вывода



.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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!