Разработка программной и аппаратной поддержки к методическим указаниям "Программирование микроконтроллеров"

Загрузить архив:
Файл: ref-12714.zip (443kb [zip], Скачиваний: 361) скачать

Rd,Rr

Суммирование без переноса

Rd = Rd + Rr

Z,C,N,V,H,S

1

ADC

Rd,Rr

Суммирование с переносом

Rd = Rd + Rr + C

Z,C,N,V,H,S

1

SUB

Rd,Rr

Вычитание без переноса

Rd = Rd - Rr

Z,C,N,V,H,S

1

SUBI

Rd,K8

Вычитание константы

Rd = Rd - K8

Z,C,N,V,H,S

1

SBC

Rd,Rr

Вычитание с переносом

Rd = Rd - Rr - C

Z,C,N,V,H,S

1

SBCI

Rd,K8

Вычитание константы с переносом

Rd = Rd - K8 - C

Z,C,N,V,H,S

1

AND

Rd,Rr

Логическое И

Rd = Rd · Rr

Z,N,V,S

1

ANDI

Rd,K8

Логическое И с константой

Rd = Rd · K8

Z,N,V,S

1

OR

Rd,Rr

Логическое ИЛИ

Rd = Rd V Rr

Z,N,V,S

1

ORI

Rd,K8

Логическое ИЛИ с константой

Rd = Rd V K8

Z,N,V,S

1

EOR

Rd,Rr

Логическое исключающее ИЛИ

Rd = Rd EOR Rr

Z,N,V,S

1

COM

Rd

Побитная Инверсия

Rd = $FF - Rd

Z,C,N,V,S

1

NEG

Rd

Изменение знака (Доп. код)

Rd = $00 - Rd

Z,C,N,V,H,S

1

SBR

Rd,K8

Установить бит (биты) в регистре

Rd = Rd V K8

Z,C,N,V,S

1

CBR

Rd,K8

Сбросить бит (биты) в регистре

Rd = Rd · ($FF - K8)

Z,C,N,V,S

1

INC

Rd

Инкрементировать значение регистра

Rd = Rd + 1

Z,N,V,S

1

DEC

Rd

Декрементировать значение регистра

Rd = Rd -1

Z,N,V,S

1

TST

Rd

Проверка на ноль либо отрицательность

Rd = Rd · Rd

Z,C,N,V,S

1

CLR

Rd

Очистить регистр

Rd = 0

Z,C,N,V,S

1

SER

Rd

Установить регистр

Rd = $FF

None

1

ADIW

Rdl,K6

Сложить константу и слово

Rdh:Rdl = Rdh:Rdl + K6

Z,C,N,V,S

2

SBIW

Rdl,K6

Вычесть константу из слова

Rdh:Rdl = Rdh:Rdl - K6

Z,C,N,V,S

2

MUL

Rd,Rr

Умножение чисел без знака

R1:R0 = Rd * Rr

Z,C

2

MULS

Rd,Rr

Умножение чисел со знаком

R1:R0 = Rd * Rr

Z,C

2

MULSU

Rd,Rr

Умножение числа со знаком с числом без знака

R1:R0 = Rd * Rr

Z,C

2

FMUL

Rd,Rr

Умножение дробных чисел без знака

R1:R0 = (Rd * Rr) << 1

Z,C

2

FMULS

Rd,Rr

Умножение дробных чисел со знаком

R1:R0 = (Rd *Rr) << 1

Z,C

2

FMULSU

Rd,Rr

Умножение дробного числа со знаком с числом без знака

R1:R0 = (Rd * Rr) << 1

Z,C

2

k

Относительный переход

PC = PC + k +1

None

2

IJMP

Нет

Косвенный переход на (Z)

PC = Z

None

2

EIJMP

Нет

Расширенный косвенный пере­ход на (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND

None

2

JMP

k

Переход

PC = k

None

3

RCALL

k

Относительный вызов подпро­граммы

STACK = PC+1, PC = PC+k+1

None

3/4*

ICALL

Нет

Косвенный вызов (Z)

STACK = PC+1, PC = Z

None

3/4*

EICALL

Нет

Расширенный косвенный вы­зов (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND

None

4*

CALL

k

Вызов подпрограммы

STACK = PC+2, PC = k

None

4/5*

RET

Нет

Возврат из подпрограммы

PC = STACK

None

4/5*

RETI

Нет

Возврат из прерывания

PC = STACK

I

4/5*

CPSE

Rd,Rr

Сравнить, пропустить если равны

if (Rd ==Rr) PC = PC 2 or 3

None

1/2/3

CP

Rd,Rr

Сравнить

Rd -Rr

Z,C,N,V,H,S

1

CPC

Rd,Rr

Сравнить с переносом

Rd - Rr - C

Z,C,N,V,H,S

1

CPI

Rd,K8

Сравнить с константой

Rd - K

Z,C,N,V,H,S

1

SBRC

Rr,b

Пропустить если бит в реги­стре очищен

if(Rr(b)==0) PC = PC+2 or 3

None

1/2/3

SBRS

Rr,b

Пропустить если бит в регистре установлен

if(Rr(b)==1) PC = PC+2 or 3

None

1/2/3

SBIC

P,b

Пропустить если бит в порту очищен

if(I/O(P,b)==0) PC = PC+ or 3

None

1/2/3

SBIS

P,b

Пропустить если бит в порту установлен

if(I/O(P,b)==1) PC = PC+2 or 3

None

1/2/3

BRBC

s,k

Перейти если флаг в SREG очищен

if(SREG(s)==0) PC = PC+k+1

None

1/2

BRBS

s,k

Перейти если флаг в SREG установлен

if(SREG(s)==1) PC = PC+k+1

None

1/2

BREQ

k

Перейти если равно

if(Z==1) PC = PC + k + 1

None

1/2

BRNE

k

Перейти если не равно

if(Z==0) PC = PC + k + 1

None

1/2

BRCS

k

Перейти если перенос установлен

if(C==1) PC = PC + k + 1

None

1/2

BRCC

k

Перейти если перенос очищен

if(C==0) PC = PC + k + 1

None

1/2

BRSH

k

Перейти если равно или больше

if(C==0) PC = PC + k + 1

None

1/2

BRLO

k

Перейти если меньше

if(C==1) PC = PC + k + 1

None

1/2

BRMI

k

Перейти если минус

if(N==1) PC = PC + k + 1

None

1/2

BRPL

k

Перейти если плюс

if(N==0) PC = PC + k + 1

None

1/2

BRGE

k

Перейти если больше или равно (со знаком)

if(S==0) PC = PC + k + 1

None

1/2

BRLT

k

Перейти если меньше (со знаком)

if(S==1) PC = PC + k + 1

None

1/2

BRHS

k

Перейти если флаг внутреннего переноса установлен

if(H==1) PC = PC + k + 1

None

1/2

BRHC

k

Перейти если флаг внутреннего переноса очищен

if(H==0) PC = PC + k + 1

None

1/2

BRTS

k

Перейти если флаг T установлен

if(T==1) PC = PC + k + 1

None

1/2

BRTC

k

Перейти если флаг T очищен

if(T==0) PC = PC + k + 1

None

1/2

BRVS

k

Перейти если флаг переполнения установлен

if(V==1) PC = PC + k + 1

None

1/2

BRVC

k

Перейти если флаг переполнения очищен

if(V==0) PC = PC + k + 1

None

1/2

BRIE

k

Перейти если прерывания разрешены

if(I==1) PC = PC + k + 1

None

1/2

BRID

k

Перейти если прерывания запрещены

if(I==0) PC = PC + k + 1

None

1/2

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.

Rd,Rr

Скопировать регистр

Rd = Rr

None

1

MOVW

Rd,Rr

Скопировать пару регистров

Rd+1:Rd = Rr+1:Rr, r,d even

None

1

LDI

Rd,K8

Загрузить константу

Rd = K

None

1

LDS

Rd,k

Прямая загрузка

Rd = (k)

None

2*

LD

Rd,X

Косвенная загрузка

Rd = (X)

None

2*

LD

Rd,X+

Косвенная загрузка с пост-инкрементом

Rd = (X), X=X+1

None

2*

LD

Rd,-X

Косвенная загрузка с пре-декрементом

X=X-1, Rd = (X)

None

2*

LD

Rd,Y

Косвенная загрузка

Rd = (Y)

None

2*

LD

Rd,Y+

Косвенная загрузка с пост-инкрементом

Rd = (Y), Y=Y+1

None

2*

LD

Rd,-Y

Косвенная загрузка с пре-декрементом

Y=Y-1, Rd = (Y)

None

2*

LDD

Rd,Y+q

Косвенная загрузка с замещением

Rd = (Y+q)

None

2*

LD

Rd,Z

Косвенная загрузка

Rd = (Z)

None

2*

LD

Rd,Z+

Косвенная загрузка с пост-инкрементом

Rd = (Z), Z=Z+1

None

2*

LD

Rd,-Z

Косвенная загрузка с пре-декрементом

Z=Z-1, Rd = (Z)

None

2*

LDD

Rd,Z+q

Косвенная загрузка с замещением

Rd = (Z+q)

None

2*

STS

k,Rr

Прямое сохранение

(k) = Rr

None

2*

ST

X,Rr

Косвенное сохранение

(X) = Rr

None

2*

ST

X+,Rr

Косвенное сохранение с пост-инкрементом

(X) = Rr, X=X+1

None

2*

ST

-X,Rr

Косвенное сохранение с пре-декрементом

X=X-1, (X)=Rr

None

2*

ST

Y,Rr

Косвенное сохранение

(Y) = Rr

None

2*

ST

Y+,Rr

Косвенное сохранение с пост-инкрементом

(Y) = Rr, Y=Y+1

None

2

ST

-Y,Rr

Косвенное сохранение с пре-декрементом

Y=Y-1, (Y) = Rr

None

2

ST

Y+q,Rr

Косвенное сохранение с замещением

(Y+q) = Rr

None

2

ST

Z,Rr

Косвенное сохранение

(Z) = Rr

None

2

ST

Z+,Rr

Косвенное сохранение с пост-инкрементом

(Z) = Rr, Z=Z+1

None

2

ST

-Z,Rr

Косвенное сохранение с пре-декрементом

Z=Z-1, (Z) = Rr

None

2

ST

Z+q,Rr

Косвенное сохранение с замещением

(Z+q) = Rr

None

2

LPM

Нет

Загрузка из программной памяти

R0 = (Z)

None

3

LPM

Rd,Z

Загрузка из программной памяти

Rd = (Z)

None

3

LPM

Rd,Z+

Загрузка из программной памяти с пост-инкрементом

Rd = (Z), Z=Z+1

None

3

ELPM

Нет

Расширенная загрузка из программной памяти

R0 = (RAMPZ:Z)

None

3

ELPM

Rd,Z

Расширенная загрузка из программной памяти

Rd = (RAMPZ:Z)

None

3

ELPM

Rd,Z+

Расширенная загрузка из программной памяти с пост-инкрементом

Rd = (RAMPZ:Z), Z = Z+1

None

3

SPM

Нет

Сохранение в программной памяти

(Z) = R1:R0

None

-

ESPM

Нет

Расширенное сохранение в программной памяти

(RAMPZ:Z) = R1:R0

None

-

IN

Rd,P

Чтение порта

Rd = P

None

1

OUT

P,Rr

Запись в порт

P = Rr

None

1

PUSH

Rr

Занесение регистра в стек

STACK = Rr

None

2

POP

Rd

Извлечение регистра из стека

Rd = STACK

None

2

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.

Rd

Логический сдвиг влево

Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)

Z,C,N,V,H,S

1

LSR

Rd

Логический сдвиг вправо

Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)

Z,C,N,V,S

1

ROL

Rd

Циклический сдвиг влево через C

Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)

Z,C,N,V,H,S

1

ROR

Rd

Циклический сдвиг вправо через C

Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)

Z,C,N,V,S

1

ASR

Rd

Арифметический сдвиг вправо

Rd(n)=Rd(n+1), n=0,...,6

Z,C,N,V,S

1

SWAP

Rd

Перестановка тетрад

Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)

None

1

BSET

s

Установка флага

SREG(s) = 1

SREG(s)

1

BCLR

s

Очистка флага

SREG(s) = 0

SREG(s)

1

SBI

P,b

Установить бит в порту

I/O(P,b) = 1

None

2

CBI

P,b

Очистить бит в порту

I/O(P,b) = 0

None

2

BST

Rr,b

Сохранить бит из регистра в T

T = Rr(b)

T

1

BLD

Rd,b

Загрузить бит из T в регистр

Rd(b) = T

None

1

SEC

Нет

Установить флаг переноса

C =1

C

1

CLC

Нет

Очистить флаг переноса

C = 0

C

1

SEN

Нет

Установить флаг отрицательного числа

N = 1

N

1

CLN

Нет

Очистить флаг отрицательного числа

N = 0

N

1

SEZ

Нет

Установить флаг нуля

Z = 1

Z

1

CLZ

Нет

Очистить флаг нуля

Z = 0

Z

1

SEI

Нет

Установить флаг прерываний

I = 1

I

1

CLI

Нет

Очистить флаг прерываний

I = 0

I

1

SES

Нет

Установить флаг числа со знаком

S = 1

S

1

CLN

Нет

Очистить флаг числа со знаком

S = 0

S

1

SEV

Нет

Установить флаг переполнения

V = 1

V

1

CLV

Нет

Очистить флаг переполнения

V = 0

V

1

SET

Нет

Установить флаг T

T = 1

T

1

CLT

Нет

Очистить флаг T

T = 0

T

1

SEH

Нет

Установить флаг внутреннего переноса

H = 1

H

1

CLH

Нет

Очистить флаг внутреннего переноса

H = 0

H

1

NOP

Нет

Нет операции

Нет

None

1

SLEEP

Нет

Спать (уменьшить энергопотребление)

Смотрите описание инструкции

None

1

WDR

Нет

Сброс сторожевого таймера

Смотрите описание инструкции

None

1


Ассемблер не различает регистр символов. Операнды могут быть таких видов:

§

§

§

§

§

§

§

§

§

§ Rdl: R24, R26, R28, R30. Для инструкций ADIW и SBIW

§


ПРИЛОЖЕНИЕ 2.
Таблица регистров микроконтроллера
AT90S1200

Адрес

Название

Bit 7

Bit 6

Bit 5

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

$3F

SREG

I

T

H

S

V

N

Z

C

$3E

з а р е з е р в и р о в а н

$3D

з а р е з е р в и р о в а н

$3C

з а р е з е р в и р о в а н

$3B

GIMSK

-

INT0

-

-

-

-

-

-

$3A

з а р е з е р в и р о в а н

$39

TIMSK

-

-

-

-

-

-

TOIE0

-

$38

TIFR

-

-

-

-

-

-

TOV0

-

$37

з а р е з е р в и р о в а н

$36

з а р е з е р в и р о в а н

$35

MCUCR

-

-

SE

SM

-

-

ISC01

ISC00

$34

з а р е з е р в и р о в а н

$33

TCCR0

-

-

-

-

-

CS02

CS01

CS00

$32

TCNT0

Таймер / счетчик 0 (8 бит)

з а р е з е р в и р о в а н

$21

WDTCR

-

-

-

-

WDE

WDP2

WDP1

WDP0

з а р е з е р в и р о в а н

$1E

EEAR

Регистр адреса энергонезависимой памяти

$1D

EEDR

Регистр данных энергонезависимой памяти

$1C

EECR

-

-

-

-

-

-

EEWE

EERE

з а р е з е р в и р о в а н

$18

PORTB

PORTB7

PORTB6

PORTB5

PORTB4

PORTB3

PORTB2

PORTB1

PORTB0

$17

DDRB

DDB7

DDB6

DDB5

DDB4

DDB3

DDB2

DDB1

DDB0

$16

PINB

PINB7

PINB6

PINB5

PINB4

PINB3

PINB2

PINB1

PINB0

з а р е з е р в и р о в а н

$12

PORTD

-

PORTD6

PORTD5

PORTD4

PORTD3

PORTD2

PORTD1

PORTD0

$11

DDRD

-

DDD6

DDD5

DDD4

DDD3

DDD2

DDD1

DDD0

$10

PIND

-

PIND6

PIND5

PIND4

PIND3

PIND2

PIND1

PIND0

з а р е з е р в и р о в а н

$08

ACSR

ACD

-

ACO

ACI

ACIE

-

ACIS1

ACIS0

з а р е з е р в и р о в а н

$00

з а р е з е р в и р о в а н


ПРИЛОЖЕНИЕ 3.
Программа для измерителя звуковой частоты


.include "8515def.inc"

.equ last_seg =4

.equ zero     =0

.equ     start_addr= 8

.def capture_l    =r2

.def capture_h    =r3

.def char      =r5

.def char_pointer =r6

.def  temp      =r16   

.def temp1     =r17

.def ZerRol          =r18

.def     char0        =r20

.def     char1        =r21

.def     char2        =r22

.def     char3        =r23

.def     char4        =r24

.def     out_char0    =r8

.def     out_char1    =r9

.def     out_char2    =r10

.def     out_char3    =r11

.def     out_char4    =r12

.def     out_counter  =r13

.eseg       ;EEPROM segment

.org 0

eetbl3:.db  0x3F,0x06

;           ;0    1

 .db  0x5B,0x4F

;           ;2    3

 .db  0x66,0x6D

;           ;4    5

 .db  0x7D,0x07

;           ;6    7

 .db  0x7F,0x6F

;           ;8    9

.cseg

.org 0

      rjmp   reset

      reti ;

      reti ;

      rjmp   TIM1_CAPT

.org $006

      rjmp   TIM1_OVF

      rjmp   TIM0_OVF

;***********************************

;* Main Code

reset: ; Make Stack: 

ldi    temp, high(RAMEND)

      out    SPH,  temp         

      ldi    temp, low(RAMEND)

      out    SPL,  temp

     

      ldi    temp, 0xC3 ;

      out    TCCR1B, temp     ;

      ldi    temp, 0x8A       ;

      out    TIMSK, temp

      ldi    temp, 0x3        ;

      out    TCCR0, temp

      sei

      ldi    temp, zero

      mov    char_pointer, temp

      ldi    temp, 0xFF

      out    DDRA, temp

      out    DDRC, temp

      ldi    char0, 8

      ldi    char1, 8

      ldi    char2, 8

      ldi    char3, 8

      ldi    char4, 8

      ldi    ZH, 0

      ldi    ZL, start_addr

      ldi    ZerRol,0xFE

      clt

      clr    out_counter

forever:

      brtc   forever

      clt

      mov   dv16uL, capture_l ;tmp16a

      mov   dv16uH, capture_h ;tmp16b

      ldi   dd16uL, low(62500)

      ldi   dd16uH, high(62500)

; пробразование в Гц:

rcall  div16u          

; преобразование в десятичные цифры

ldi    tmp16a, low(10000)    

      ldi    tmp16b, high(10000)

      rcall  bin2ASCII_digit

      mov    tASCII4, cnt16a

      ldi    tmp16a, low(1000)

      ldi    tmp16b, high(1000)

      rcall  bin2ASCII_digit

      mov    tASCII3, cnt16a

      ldi    tmp16a, low(100)

      ldi    tmp16b, high(100)

      rcall  bin2ASCII_digit

      mov    tASCII2, cnt16a

      ldi    tmp16a, low(10)

      ldi    tmp16b, high(10)

      rcall  bin2ASCII_digit

      rjmp   forever              

;* End Main Code

;************************************

;************************************

;* bin2ASCII_digit

.def     fASCIIL     =r24;r11

.def     fASCIIH      =r19;r12

.def     tASCII0      =r24;r11

.def     tASCII1      =r23;r16

.def     tASCII2      =r22;r13

.def     tASCII3      =r21;r14

.def     tASCII4      =r20;r15

.def     cnt16a       =r23;r16

.def     tmp16a       =r16;r17

.def     tmp16b       =r17;r18

bin2ASCII_digit:

      ldi     cnt16a, -1

bin2ASCII_digit_loop:

      inc     cnt16a

      sub     fASCIIL, tmp16a

      sbc     fASCIIH, tmp16b

      brsh    bin2ASCII_digit_loop

      add     fASCIIL, tmp16a

      adc     fASCIIH, tmp16b

      ret

;* End bin2ASCII_digit

;***********************************

;***********************************

;*div16u 16/16 Bit Unsigned Division ;* dd8uH:dd8uL / dv16uH:dv16uL =

;*dres16uH:dres16uL drem16uH:drem16uL

.def  drem16uL =r14

.def  drem16uH =r15

.def  dres16uL =r24;=r16

.def  dres16uH =r19;=r17

.def  dd16uL      =r24;=r16

.def  dd16uH      =r19;=r17

.def  dv16uL      =r27;=r18

.def  dv16uH      =r25;=r19

.def  dcnt16u     =r26;=r20

div16u:    ;clear remainder Low byte:

clr   drem16uL

;clear remainder High byte and carry:

sub   drem16uH,drem16uH

;init loop counter:

      ldi   dcnt16u,17 

d16u_1:       ;shift left dividend:

rol   dd16uL

      rol   dd16uH

;decrement counter:

      dec   dcnt16u

      brne  d16u_2   ;if done

      ret            ;  return

d16u_2: ;shift dividend into

  ; remainder

      rol   drem16uL

      rol   drem16uH

;remainder = remainder - divisor

      sub   drem16uL,dv16uL         sbc   drem16uH,dv16uH   ;

      brcc  d16u_3  ;if result

;negative restore remainder

      add   drem16uL,dv16uL

      adc   drem16uH,dv16uH

      clc  

;clear carry to be shifted into ;result

      rjmp  d16u_1  ;else

d16u_3:  sec  ;set carry to be

;shifted into result

      rjmp  d16u_1

;* End div16u    

;************************************

;************************************;* Timer1 Capture Handler

TIM1_CAPT: in    temp1, SREG

      ;in    capture_l, ICR1L

      ;in    capture_h, ICR1H

      in    capture_l, TCNT1L

      in    capture_h, TCNT1H

      ldi   temp, 0

      out   TCNT1H, temp

      out   TCNT1L, temp

      ldi   temp, 0xC3

      out   TCCR1B, temp

      out   SREG, temp1

      set

      reti 

;* End Timer1 Capture Handler

;************************************

;************************************

;* Timer1 OverFlow Handler

TIM1_OVF:   in    temp1, SREG

      ldi   char0, 0

      ldi   char1, 0

      ldi   char2, 0

      ldi   char3, 0

      ldi   char4, 0

      ldi   temp, 0xC0

      out   TCCR1B, temp

      ldi   temp, 0

      out   TCNT1H, temp

      out   TCNT1L, temp

      out   SREG, temp1

      reti

;* End Timer1 OverFlow Handler

;************************************

;************************************

;* Timer0 OverFlow Handler

TIM0_OVF:   in    temp1, SREG

      tst   out_counter

      breq  get_char

      rjmp  show_char

get_char:   mov   out_char0, char0

      mov   out_char1, char1

      mov   out_char2, char2

      mov   out_char3, char3

      mov   out_char4, char4

      rjmp  continue

show_char:  ld    char_pointer, Z+

      ldi   temp, eetbl3

      add   char_pointer, temp

      out   EEARL, char_pointer

      ;address EEPROM

      ldi   temp, 0

      out  EEARH, temp;address EEPROM

      sbi  EECR, EERE  ;strobe EEPROM

      in    char, EEDR  ;read code

      out   PORTA, ZerRol

      out   PORTC, char

