Плавное повышение яркости светодиода



 

.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, 0               // Устанавливаем значение 0 в регистр сравнения

 

   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

       

    POP R18                       // Записываем во временный регистр R18 исходное значение из стека

   POP R17                       // Записываем во временный регистр R17 исходное значение из стека

       

   sei

       

   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

 

Затухание светодиода, при достижении состояния, когда светодиод перестал гореть, плавно повышать его яркость до максимума.

 

.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 в регистр сравнения

 

   ldi R19, 0                   // Используем как флаг

   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

       

    POP R18                       // Записываем во временный регистр R18 исходное значение из стека

   POP R17                       // Записываем во временный регистр R17 исходное значение из стека

       

   sei

       

   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               // Считываем значение регистра сравнения

 

   ldi R21 , 0   

   CP R18, R21                   // Сравниваем два регистра

   brne n                       // Если регистры не равны, то переходим на n

   ldi R19, 0

 

n: ldi R21,255

   CP R18, R21                   // Сравниваем два регистра

   brne n1                   // Если регистры не равны, то переходим на n1

   ldi R19, 1

 

       

n1: ldi R21,0

   CP R19, R21                   // Сравниваем два регистра

   brne n2                   // Если регистры не равны, то переходим на n2

   subi R18, -1               // R18 ++

   

n2: ldi R21, 1

   CP R19, R21                   // Сравниваем два регистра

    brne n3                   // Если регистры не равны, то переходим на n3

   subi R18, 1                   // R18 --

 

n3: OUT OCR2, R18               // Заносим измененное значение в регистр сравнения

       

   POP R18                       // Записываем во временный регистр R18 исходное значение из стека

   POP R17                       // Записываем во временный регистр R17 исходное значение из стека

       

   sei

       

   RETI

 

Сгенирировать ШИМ сигнал со скважностью 10%, 20%, ..., 90%

 

.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, 26               // Устанавливаем значение 26 в регистр сравнения (=10%)

 

   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

       

    POP R18                       // Записываем во временный регистр R18 исходное значение из стека

   POP R17                       // Записываем во временный регистр R17 исходное значение из стека

 

   sei

       

   RETI

   

Overflow:      

   cli

       

   PUSH R17                   // Записываем в стек значение временного регистра R17   

   PUSH R18                   // Записываем в стек значение временного регистра R18

       

   IN R17,PINC                   // Считываем состояние ножки PC0

                                   // Меняем состояние ножки PC0 на противоположное

   ldi R18,(1 << PC0)

   EOR R17,R18  

   OUT PORTC,R17

 

    POP R18                       // Записываем во временный регистр R18 исходное значение из стека

   POP R17                       // Записываем во временный регистр R17 исходное значение из стека

       

   sei

       

   RETI

 

Мигание светодиодом

 

.include "m8def.inc"

   

.macro OUTI           // Начало макроса "Запись числа в регистр ввода-вывода"

       

   PUSH R16

   ldi R16, @1

   OUT @0, R16

   POP R16

   

.endm               // Конец макроса

 

 .CSEG

   

JMP INT_VECTORS_SIZE       // Переход к концу таблицы прерываний, чтоб не выполнить прерывание в начале программы

   

.ORG OVF0addr               // Прерывание Timer/Counter0 Overflow

   RJMP Overflow               // Переход на метку Overflow, если случилось прерывание

   

.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<<TOIE0)       // Разрешить прерывание по переполнению таймера 0

OUTI TCCR0, (1<<CS02) | (1<<CS00)// Установка предделителя на 1024

 

sei                               

 

M1: NOP                               

RJMP M1                       // Бесконечный цикл

 

Overflow:                           

PUSH R17                   // Записываем в стек значение временного регистра R17   

PUSH R18                   // Записываем в стек значение временного регистра R18

   

IN R17, PINC               // Считываем состояние ножки PC0

                               // Меняем состояние ножки PC0 на противоположное

ldi R18, (1 << PC0)               

EOR R17, R18                   

OUT PORTC, R17                   

   

POP R18                       // Записываем во временный регистр R18 исходное значение из стека

POP R17                       // Записываем во временный регистр R17 исходное значение из стека

 

RETI   


Дата добавления: 2018-04-05; просмотров: 342; Мы поможем в написании вашей работы!

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






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