📄 isd1700_spi.lst
字号:
151 E980 LDI R24,0x90
152 B98F OUT 0x0F,R24
(0162) while (!(SPSR &(1 << SPIF)))
153 9B77 SBIS 0x0E,7
154 CFFE RJMP 0x0153
(0163) ;
(0164) SPDR = 0x00; //data
155 2422 CLR R2
156 B82F OUT 0x0F,R2
(0165) while (!(SPSR &(1 << SPIF)))
157 9B77 SBIS 0x0E,7
158 CFFE RJMP 0x0157
(0166) ;
(0167) SPDR = (unsigned char)startAdd; //start add,LSB
159 B90F OUT 0x0F,R16
(0168) while (!(SPSR &(1 << SPIF)))
15A 9B77 SBIS 0x0E,7
15B CFFE RJMP 0x015A
(0169) ;
(0170) SPDR = (unsigned char)(startAdd>>8); //start add,MSB
15C 0118 MOVW R2,R16
15D 2C23 MOV R2,R3
15E 2433 CLR R3
15F B82F OUT 0x0F,R2
(0171) while (!(SPSR &(1 << SPIF)))
160 9B77 SBIS 0x0E,7
161 CFFE RJMP 0x0160
(0172) ;
(0173) SPDR = 0x00; //end add
162 2422 CLR R2
163 B82F OUT 0x0F,R2
(0174) while (!(SPSR &(1 << SPIF)))
164 9B77 SBIS 0x0E,7
165 CFFE RJMP 0x0164
(0175) ;
(0176) SPDR = 0x00; //end add
166 2422 CLR R2
167 B82F OUT 0x0F,R2
(0177) while (!(SPSR &(1 << SPIF)))
168 9B77 SBIS 0x0E,7
169 CFFE RJMP 0x0168
(0178) ;
(0179) SPDR = 0x00; //end add
16A 2422 CLR R2
16B B82F OUT 0x0F,R2
(0180) while (!(SPSR &(1 << SPIF)))
16C 9B77 SBIS 0x0E,7
16D CFFE RJMP 0x016C
(0181) ;
(0182) for(i=0;i<100;i++)
16E 2744 CLR R20
16F 2755 CLR R21
170 5F4F SUBI R20,0xFF
171 4F5F SBCI R21,0xFF
172 3644 CPI R20,0x64
173 E0E0 LDI R30,0
174 075E CPC R21,R30
175 F3D4 BLT 0x0170
(0183) ;
(0184) PORTB |= (1<<PB0); //SS=1
176 9AC0 SBI 0x18,0
177 9159 LD R21,Y+
178 9149 LD R20,Y+
179 9508 RET
(0185) }
(0186)
(0187) //主函数
(0188) void main(void)
(0189) {
(0190) static unsigned char secondcount=0;
(0191) unsigned char soundFlag=0;
_main:
soundFlag --> R20
t --> R22
17A 2744 CLR R20
(0192)
(0193) unsigned int t;
(0194)
(0195) init_devices(); //全局初始化
17B DF0F RCALL _init_devices
(0196) RUN2_OFF();
17C 98C6 CBI 0x18,6
(0197)
(0198) iProgRunCount=GetTime();
17D 940E 0231 CALL _GetTime
17F 9310 0101 STS iProgRunCount+1,R17
181 9300 0100 STS iProgRunCount,R16
183 C00E RJMP 0x0192
(0199) while(1)
(0200) {
(0201) WDR();
184 95A8 WDR
(0202) t=GetPassTime(iProgRunCount);
185 9100 0100 LDS R16,iProgRunCount
187 9110 0101 LDS R17,iProgRunCount+1
189 940E 023D CALL _GetPassTime
18B 01B8 MOVW R22,R16
(0203) if(t>=100)
18C 3604 CPI R16,0x64
18D E0E0 LDI R30,0
18E 071E CPC R17,R30
18F F010 BCS 0x0192
(0204) {
(0205) isd1700_init();
190 DF15 RCALL _isd1700_init
(0206) break;
191 C001 RJMP 0x0193
192 CFF1 RJMP 0x0184
(0207) }
(0208) }
(0209)
(0210) Read_APC();
193 DF5E RCALL _Read_APC
(0211)
(0212) Sound_SetFlay(0x10);
194 E100 LDI R16,0x10
195 E010 LDI R17,0
196 DFAF RCALL _Sound_SetFlay
(0213) soundTime=GetTime();
197 940E 0231 CALL _GetTime
199 0158 MOVW R10,R16
19A 92B0 0103 STS soundTime+1,R11
19C 92A0 0102 STS soundTime,R10
19E C028 RJMP 0x01C7
(0214) while (1)
(0215) {
(0216) WDR(); //内部watchdog
19F 95A8 WDR
(0217) if(GetPassTime(soundTime)>=1000)
1A0 9100 0102 LDS R16,soundTime
1A2 9110 0103 LDS R17,soundTime+1
1A4 940E 023D CALL _GetPassTime
1A6 01B8 MOVW R22,R16
1A7 3E08 CPI R16,0xE8
1A8 E0E3 LDI R30,3
1A9 071E CPC R17,R30
1AA F0B0 BCS 0x01C1
(0218) {
(0219) soundTime=GetTime();
1AB 940E 0231 CALL _GetTime
1AD 0158 MOVW R10,R16
1AE 92B0 0103 STS soundTime+1,R11
1B0 92A0 0102 STS soundTime,R10
(0220) secondcount++;
1B2 9180 0104 LDS R24,main.c:secondcount
1B4 5F8F SUBI R24,0xFF
1B5 9380 0104 STS main.c:secondcount,R24
(0221) if(secondcount>=20)
1B7 3184 CPI R24,0x14
1B8 F020 BCS 0x01BD
(0222) {
(0223) secondcount=0;
1B9 2422 CLR R2
1BA 9220 0104 STS main.c:secondcount,R2
(0224) soundFlag=1;
1BC E041 LDI R20,1
(0225) }
(0226) RUN1();
1BD E280 LDI R24,0x20
1BE B228 IN R2,0x18
1BF 2628 EOR R2,R24
1C0 BA28 OUT 0x18,R2
(0227) }
(0228)
(0229) if(soundFlag)
1C1 2344 TST R20
1C2 F021 BEQ 0x01C7
(0230) {
(0231) soundFlag=0;
1C3 2744 CLR R20
(0232) //Sound_Flay();
(0233) Sound_SetFlay(0x10);
1C4 E100 LDI R16,0x10
1C5 E010 LDI R17,0
1C6 DF7F RCALL _Sound_SetFlay
1C7 CFD7 RJMP 0x019F
1C8 9508 RET
FILE: E:\AVR\ISD1700_ISP\src\timer.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #include "main.h"
(0004)
(0005) unsigned char WdtTimer = 0; //外部看门狗定时器
(0006) volatile unsigned int Timer1BaseClk = 0; //Timer1基准时钟
(0007)
(0008) // 看门狗初始化函数
(0009) // prescale: 512K cycles,overtime 417ms
(0010) void watchdog_init(void)
(0011) {
(0012) WDR(); //this prevents a timout on enabling
_watchdog_init:
1C9 95A8 WDR
(0013) WDTCR = 0x18; //WDCE、WDE位置1,再改变超时时间
1CA E188 LDI R24,0x18
1CB BD81 OUT 0x21,R24
(0014) WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
1CC E08D LDI R24,0xD
1CD BD81 OUT 0x21,R24
1CE 9508 RET
(0015) }
(0016)
(0017) //TIMER1 initialize - prescale:8
(0018) // WGM: 0) Normal, TOP=0xFFFF
(0019) // desired value: 2000Hz
(0020) // actual value: 2000.000Hz (0.0%)
(0021) void timer1_init(void)
(0022) {
(0023) TCCR1B = 0x00; //stop
_timer1_init:
1CF 2422 CLR R2
1D0 BC2E OUT 0x2E,R2
(0024) TCNT1H = 0xFC; //setup
1D1 EF8C LDI R24,0xFC
1D2 BD8D OUT 0x2D,R24
(0025) TCNT1L = 0x18;
1D3 E188 LDI R24,0x18
1D4 BD8C OUT 0x2C,R24
(0026) OCR1AH = 0x03;
1D5 E083 LDI R24,3
1D6 BD8B OUT 0x2B,R24
(0027) OCR1AL = 0xE8;
1D7 EE88 LDI R24,0xE8
1D8 BD8A OUT 0x2A,R24
(0028) OCR1BH = 0x03;
1D9 E083 LDI R24,3
1DA BD89 OUT 0x29,R24
(0029) OCR1BL = 0xE8;
1DB EE88 LDI R24,0xE8
1DC BD88 OUT 0x28,R24
(0030) OCR1CH = 0x03;
1DD E083 LDI R24,3
1DE 9380 0079 STS 0x0079,R24
(0031) OCR1CL = 0xE8;
1E0 EE88 LDI R24,0xE8
1E1 9380 0078 STS 0x0078,R24
(0032) ICR1H = 0x03;
1E3 E083 LDI R24,3
1E4 BD87 OUT 0x27,R24
(0033) ICR1L = 0xE8;
1E5 EE88 LDI R24,0xE8
1E6 BD86 OUT 0x26,R24
(0034) TCCR1A = 0x00;
1E7 BC2F OUT 0x2F,R2
(0035) TCCR1B = 0x02; //start Timer
1E8 E082 LDI R24,2
1E9 BD8E OUT 0x2E,R24
1EA 9508 RET
_timer1_ovf_isr:
1EB 922A ST R2,-Y
1EC 923A ST R3,-Y
1ED 924A ST R4,-Y
1EE 925A ST R5,-Y
1EF 938A ST R24,-Y
1F0 939A ST R25,-Y
1F1 93AA ST R26,-Y
1F2 93BA ST R27,-Y
1F3 B62F IN R2,0x3F
1F4 922A ST R2,-Y
(0036) }
(0037)
(0038) //-------------------------------------------------------------------------
(0039)
(0040) #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
(0041) void timer1_ovf_isr(void)
(0042) {
(0043) //TIMER1 has overflowed
(0044) static unsigned char timer1int = 0;
(0045)
(0046) TCNT1H = 0xFC; //reload counter high value
1F5 EF8C LDI R24,0xFC
1F6 BD8D OUT 0x2D,R24
(0047) TCNT1L = 0x18; //reload counter low value
1F7 E188 LDI R24,0x18
1F8 BD8C OUT 0x2C,R24
(0048)
(0049) timer1int++;
1F9 9180 0108 LDS R24,timer.c:timer1int
1FB 5F8F SUBI R24,0xFF
1FC 9380 0108 STS timer.c:timer1int,R24
(0050) if (timer1int >= 2)
1FE 3082 CPI R24,2
1FF F130 BCS 0x0226
(0051) {
(0052) //1ms
(0053) timer1int = 0;
200 2422 CLR R2
201 9220 0108 STS timer.c:timer1int,R2
(0054) Timer1BaseClk++;
203 9180 0106 LDS R24,Timer1BaseClk
205 9190 0107 LDS R25,Timer1BaseClk+1
207 9601 ADIW R24,1
208 9390 0107 STS Timer1BaseClk+1,R25
20A 9380 0106 STS Timer1BaseClk,R24
(0055) if (Timer1BaseClk >= 60000)
20C E680 LDI R24,0x60
20D EE9A LDI R25,0xEA
20E E0A0 LDI R26,0
20F E0B0 LDI R27,0
210 9020 0106 LDS R2,Timer1BaseClk
212 9030 0107 LDS R3,Timer1BaseClk+1
214 2444 CLR R4
215 2455 CLR R5
216 1628 CP R2,R24
217 0639 CPC R3,R25
218 064A CPC R4,R26
219 065B CPC R5,R27
21A F034 BLT 0x0221
(0056) {
(0057) Timer1BaseClk = 0;
21B 2422 CLR R2
21C 2433 CLR R3
21D 9230 0107 STS Timer1BaseClk+1,R3
21F 9220 0106 STS Timer1BaseClk,R2
(0058) }
(0059)
(0060) WdtTimer++;
221 9180 0105 LDS R24,WdtTimer
223 5F8F SUBI R24,0xFF
224 9380 0105 STS WdtTimer,R24
(0061) }
226 9029 LD R2,Y+
227 BE2F OUT 0x3F,R2
228 91B9 LD R27,Y+
229 91A9 LD R26,Y+
22A 9199 LD R25,Y+
22B 9189 LD R24,Y+
22C 9059 LD R5,Y+
22D 9049 LD R4,Y+
22E 9039 LD R3,Y+
22F 9029 LD R2,Y+
230 9518 RETI
(0062) }
(0063)
(0064) unsigned int GetTime(void)
(0065) {
(0066) unsigned int iTime1,iTime2;
(0067) do{
(0068) iTime1 = Timer1BaseClk;
_GetTime:
iTime1 --> R18
iTime2 --> R16
231 9120 0106 LDS R18,Timer1BaseClk
233 9130 0107 LDS R19,Timer1BaseClk+1
(0069) iTime2 = Timer1BaseClk;
235 9100 0106 LDS R16,Timer1BaseClk
237 9110 0107 LDS R17,Timer1BaseClk+1
(0070) }while(iTime2 != iTime1);
239 1702 CP R16,R18
23A 0713 CPC R17,R19
23B F7A9 BNE 0x0231
(0071) return iTime2;
23C 9508 RET
_GetPassTime:
temp_i --> R10
iCurTime --> R10
iPreTime --> R12
23D 940E 025D CALL push_xgsetF03C
23F 0168 MOVW R12,R16
(0072) }
(0073) //-------------------------------------------------------------------------
(0074)
(0075) unsigned int GetPassTime(unsigned int iPreTime)
(0076) {
(0077) unsigned int temp_i = 0;
(0078) unsigned int iCurTime = GetTime();
240 DFF0 RCALL _GetTime
241 0158 MOVW R10,R16
(0079)
(0080) if (iCurTime >= iPreTime)
242 150C CP R16,R12
243 051D CPC R17,R13
244 F018 BCS 0x0248
(0081) {
(0082) return (iCurTime - iPreTime);
245 190C SUB R16,R12
246 091D SBC R17,R13
247 C013 RJMP 0x025B
(0083) }
(0084) else
(0085) {
(0086) return (60000 - iPreTime + iCurTime);
FILE: <library>
248 0116 MOVW R2,R12
249 2444 CLR R4
24A 2455 CLR R5
24B E640 LDI R20,0x60
24C EE5A LDI R21,0xEA
24D E060 LDI R22,0
24E E070 LDI R23,0
24F 1942 SUB R20,R2
250 0953 SBC R21,R3
251 0964 SBC R22,R4
252 0975 SBC R23,R5
253 0115 MOVW R2,R10
254 2444 CLR R4
255 2455 CLR R5
256 0D42 ADD R20,R2
257 1D53 ADC R21,R3
258 1D64 ADC R22,R4
259 1D75 ADC R23,R5
25A 018A MOVW R16,R20
25B 940C 0266 JMP pop_xgsetF03C
push_xgsetF03C:
25D 937A ST R23,-Y
25E 936A ST R22,-Y
25F 935A ST R21,-Y
260 934A ST R20,-Y
261 92DA ST R13,-Y
262 92CA ST R12,-Y
263 92BA ST R11,-Y
264 92AA ST R10,-Y
265 9508 RET
pop_xgsetF03C:
266 90A9 LD R10,Y+
267 90B9 LD R11,Y+
268 90C9 LD R12,Y+
269 90D9 LD R13,Y+
26A 9149 LD R20,Y+
26B 9159 LD R21,Y+
26C 9169 LD R22,Y+
26D 9179 LD R23,Y+
26E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -