Главная  Микроконтроллеры 

[0] [1] [2] [3] [4] [5] [6] [7] [ 8 ] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

При использовании специальных команд IN, OUT, SBIS и SBIC должны использоваться адреса $00...$3F. При доступе к регистру ввода/вывода как к ячейке ОЗУ к его адресу необходимо добавить $20. В приведенной выше таблице адреса регистров в памяти данных приведены в скобках.

Регистр состояния - SREG

Бит 7 6543210

$3F ($5F) THSVNZC SREG

ЧтУзап. RrtVRWRWRWRWRWRWRM Нач. анач. О О О О О О О О

Рис. 2.18. Регистр состояния

Регистр состояния расположен по адресу $ЗР ($5F) пространства ввода/вывода и определен следующим образом:

Бит 7 - I: общее разрешение прерываний. Для разрешения прерываний этот бит должен быть установлен в единицу. Управление отдельными прерываниями производится регистрами маски прерываний - GIMCK и TIMCK. Если бит 1 = 0, независимо от состояния GIMCK/TIMCK прерывания запрещены. Бит I обнуляется аппаратно после входа в прерывание и восстанавливается в состояние 1 командой возврата из подпрограммы обработки прерываний RETI, для разрешения обработки последующих прерываний.

Бит 6 - Т: хранение копируемого бита. Бит из регистра регистрового файла может быть скопирован в Т командой BST, бит Т может быть скопирован в бит регистрового файла командой BLD.

Бит 5 - Н: флаг половинного переноса. Этот флаг индицирует перенос из младшей половины байта при некоторых арифметических операциях. Подробнее об этом можно прочитать в описании системы команд.

Бит 4 - S: бит знака, S = N XOR V. Бит S равен исключающему ИЛИ между флагами N (отрицательный результат) и V (переполнение дополнения до двух). Если после операций сложения или вычитания чисел со знаком флаг переполнения V будет установлен в 1, то результатом будет 9-разрядное число, причем старшим (т. е. знаковым) разрядом числа будет флаг S, а 8 остальных битов результата



Бит 7 6 543210

$30 ($50) I SP7 I SP6 I SP5 I SP4 SP3 SP2 SP1 SP0 SPL

Чт./эап. R/W R/W R/W R/W R/W R/W R/W R/W

Нач. знач. 00000000

Рис. 2.19. Указатель стека

Указатель стека указывает на область памяти, в которой сохраня- ется адрес возврата из подпрограмм и прерываний. Также с помои щью стека подпрограммы могут получать или передавать данные.

будут храниться в 8-разрядном регистре-приемнике выполнявшейся операции.

Бит 3 - V: флаг переполнения дополнения до двух. Этот флаг надо проверять после операций сложения или вычитания чисел в дополнительном коде. Он устанавливается в том случае, если результат операции выходит за пределы диапазона от -128 до +127. Это - допустимый диапазон чисел со знаком, которые можно сохранить в 8 разрядах. Соответственно, бит V установится в I, если при сложении двух положительных чисел получится число, большее 127, или при сложении двух отрицательных чисел - меньше -128.

Бит 2 - N: флаг отрицательного результата. Этот флаг устанавливается в 1, если старший (знаковый) разряд (бит 7) равен 1, что означает, что результат отрицателен. Следует, однако, отметить, что флаг может быть также установлен и в результате логических операций.

Бит 1 - Z: флаг нулевого результата. Этот флаг индицирует нулевой результат различных арифметических и логических операций. Подробнее об этом можно прочитать в описании системы команд.

Бит О - С: флаг переноса. Этот флаг индицирует перенос в арифметических и логических операциях. Подробнее об этом можно прочитать в описании системы команд.

Указатель стека SP <

Этот 8-разрядный регистр с адресом $3D ($5D) хранит указатель стека процессора AT90S2313. Восьми разрядов достаточно для адресации ОЗУ в пределах $60 - $DF.



Область стека в ОЗУ должна быть задана до того, как произойдет любой вызов подпрограммы или будут разрешены прерывания. Указатель стека уменьшается на 1 при записи данных в стек командой PUSH, и уменьшается на 2 при вызове подпрограммы командой CALL или обработке прерывания. Указатель стека увеличивается на 1 при выборе данных из стека командой POP и увеличивается на 2 при выполнении команд возврата из подпрограммы или обработчика прерывания (RET или RETI).

2.3. Перезапуск микроконтроллера (сброс) и обработка прерываний

В AT90S2313 предусмотрены 10 источников прерываний. Эти прерывания и сброс имеют различные векторы в области памяти программ. Каждому из прерываний присвоен отдельный бит, разрешающий данное прерывание при установке бита в 1 (если, конечно, прерывания вообще разрешены, т. е. бит 1=1).

Самые младшие адреса памяти программ определены как векторы прерываний. Полный список векторов прерываний приведен в табл. 2.2. Этот список определяет и приоритет различных прерываний. Меньшие адреса соответствуют более высокому уровню приоритета. Самый высокий уровень у сброса, следующий приоритет у INTO - внешнего запроса прерывания О и т. д.

Ниже приведен типичный фрагмент программы обработки сброса и векторов прерываний:

Адрес

Команда

; Комментарий

$000

rjmp RESET

; Обработка сброса

$001

rjmp EXT INTO

; Обработка IROO

$002

rjmp EXT INT1

; Обработка IR01

$003

rjmp TIM CAPT1

; Обработка захвата таймера 1

$004

rjmp TIM C0MP1

; Обработка совпадения таймера 1

$005

rjmp TIM 0VF1

; Обработка переполнения таймера 1

$006

rjmp TIM OVFO

; Обработка переполнения таймера 0

$007

rjmp UART RXC

: Обработка приема байта

$008

rjmp UART DRE

; Обработка освобождения UDR

$009

rjmp UART TXC

; Обработка передачи байга

$00а

rjmp ANA COMP

; Обработка аналогового компаратора

$00Ь M.AIN;

; Начало основной программы



[0] [1] [2] [3] [4] [5] [6] [7] [ 8 ] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93]

0.0009