sbrc ZerRol, last_seg;brcs carry 

      rjmp  move_ZerRol

New_loop:   ldi   ZH, 0

      ldi   ZL, start_addr

      ldi   ZerRol,0xFE  ;rol ZerRol  

      rjmp  continue

move_ZerRol:      sec

      rol   ZerRol

continue:   inc   out_counter

            out   SREG, temp1

            reti

;* End Timer0 OverFlow Handler     

;************************************



ПРИЛОЖЕНИЕ 4.
Программа для устройства «кодовый замок»


.include "1200def.inc"

;Port B pins

.equ ROW1 =3

.equ ROW2 =2

.equ ROW3 =1

.equ ROW4 =0

.equ COL1 =7

.equ COL2 =6

.equ COL3 =5

.equ COL4 =4

;Port D pins

.equ GREEN =1;green LED indicate

;keynumber

.equ RED  =0;red LED

;initialization & zero keynumber

.equ INT  =2   ;interrupt input

.equ max_count  =21

.equ reset_btn  =4

.equ psw_length =2

.def temp =r16 ;

.def key  =r17 ;key code pointer

;for EEPROM

.def fine =r18 ;loop delay

;counters

.def medium     =r19

.def coarse     =r20

.def status     =r21 ;preserve

;sreg here

.def rowid =r22

.def colid =r23

.def counter    =r24

.def key_pr_count =r25

.eseg      ;EEPROM segment

.org 0

eetbl1:    .db  4,3,2,1,8,7 ,6,5,12,11,10,9,16,15,14,13

eetbl2: .db     3,1,2,4

.cseg      ;CODE segment

.org 0 

     rjmp reset ;Reset handler

     nop

     nop ;unused timer interrupt

     nop ;unused analogue

;interrupt

reset:         

     ldi temp,0x03        ;initialise port D as O/I

     out DDRD,temp        ;

     out PORTD,temp       ;

     sbi ACSR,ACD ;shut down

;comparator to save power

     cli ;disable global

;interrupts

     ldi key_pr_count, 0

     set ;T=1 - true password ;(default);T=0 - false password

     ldi temp,2          

     rjmp red_flash ;flash LEDs

;for example usage

init_scan: clr counter

scan: ldi temp,0xff

     out DDRB,temp

     ldi temp, 0x0f

     out PORTB, temp

     ldi rowid,0xAA

 ;0xAA - значение по умолчанию

 ;кнопка не нежата

     sbis PINB,ROW1  ;find row of

;keypress

     ldi rowid,0 ;and set ROW pointer

     sbis PINB,ROW2

     ldi rowid,4

     sbis PINB,ROW3

     ldi rowid,8

     sbis PINB,ROW4

     ldi rowid,12

     cpi rowid, 0xAA

     breq init_scan       ;Branch if equal //counter=0

     inc counter

     cpi counter, max_count;

     brlo scan ;Branch if not

;equal

     ldi temp,0xF0 ;change port B I/O to find column press

     out PORTB,temp       ;

     rcall settle ;allow time for

;port to settle

     ldi colid, 0xAA     

;0xAA - значение по умолчанию кнопка не нежата

     sbis PINB,COL1

;find column of keypress

     ldi colid,0

;and set COL pointer

     sbis PINB,COL2

     ldi colid,1

     sbis PINB,COL3

     ldi colid,2

     sbis PINB,COL4

     ldi colid,3

     cpi colid, 0xAA

     breq init_scan

;Branch if equal //counter=0

     add rowid,colid

;merge ROW and COL for pointer

     mov key, rowid

     rjmp clr_counter

misc_rst:    rjmp reset

clr_counter: clr counter

     ldi temp, 0xAA

key_up_wait:    sbis PINB,COL1       ;;ожидание поднятия клавиши

     ldi temp, 0xCC

