-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.asm
151 lines (108 loc) · 2.49 KB
/
main.asm
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
; H=0xFF,L=0x7B
; hall_led.asm
;
; Created: 12.07.2016 19:52:25
; Author : Маша
;
.device ATtiny13A
.include "tn13Adef.inc"
.def COUNT = r19
.def PWM = r17
.def Razr0 = r21
.def Razr1 = r22
.equ LED = PINB0
.equ SENSOR = PINB1
.equ SP_ON = 2
.equ SP_OFF = 20
.equ MAX_LED = 255-64
; EEPROM
.eseg
.dseg
.org SRAM_START
.cseg
.org 0
; Таблица векторов прерываний
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
reti ; rjmp PCINT0 ; PCINT0 Handler
reti ; ; Timer0 Overflow Handler
reti ; rjmp EE_RDY ; EEPROM Ready Handler
reti ; rjmp ANA_COMP ; Analog Comparator Handler
reti ; rjmp TIM0_COMPA ; Timer0 CompareA Handler
reti ; rjmp TIM0_COMPB ; Timer0 CompareB Handler
reti ; rjmp WATCHDOG ; Watchdog Interrupt Handler
reti ; rjmp ADC ; ADC Conversion Handler
.org INT_VECTORS_SIZE
RESET:
cli ; Запрещаем прерывания
ldi r16, low(RAMEND) ; Установить указатель стэка в конец оперативной памяти
out SPL, r16
sei ; Разрешаем прерывания
ldi r16, (1<<PRADC)
out PRR, r16
ldi r16, (1<<LED)
out DDRB, r16
ldi PWM, 255
out OCR0A, PWM
ldi r16, 1<<CS00
out TCCR0B, r16
ldi r16, (1<<COM0A0)|(1<<COM0A1)|(1<<WGM01)|(1<<WGM00)
out TCCR0A, r16
ldi r16, (1<<TOIE0)
out TIMSK0, r16
; Начало основной программы
POWER_DOWN:
ldi r16, (1<<SM1)|(1<<SE)
out MCUCR, r16
ldi r16, (1<<INT0)
out GIMSK, r16
sleep
MAIN:
ldi COUNT, SP_ON
LED_ON:
cpi PWM, MAX_LED
breq END_ON
NEXT_ON:
rcall IDLE
dec COUNT
brne NEXT_ON
dec PWM
out OCR0A, PWM
rjmp MAIN
END_ON:
; Инициализация счётчика на 20 секунд (0x2710 прерываний таймера)
ldi Razr0, 0x10
ldi Razr1, 0x27
DELAY:
rcall IDLE
sbis PINB, SENSOR
rjmp LED_ON
subi Razr0,1
sbci Razr1,0
brcs OFF
rjmp DELAY
OFF:
ldi COUNT, SP_OFF
LED_DOWN:
cpi PWM, 255
breq POWER_DOWN
NEXT_DOWN:
rcall IDLE
sbis PINB, SENSOR
rjmp LED_ON
dec COUNT
brne NEXT_DOWN
inc PWM
out OCR0A, PWM
rjmp OFF
IDLE:
ldi r16, (1<<SE)
out MCUCR, r16
sleep
ret
;################ Обработка прерываний ################
; Обработчик прерывания INT0
EXT_INT0:
clr r18
out GIMSK, r18
reti