Выбрать главу

.DEF TimeA=r19

.DEF TimeB=r20

.DEF Flags=r21

.EQU END_DATA_AREA=$DB; 41 запись общей длиной 123 байта

.CSEG

.ORG 0

         rjmp Reset

.ORG OC1addr; $0004

         nop

.ORG OVF1addr; $0005

         in SSREG,SREG

         inc Time0

         brne NoOvf

         inc Time1

         brne NoOvf

         inc Time2

NoOvf: ldi r30,$60

         ldi r31,0

LoopCheck:; Loop of verify time for all records

         set ; Флаг T указывает на совпадение текущего и заданного

         Id tmp,Z+; Чтение младшего байта времени

         cp tmp,Time0

         breq E1

         clt

Е1:    Id tmp,Z+; Чтение среднего байта времени

         cp tmp,Time1

         breq E2

         clt

Е2:    Id tmp,Z+; Чтение последней тетрады времени (биты 0–3)

         brtc NoMath; и типа события (биты 4–7)

         mov tem,tmp

         eor tem,Time2

         andi tem,15

         brne NoMath

          mov tem,tmp; Время совпало, выполняем заданное действие

          bndi tem,$F0

          cpi tem,$00

          brne Off0

          cbi PORTB,0; Отключение канала 0

Off0:  cpi tem,$10

          brne On0

          sbi PORTB,0; Включение канала 0

On0:   cpi tem,$20

          brne Off1

          cbi PORTB,1: Отключение канала 1

Off1:  cpi tem,$30

         brne On1

         sbi PORTB,1

On1:  cpi tem,$40

         brne Off2

         cbi PORTB,2

Off2: cpi tem,$50

         brne On2

         sbi PORTB,2

On2:  cpi tem,$60

         brne Off3

         cbi PORTB, 3

Off3: cpi tem,$70

         brne On3

         sbi PORTB,3

On3:  cpi tem,$80

         brne Off4

         cbi PORTB,4

Off4: cpi tem,$90

         brne On4

         sbi PORTB,4

On4:  cpi tem,$A0

         brne Off5

         cbi PORTB,5; Отключение канала 5

Off5: cpi tem,$60

         brne On5

         sbi PORTB, 5; Включение канала 5

On5:  cpi tern,SC0

         brne Off6

         andi Flags,$FE; Отключение канала 6 (используется как будильник)

Off6: cpi tem,$D0

         brne On7

         ori Flags,1;Включение канала 6

On7:  cpi tem,$E0

         breq TimeReset; Обнуление счетчика времени

         cpi tem,$F0

         brne NoMath

TimeReset:;Если биты 4–7 равны 1, то сбрасываем счетчик времени

         clr Time0

         clr Time1

         clr Time2

NoMath:

         cpi r30,END_DATA_AREA

         breq Loop_Check

         rjmp LoopCheck

Loop_Check:

         ; Включение секундного светодиода

         clr TimeB

         sbi PORTB,7

         out SREG,SSREG

         reti

Reset:

         ; Установка указателя стека на максимальный адрес SRAM

         ldi r30,$DF

    out SPL,r30

         ; Настройка направления работы линий порта В

         ldi r30,$FF

         out DDRB,r30

         ldi r30,$7Е

         out DDR0,r30

         ; Режим работы таймера 1 со сбросом и прерыванием при совпадении

         ; Частота прерываний равна 8 000 000 / 256 / 31250 (7А12) = 1 Гц

         ldi r30,12

         ut TCCR1B,r30

         ldi r30,$7A

         out OCR1AH,r30

         ldi r30,$12

         out OCR1AL,r30

         ldi r30,$CO

         out TIMSK,r30

         ; Настройка WDT на 2 секунды

         ldi r30,S0F

         out WDTCR,r30

         ; Настройка UART на прием с параметрами 9600 8N1

         ldi r30,$18

         out UCR,r30

         ldi r30,$33

         out UBRR,r30

         ; Обнуление счетчика времени