Этот регистр содержит служебные биты для общих функций MCU.
Бит | |||||||||
$35 ($55) | ― | SE | SM1 | SM0 | ISC11 | ISC10 | ISC01 | ISC00 | MCUCR |
Чтение/Запись | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W | |
Исходное значение |
· Бит 7 - Res: Reserved Bit – Зарезервированный бит
Этот бит зарезервирован в AT90S8535 и при считывании всегда показывает состояние ноль.
· Биты 6 …4 управляют режимами энергосбережения
· Биты 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 bit 1 and bit 0 – Биты управления идентификацией внешнего прерывания 1
Внешнее прерывание 1 активизируется внешним выводом INT1, если установлен флаг I в регистре статуса SREG и установлена соответствующая маска прерывания в регистре масок внешнего прерывания GIMSK.
Запрос прерывания по логическому уровню или фронтам определяется в табл. 2.4.
Таблица 2.4.Задание характера сигнала прерывания 1
ISC11 | ISC10 | Описание |
Запрос прерывания идентифицируется по низкому уровню на INT1 | ||
Зарезервирован | ||
Запрос прерывания идентифицируется по спадающему фронту на INT1 | ||
Запрос прерывания идентифицируется по нарастающему фронту на INT1 |
Примечание: При изменении битов ISC11/ISC10 прерывание INT1 должно быть запрещено путем очистки бита разрешения прерывания в регистре GIMSK. В ином случае может произойти прерывание.
|
|
Значение (величина) на выводе INT базовое (типовое) до обнаружения фронтов сигнала. Если фронт прерывания выбран, импульсы, которые длятся дольше, чем один период CPU clock, сгенерируют прерывание. Более короткие импульсы не обеспечат генерацию прерывания. Если выбрано низкоуровневое прерывание (низкий уровень прерывания), то низкий уровень должен быть удержан до завершения выполняющейся в настоящее время команды, чтобы генерировать прерывание. Если это так, то уровень, вызвавший прерывание, генерирует запрос на прерывание пока вывод остается (удерживается) низким.
· Биты 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 bit 1 and bit 0 – Биты управления идентификацией внешнего прерывания 0
Внешнее прерывание 0 активизируется внешним выводом INT0, если установлен флаг I в регистре статуса SREG и установлена соответствующая маска прерывания. Запрос прерывания по логическому уровню или фронтам определяется в табл. 2.5.
Таблица 2.5.Задание характера сигнала прерывания 0
ISC01 | ISC00 | Описание |
Запрос прерывания идентифицируется по низкому уровню на INT0 | ||
Зарезервирован | ||
Запрос прерывания идентифицируется по спадающему фронту на INT0 | ||
Запрос прерывания идентифицируется по нарастающему фронту на INT0 |
Примечание: При изменении битов ISC01/ISC00 прерывание INT0 должно быть запрещено путем очистки бита разрешения прерывания в регистре GIMSK. В ином случае может произойти прерывание.
|
|
Значение (величина) на выводе INT базовое (типовое) до обнаружения фронтов сигнала. Если фронт прерывания выбран, импульсы, которые длятся дольше, чем один период CPU clock, сгенерируют прерывание. Более короткие импульсы не обеспечат генерацию прерывания. Если выбрано низкоуровневое прерывание (низкий уровень прерывания), то низкий уровень должен быть удержан до завершения выполняющейся в настоящее время команды, чтобы генерировать прерывание. Если это так, то уровень, вызвавший прерывание, генерирует запрос на прерывание пока вывод остается (удерживается) низким.
; Пример программы процедуры обслуживания прерываний | |||||
.include "8535def.inc" | |||||
; ***Формирование таблицы переходов*** | |||||
.org $000 | |||||
rjmp start | |||||
.org $001 | ; вектор int0 | ||||
rjmp pr0 | |||||
.org $002 | ; вектор int1 | ||||
rjmp pr1 | |||||
.org $003 | ; вектор Timer2 Compare | ||||
reti | |||||
.org $004 | ; вектор Timer2 Overflow | ||||
reti | |||||
.org $005 | ; вектор Timer1 Capture | ||||
reti | |||||
.org $006 | ; вектор Timer1 CompareA | ||||
reti | |||||
.org $007 | ; вектор Timer1 CompareB | ||||
reti | |||||
.org $008 | ; вектор Timer1 Overflow | ||||
reti | |||||
.org $009 | ; вектор Timer0 Overflow | ||||
reti | |||||
.org $00A | ; вектор SPI | ||||
reti | |||||
.org $00B | ; вектор приемника UART | ||||
reti | |||||
.org $00C | ; вектор "буфер передатчика пуст" UART | ||||
reti | |||||
.org $00D | ; вектор передатчика UART | ||||
reti | |||||
.org $00E | ; вектор ADC преобразователя | ||||
reti | |||||
.org $00F | ; вектор EEPROM | ||||
reti | |||||
.org $010 | ; вектор аналогового компаратора | ||||
reti | |||||
; ***Фоновая программа*** | |||||
.cseg | |||||
.org $030 | |||||
start: | ldi | r16,$00 | ; загрузка указателя стека через регистр r16 | ||
out | sph,r16 | ||||
ldi | r16,$0ff | ||||
out | spl,r16 | ||||
m1: | sbis | PINA,1 | ; опросить кнопку SB1. От её состояния зависит | ||
rjmp | m1 | ||||
sei | ; разрешение глобального прерывания | ||||
ldi | r16,$c0 | ||||
out | GIMSK,r16 | ; разрешение прерываний INT0 и INT1 | |||
ldi | r16,$f0 | ; выводы PD0, PD1,PD2 и PD3 конфигурировать как | |||
out | DDRD,r16 | ; входы, а остальные выводы порта D как выходы | |||
ldi | r16,$0ff | ; выводы порта С конфигурировать как выходы | |||
out | DDRC,r16 | ||||
sbi | PORTB,3 | ; загрузить 1 в бит portB,3 для включения | |||
; транзистора VT2 | |||||
*** | ;команды фоновой программы по индивидуальному | ||||
; заданию | |||||
rcall | wait | ||||
in | r16,PINA | ; опросить кнопки и тумблеры порта А | |||
lsr | r16 | ; сдвинуть разряды регистра r16 три раза вправо | |||
lsr | r16 | ||||
lsr | r16 | ||||
ldi | r17,$0f | ||||
and | r16,r17 | ; биты ISC01, ISC00, ISC11, ISC10 принимают | |||
out | MCUCR,r16 | ; соответственно состояние SB1, SA1, SA2, SA3 | |||
pr0: | ; Подпрограмма отработки прерывания INT0 | ||||
in | r16,SREG | ||||
push | r16 | ; сохранение SREG | |||
*** | ; команды, реализующие индивидуальное задание | ||||
cbi | GIFR,6 | ; сброс флага прерывания по INT0 | |||
pop | r16 | ||||
out | SREG,r16 | ||||
reti | |||||
pr1: | ; Подпрограмма отработки прерывания INT1 | ||||
in | r16,SREG | ||||
push | r16 | ; сохранение SREG | |||
*** | ; команды, реализующие индивидуальное задание | ||||
cbi | GIFR,7 | ; сброс флага прерывания по INT1 | |||
pop | r16 | ||||
out | SREG,r16 | ||||
reti | |||||
wait: | ; подпрограмма задержки | ||||
ldi | r20,$0ff | ||||
loop1: | |||||
ldi | r21,$0ff | ||||
loop: | |||||
dec | r21 | ||||
brne | loop | ||||
dec | r20 | ||||
brne | loop1 | ||||
ret | |||||
Представленная программа дает пример формирования таблицы переходов и определения начального адреса стека.
|
|
ТАЙМЕРЫ
Микроконтроллеры АТ90S8535 семейства AVR имеют три таймера/счетчика. Два из них таймер/счетчик0 и таймер/счетчик2 8-разрядные, а таймер/счетчик1 16-разрядный.
Таймеры/счетчики 0 и 1 используют выходы ступени деления общего 10-разрядного предварительного делителя. Они могут использоваться как таймеры с встроенной временной базой или как счетчики, переключаемые по состоянию на внешнем выводе соответственно РВ0 (Т0) и РВ1(Т1).
Таймер/счетчик2 имеет свой предварительный 10-разрядный делитель или может асинхронно тактироваться сигналом с вывода РС6 (T0SC1), что позволяет использовать таймер/счетчик2 в качестве часов реального времени. Тогда генератор с частотой 32768 кГц подсоединяется между выводами РС6 (T0SC1) и РС7 (T0SC2).
Таймеры/счетчики 1 и 2 позволяют реализовать режимы широтно-импульсных модуляторов (ШИМ).
Микроконтроллер AT90S8535 имеет регистр масок прерываний по таймеру/счетчику TIMSK – Timer/Counter.