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