;если бит=0 то temp=cc

     sbis PINB,COL2

     ldi temp, 0xCC 

     sbis PINB,COL3

     ldi temp, 0xCC 

     sbis PINB,COL4

     ldi temp, 0xCC 

     cpi temp, 0xCC

     breq clr_counter

     inc counter

     cpi counter, max_count  ;

     brlo key_up_wait

;Branch if not equal

     ldi temp,0x00        ;reinitialise port B as I/O

     out DDRB,temp        ;

     out PORTB,temp       ;

flash: ldi temp, eetbl1

     add key, temp

     out EEAR, key;address EEPROM

     sbi EECR, EERE;strobe EEPROM

     in key, EEDR

;read code of pressed button

     cpi key, reset_btn

;if key pressed = reset button

     breq misc_rst

;then goto reset

     ldi temp, eetbl2

     add temp, key_pr_count    

     out EEAR, temp

     sbi EECR, EERE

     in temp, EEDR

;read password code 

     inc key_pr_count

     cp key, temp

;if pressed wrong key

     brne not_equal

;then goto not equal

equal:     rjmp continue

not_equal: clt

;T=0 - false password

continue: cpi key_pr_count, psw_length;if kpc > psw length

     brge kpr_exceed

;then goto kpr_exceed

not_kpr_exceed: rjmp init_scan

kpr_exceed:     brts psw_true

;if T=1 then password is true

     ldi key_pr_count, psw_length

;else (T=0 password is false) 

     rjmp init_scan

psw_true:  ldi temp, 3         

green_flash:

     cbi PORTD,GREEN ;               rcall delay

     sbi PORTD,GREEN

     rcall delay

     dec temp

     brne green_flash

exit:      rjmp reset ;scan ;ret

red_flash:      sbi PORTD,RED  

     rcall delay

     cbi PORTD,RED

     rcall delay

     dec temp

     brne red_flash

     rjmp init_scan

;****Time Delay Subroutine for ;****LED flash****

delay:  ldi coarse,3;8               ;triple nested FOR loop

cagain:    ldi medium,255       ;

magain:    ldi fine,255    ;

fagain:    dec fine

     brne fagain

     dec medium

     brne magain

     dec coarse

     brne cagain

     ret

;***Settling time delay for port ;***to stabilise****

settle:   

cagain2:   ldi medium,2         ;

magain2:   ldi fine,255    ;

fagain2:   dec fine

     brne fagain2

     dec medium

     brne magain2

     ret


AT90S

1200

2313

4414

8515

2323

4433

Диапазон напряжений питания, В

2,7 - 6,0

Тактовая частота, МГц *)

0 - 16

0 - 20

0 - 16

0 - 20

Количество линий ввода/вывода (max)

15

32

5

18

Количество инструкций

89

120

Объем Flash ROM, байт

1K

2K

4K

8K

2K

4K

Объем EEPROM, байт

64

128

256

512

128

256

Объем внутренней SRAM, байт

-

128

256

512

128

128

Объем внешней SRAM, байт (max)

-

-

64K

64K

-

-

Объем регистрового файла, байт

32

Количество таймеров/счетчиков

1

2

2

2

1

2

ШИМ: Число каналов/разрядность

-

1/8-10

2/8-10

2/8-10

-

2/8-10

Количество модулей захвата/сравнения

-

1

2

2

-

2

Аналоговый компаратор

+

+

+

+

-

+

SPI (загрузка ROM и EEPROM)

+

+

+

+

+

+

SPI интерфейс (Master/Slave port)

-

-

+

+

-

+

Сторожевой таймер

+

+

+

+

+

+

Асинхронный последовательный порт

-

+

+

+

-

+

Аналого - цифровой преобразователь

-

-

-

-

-

+

Количество битов защиты

2

Число источников прерывания: внутренних/внешних

2/1

8/2

10/2

10/2

2/1

11/2

Тип корпуса

DIP20, SOIC20, SSOP20

DIP40, PLCC44, TQFP44

DIP8, SOIC8

DIP28, PLCC28

ПРИЛОЖЕНИЕ 5.
Основные характеристики микроконтроллеров
AVR