📄 io2acpl.lst
字号:
90 0010 2817 JMP COOL_RESTART ;;yes, jump to cool restart system
91 0011 0700 R MOV A, flag_0aah ;;check if flag2(content AAH) changed
92 0012 0CAA XOR A, 0AAH
93 0013 390A SNZ Z
94 0014 2817 JMP COOL_RESTART ;;yes, jump to cool restart system
95 0015 2066 CALL INIT_SPECIAL_REGISTERS ;;reset in normal operation, only reset special registers
96 0016 2819 JMP MAIN_LOOP ;;jump to main_loop
97 0017
"File: IO2ACPL.ASM Holtek Cross-Assembler Version 2.86 Page 4
98 0017 COOL_RESTART: ;;reset when power on
99 0017 2066 CALL INIT_SPECIAL_REGISTERS ;;reset special registers
100 0018 2075 CALL INIT_GENERAL_REGISTERS ;;reset general registers
101 0019
102 0019 MAIN_LOOP:
103 0019 0001 CLR WDT ;;clear Watching Dog Timer
104 001A 1080 R SZ second ;;if time out
105 001B 2819 JMP main_loop ;;no, still waiting
106 001C 0F01 MOV A, 1 ;;yes, resetting ZCD interval = 1sec.
107 001D 0080 R MOV second, A
108 001E 3C00 R SZ flag_zcd_rest ;;if need to ZCD now
109 001F 2823 JMP $+4 ;;yes, ZCD now
110 0020 1F14 CLR PB ;;off all LEDs
111 0021 3000 R SET flag_zcd_rest ;;no, set flag of non-ZCD period
112 0022 2819 JMP MAIN_LOOP ;;jump to main loop
113 0023 3400 R CLR flag_zcd_rest ;;yes, clear flag of non-ZCD period
114 0024 ;;zero crossing detecting right now
115 0024 3C00 R SZ flag_zcd_int ;;waiting for ZCD complete
116 0025 2824 JMP $-1 ;;complete?, no, still waiting
117 0026
118 0026 0700 R MOV A, phase_position ;;yes, check if Power Line frequency is 50HZ
119 0027 0080 R MOV tmp_phase, A ;;save to a temporary variant
120 0028 1F00 R CLR phase_position ;;Clear power line cycle count
121 0029 0AA5 SUB A, COUNT_50HZ + 5 ;;if within COUNT_50HZ +/-5
122 002A 3C0A SZ C
123 002B 2840 JMP TO_OTHER_FREQUENCY ;;no, jump to next 60hz checking
124 002C 0700 R MOV A, tmp_phase
125 002D 0A9B SUB A, COUNT_50HZ - 5
126 002E 380A SNZ C
127 002F 2834 JMP TO_60HZ_DETECTION ;;no, jump to next 60hz checking
128 0030 3194 SET Pb3 ;;yes, 50HZ_LED on
129 0031 3514 CLR Pb2 ;;yes, 60HZ_LED off
130 0032 1F00 R CLR tmp_phase
131 0033 2819 JMP MAIN_LOOP ;;jump to main_loop
132 0034
133 0034 TO_60HZ_DETECTION: ;;Check if Power Line frequency is 60HZ
134 0034 0700 R MOV A, tmp_phase
135 0035 0A8A SUB A, COUNT_60HZ + 5
136 0036 3C0A SZ C
137 0037 2840 JMP TO_OTHER_FREQUENCY ;;no, jump to other case handling code
138 0038 0700 R MOV A, tmp_phase
139 0039 0A80 SUB A, COUNT_60HZ - 5
140 003A 380A SNZ C
141 003B 2840 JMP TO_OTHER_FREQUENCY ;;no, jump to other case handling code
142 003C 3594 CLR Pb3 ;;yes, 50HZ_LED off
143 003D 3114 SET Pb2 ;;yes, 60HZ_LED on
144 003E 1F00 R CLR tmp_phase
145 003F 2819 JMP MAIN_LOOP ;;jump to main_loop
146 0040
147 0040 TO_OTHER_FREQUENCY:
148 0040 1F14 CLR PB ;;off all LEDs
149 0041 2819 JMP MAIN_LOOP ;;jump to main_loop
150 0042
151 0042 ;;-----------end of main()---------------------------
152 0042
153 0042 ;;-----------int_isr()-------------------------------
154 0042 INT_ISR:
155 0042 0080 R MOV acc_stack, A ;;save ACC data
156 0043 070A MOV A, Status
157 0044 0080 R MOV status_stack, A ;;save Status registor data
"File: IO2ACPL.ASM Holtek Cross-Assembler Version 2.86 Page 5
158 0045
159 0045 3000 R SET flag_zcd_int ;;set flag of ZCD interrupt
160 0046 3C00 R SZ flag_first_zcd ;;if 1st entering interrupt
161 0047 284C JMP TO_2ND_INT ;;no, jump to 2nd interrupt handling code
162 0048 1F00 R CLR phase_position ;;yes, clear time count within power line cycle
163 0049 3000 R SET flag_first_zcd ;;set 1st entering interrupt flag
164 004A 3212 SET pa4 ;;just for testing purpose*
165 004B 284F JMP EXIT_INT_ISR ;;exit external interrupt subroutine
166 004C
167 004C TO_2ND_INT:
168 004C 3612 CLR pa4 ;;just for testing purpose*
169 004D 3400 R CLR flag_first_zcd ;;clear 1st entering interrupt flag
170 004E 3400 R CLR flag_zcd_int ;;clear flag of ZCD interrupt
171 004F
172 004F EXIT_INT_ISR:
173 004F 0700 R MOV A, status_stack ;;restore status registor data
174 0050 008A MOV STATUS, A
175 0051 0700 R MOV A, acc_stack ;;restore ACC data
176 0052 0004 RETI
177 0053 ;;-----------end of int_isr()------------------------
178 0053
179 0053 ;;-----------timer_isr()-----------------------------
180 0053 TIMER_ISR:
181 0053 0080 R MOV acc_stack, A ;;save ACC data
182 0054 070A MOV A, STATUS
183 0055 0080 R MOV status_stack, A ;;save Status registor data
184 0056
185 0056 3C00 R SZ flag_zcd_int ;;if already openning ZCD interrupt?
186 0057 1480 R INC phase_position ;;yes, time count add one
187 0058 1780 R SDZ us ;;us --, us == 0?
188 0059 2862 JMP EXIT_TIME_ISR ;;no, exit timer interrupt
189 005A 0F20 MOV A, 32 ;;yes, reset us = 32
190 005B 0080 R MOV us, A
191 005C
192 005C 1780 R SDZ ms ;;ms --, ms == 0?
193 005D 2862 JMP EXIT_TIME_ISR ;;no, exit timer interrupt
194 005E 0FFA MOV A, 250 ;;yes, reset ms = 250
195 005F 0080 R MOV ms, A
196 0060 1080 R SZ second ;;second == 0?
197 0061 1580 R DEC second ;;no, second --
198 0062
199 0062 EXIT_TIME_ISR:
200 0062 0700 R MOV A, status_stack ;;restore status registor data
201 0063 008A MOV STATUS, A
202 0064 0700 R MOV A, acc_stack ;;restore ACC data
203 0065
204 0065 0004 RETI
205 0066 ;;-----------end of timer_isr()----------------------
206 0066
207 0066 ;;-----------init_special_registers()----------------
208 0066 INIT_SPECIAL_REGISTERS:
209 0066 0F20 MOV A, 00100000b ;;all PA port output besides PA5
210 0067 0093 MOV PAC, A
211 0068 1F15 CLR PBC ;;all PB port output
212 0069 1F19 CLR PDC ;;all PD port output
213 006A 1F12 CLR PA ;;clear all PA port
214 006B 1F14 CLR PB ;;clear all PB port
215 006C 0F9A MOV A, 10011010b ;;setting timer mode, falling edge trigger, 1/4 Fsys
216 006D 008E MOV TMRC, A ;;save to TMRC
217 006E 0F83 MOV A, 131 ;;timer interrupt interval: 125us=(256-131)*(1/4Mhz/4)
"File: IO2ACPL.ASM Holtek Cross-Assembler Version 2.86 Page 6
218 006F 008D MOV TMR, A ;;save to TMR
219 0070 1F0B CLR INTC ;;disable all interrupts
220 0071 300B SET EMI ;;enable main interrrupt
221 0072 310B SET ETI ;;enable Timer interrrupt
222 0073 308B SET EEI ;;yes, need to open ZCD interrupt
223 0074
224 0074 0003 RET
225 0075 ;;-----------end of init_special_registers()---------
226 0075
227 0075 ;;-----------init_general_registers()----------------
228 0075 INIT_GENERAL_REGISTERS:
229 0075 0F40 MOV A, RAM_SIZE ;;clear all general reigstors
230 0076 0080 R MOV loop_index, A
231 0077 0F00 R MOV A, OFFSET status_stack ;;point to RAM first address [40H]
232 0078 0081 MOV MP0, A
233 0079 1F00 CLR R0 ;;clear the RAM cell content to zero
234 007A 1481 INC MP0 ;;point to the next one
235 007B 1780 R SDZ loop_index ;;all cells complete?
236 007C 2879 JMP $-3 ;;no, to clear the next RAM cell
237 007D
238 007D 0F55 MOV A, 055H
239 007E 0080 R MOV flag_055h, A ;;written reset flag1 (55H)
240 007F 0FAA MOV A, 0AAH
241 0080 0080 R MOV flag_0aah, A ;;written reset flag2 (AAH)
242 0081
243 0081 0F20 MOV A, 32
244 0082 0080 R MOV us, A ;;let us = 32
245 0083 0FFA MOV A, 250
246 0084 0080 R MOV ms, A ;;let ms = 250
247 0085 0F01 MOV A, 1 ;;ZCD interval = 1sec.
248 0086 0080 R MOV second, A ;;let second = 1sec.
249 0087
250 0087 1F00 R CLR phase_position ;;clear time count of ZCD
251 0088 3400 R CLR flag_first_zcd ;;clear first ZCD flag
252 0089 3400 R CLR flag_zcd_int ;;clear start-up ZCD flag
253 008A 3000 R SET flag_zcd_rest ;;flag of non-ZCD period
254 008B
255 008B 0003 RET
256 008C ;;-----------end of init_general_registers()---------
257 008C
258 008C END ;;main code ending
0 Errors
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -