📄 easy_icc.lst
字号:
(0129)
(0130) if (SCH_tasks_G[TASK_INDEX].pTask == 0)
0338 E087 LDI R24,7
0339 9F80 MUL R24,R16
033A 01F0 MOVW R30,R0
033B E689 LDI R24,0x69
033C E090 LDI R25,0
033D 0FE8 ADD R30,R24
033E 1FF9 ADC R31,R25
033F 8020 LDD R2,Z+0
0340 8031 LDD R3,Z+1
0341 2022 TST R2
0342 F421 BNE 0x0347
0343 2033 TST R3
0344 F411 BNE 0x0347
(0131) {
(0132) Return_code = RETURN_ERROR;
0345 E041 LDI R20,1
(0133) }
0346 C001 RJMP 0x0348
(0134) else
(0135) {
(0136) Return_code = RETURN_NORMAL;
0347 2744 CLR R20
(0137) }
(0138)
(0139) // 删除任务
(0140) SCH_tasks_G[TASK_INDEX].pTask = 0x00;
0348 E087 LDI R24,7
0349 9F80 MUL R24,R16
034A 01F0 MOVW R30,R0
034B E689 LDI R24,0x69
034C E090 LDI R25,0
034D 0FE8 ADD R30,R24
034E 1FF9 ADC R31,R25
034F 2422 CLR R2
0350 2433 CLR R3
0351 8231 STD Z+1,R3
0352 8220 STD Z+0,R2
(0141) SCH_tasks_G[TASK_INDEX].Delay = 0;
0353 E087 LDI R24,7
0354 9F80 MUL R24,R16
0355 01F0 MOVW R30,R0
0356 E68B LDI R24,0x6B
0357 E090 LDI R25,0
0358 0FE8 ADD R30,R24
0359 1FF9 ADC R31,R25
035A 8231 STD Z+1,R3
035B 8220 STD Z+0,R2
(0142) SCH_tasks_G[TASK_INDEX].Period = 0;
035C E087 LDI R24,7
035D 9F80 MUL R24,R16
035E 01F0 MOVW R30,R0
035F E68D LDI R24,0x6D
0360 E090 LDI R25,0
0361 0FE8 ADD R30,R24
0362 1FF9 ADC R31,R25
0363 8231 STD Z+1,R3
0364 8220 STD Z+0,R2
(0143) SCH_tasks_G[TASK_INDEX].RunMe = 0;
0365 E087 LDI R24,7
0366 9F80 MUL R24,R16
0367 01F0 MOVW R30,R0
0368 E68F LDI R24,0x6F
0369 E090 LDI R25,0
036A 0FE8 ADD R30,R24
036B 1FF9 ADC R31,R25
036C 8220 STD Z+0,R2
(0144)
(0145) return Return_code;
036D 2F04 MOV R16,R20
036E 940E0540 CALL pop_gset1
0370 9508 RET
(0146) }
(0147)
(0148)
(0149) /*---------------------------------------------------------*-
(0150) * 函数名称: SCH_Update()
(0151) * 入 口:
(0152) * 出 口:
(0153) * 函数功能: 在调度器的中断服务程序中运行
(0154) *
(0155) * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
(0156) * RunMe标志加1,然后该任务将由调度程序执行.
(0157) -*---------------------------------------------------------*/
(0158)
(0159) static void SCH_Updata(void)
(0160) {
(0161) unsigned char Index;
(0162) for (Index=0; Index < SCH_MAX_TASKS; Index++)
_SCH_Updata:
Index --> R16
0371 2700 CLR R16
0372 C054 RJMP 0x03C7
(0163) {
(0164) // 检测这里是否有任务?
(0165) if (SCH_tasks_G[Index].pTask != 0)
0373 E087 LDI R24,7
0374 9F80 MUL R24,R16
0375 01F0 MOVW R30,R0
0376 E689 LDI R24,0x69
0377 E090 LDI R25,0
0378 0FE8 ADD R30,R24
0379 1FF9 ADC R31,R25
037A 8020 LDD R2,Z+0
037B 8031 LDD R3,Z+1
037C 2022 TST R2
037D F419 BNE 0x0381
037E 2033 TST R3
037F F409 BNE 0x0381
0380 C045 RJMP 0x03C6
(0166) {
(0167) if (SCH_tasks_G[Index].Delay == 0)
0381 E087 LDI R24,7
0382 9F80 MUL R24,R16
0383 01F0 MOVW R30,R0
0384 E68B LDI R24,0x6B
0385 E090 LDI R25,0
0386 0FE8 ADD R30,R24
0387 1FF9 ADC R31,R25
0388 8020 LDD R2,Z+0
0389 8031 LDD R3,Z+1
038A 2022 TST R2
038B F009 BEQ 0x038D
038C C02C RJMP 0x03B9
038D 2033 TST R3
038E F009 BEQ 0x0390
038F C029 RJMP 0x03B9
(0168) {
(0169) SCH_tasks_G[Index].RunMe += 1; // RunMer标志加1
0390 E087 LDI R24,7
0391 9F80 MUL R24,R16
0392 0110 MOVW R2,R0
0393 E68F LDI R24,0x6F
0394 E090 LDI R25,0
0395 0E28 ADD R2,R24
0396 1E39 ADC R3,R25
0397 01F1 MOVW R30,R2
0398 8180 LDD R24,Z+0
0399 5F8F SUBI R24,0xFF
039A 8380 STD Z+0,R24
(0170) if (SCH_tasks_G[Index].Period != 0)
039B E087 LDI R24,7
039C 9F80 MUL R24,R16
039D 01F0 MOVW R30,R0
039E E68D LDI R24,0x6D
039F E090 LDI R25,0
03A0 0FE8 ADD R30,R24
03A1 1FF9 ADC R31,R25
03A2 8020 LDD R2,Z+0
03A3 8031 LDD R3,Z+1
03A4 2022 TST R2
03A5 F411 BNE 0x03A8
03A6 2033 TST R3
03A7 F0F1 BEQ 0x03C6
(0171) {
(0172) // 调度定期的任务再次运行
(0173) SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
03A8 E087 LDI R24,7
03A9 9F80 MUL R24,R16
03AA E68D LDI R24,0x6D
03AB E090 LDI R25,0
03AC 01F0 MOVW R30,R0
03AD 0FE8 ADD R30,R24
03AE 1FF9 ADC R31,R25
03AF 8020 LDD R2,Z+0
03B0 8031 LDD R3,Z+1
03B1 E68B LDI R24,0x6B
03B2 E090 LDI R25,0
03B3 01F0 MOVW R30,R0
03B4 0FE8 ADD R30,R24
03B5 1FF9 ADC R31,R25
03B6 8231 STD Z+1,R3
03B7 8220 STD Z+0,R2
(0174) }
(0175) }
03B8 C00D RJMP 0x03C6
(0176) else
(0177) {
(0178) // 还没有准备好运行,延迟减1
(0179) SCH_tasks_G[Index].Delay -= 1;
03B9 E087 LDI R24,7
03BA 9F80 MUL R24,R16
03BB 0110 MOVW R2,R0
03BC E68B LDI R24,0x6B
03BD E090 LDI R25,0
03BE 0E28 ADD R2,R24
03BF 1E39 ADC R3,R25
03C0 01F1 MOVW R30,R2
03C1 8180 LDD R24,Z+0
03C2 8191 LDD R25,Z+1
03C3 9701 SBIW R24,1
03C4 8391 STD Z+1,R25
03C5 8380 STD Z+0,R24
03C6 9503 INC R16
03C7 3003 CPI R16,3
03C8 F408 BCC 0x03CA
03C9 CFA9 RJMP 0x0373
03CA 9508 RET
_InitTimer1:
i --> R20
03CB 940E053D CALL push_gset1
(0180) }
(0181) }
(0182) }
(0183) }
(0184)
(0185)
(0186) /*---------------------------------------------------------*-
(0187) * 函数名称: SCH_Init_Timer2()
(0188) * 入 口:
(0189) * 出 口:
(0190) * 函数功能: 准备调度器数据结构并且设置定时器以所需的频率中断
(0191) *
(0192) * 说 明: 调度器初始化化函数,必须在使用调度器之前调用它
(0193) -*---------------------------------------------------------*/
(0194) void InitTimer1(void) //8MHz,10ms,64分频
(0195) {
(0196) uchar i;
(0197)
(0198) for (i=0; i<SCH_MAX_TASKS; i++)
03CD 2744 CLR R20
03CE C003 RJMP 0x03D2
(0199) {
(0200) SCH_Delete_Task(i);
03CF 2F04 MOV R16,R20
03D0 DF65 RCALL _SCH_Delete_Task
03D1 9543 INC R20
03D2 3043 CPI R20,3
03D3 F3D8 BCS 0x03CF
(0201) }
(0202)
(0203) TCCR1B = 0x00; //stop
03D4 2422 CLR R2
03D5 BC2E OUT 0x2E,R2
(0204) TCNT1H = 0xFB; //setup
03D6 EF8B LDI R24,0xFB
03D7 BD8D OUT 0x2D,R24
(0205) TCNT1L = 0x1E;
03D8 E18E LDI R24,0x1E
03D9 BD8C OUT 0x2C,R24
(0206) OCR1AH = 0x04;
03DA E084 LDI R24,4
03DB BD8B OUT 0x2B,R24
(0207) OCR1AL = 0xE2;
03DC EE82 LDI R24,0xE2
03DD BD8A OUT 0x2A,R24
(0208) OCR1BH = 0x04;
03DE E084 LDI R24,4
03DF BD89 OUT 0x29,R24
(0209) OCR1BL = 0xE2;
03E0 EE82 LDI R24,0xE2
03E1 BD88 OUT 0x28,R24
(0210) ICR1H = 0x04;
03E2 E084 LDI R24,4
03E3 BD87 OUT 0x27,R24
(0211) ICR1L = 0xE2;
03E4 EE82 LDI R24,0xE2
03E5 BD86 OUT 0x26,R24
(0212) TCCR1A = 0x00;
03E6 BC2F OUT 0x2F,R2
(0213) TCCR1B = 0x03; //start Timer
03E7 E083 LDI R24,3
03E8 BD8E OUT 0x2E,R24
03E9 940E0540 CALL pop_gset1
03EB 9508 RET
_SCH_Update_Server:
03EC 940E055D CALL push_lset
(0214) }
(0215)
(0216)
(0217) /*---------------------------------------------------------*-
(0218) * 函数名称: SCH_Update_Server()
(0219) * 入 口:
(0220) * 出 口:
(0221) * 函数功能: 调度器的中断服务程序
(0222) *
(0223) * 说 明: "刷新"函数,确定某个任务需要运行时,将这个任务的
(0224) * RunMe标志加1,然后该任务将由调度程序执行.
(0225) -*---------------------------------------------------------*/
(0226) #pragma interrupt_handler SCH_Update_Server:9 //定时器溢出中断
(0227) void SCH_Update_Server(void)
(0228) {
(0229) TCNT1H = 0xFB; //reload counter value
03EE EF8B LDI R24,0xFB
03EF BD8D OUT 0x2D,R24
(0230) TCNT1L = 0x1E;
03F0 E18E LDI R24,0x1E
03F1 BD8C OUT 0x2C,R24
(0231)
(0232) TimeTick++;
03F2 91800068 LDS R24,TimeTick
03F4 5F8F SUBI R24,0xFF
03F5 93800068 STS TimeTick,R24
(0233) MotorDelayTime++;
03F7 91800066 LDS R24,MotorDelayTime
03F9 91900067 LDS R25,MotorDelayTime+1
03FB 9601 ADIW R24,1
03FC 93900067 STS MotorDelayTime+1,R25
03FE 93800066 STS MotorDelayTime,R24
(0234)
(0235)
(0236) if(TimeTick%100 == 0) //1s喂狗
0400 E614 LDI R17,0x64
0401 91000068 LDS R16,TimeTick
0403 940E0517 CALL mod8u
0405 2300 TST R16
0406 F449 BNE 0x0410
(0237) {
(0238) if(TimeTick == 200)TimeTick = 0;
0407 91800068 LDS R24,TimeTick
0409 3C88 CPI R24,0xC8
040A F419 BNE 0x040E
040B 2422 CLR R2
040C 92200068 STS TimeTick,R2
(0239) OutWdServer();
040E 940E009C CALL _OutWdServer
(0240) }
(0241)
(0242)
(0243) SCH_Updata();
0410 DF60 RCALL _SCH_Updata
0411 940E0574 CALL pop_lset
0413 9518 RETI
(0244)
(0245) }
(0246)
(0247)
(0248) /*---------------------------------------------------------*-
(0249) * 函数名称: SCH_Start()
(0250) * 入 口:
(0251) * 出 口:
(0252) * 函数功能: 通过允许中断来启动调度器
(0253) *
(0254) * 说 明: 在添加了所有定期的任务之后调用,从而使任务保持同步.
(0255) * 注意:应该只使能调度器中断
(0256) -*---------------------------------------------------------*/
(0257)
(0258) void SCH_Start(void)
(0259) {
(0260) SEI();
_SCH_Start:
0414 9478 BSET 7
0415 9508 RET
FILE: E:\_ING\文档\_STQ\easy-STQ-20080712\alarm.c
(0001)
(0002) ///////////////////////////////////////////////////////////////
(0003) /**************************************************************
(0004)
(0005) 公司名称: 扬州恒博科技
(0006) 模块名 : 点动型STQ执行机构主控程序
(0007) 创建人 : 章俭文
(0008) 日期 : 2008/08/19
(0009) 功能描述: 完成对本地旋钮和远程开关量的控制功能
(0010) 其它说明: 编译环境为ICCAVR V6.31A
(0011) 版本 : V1.0
(0012)
(0013) **************************************************************/
(0014) ///////////////////////////////////////////////////////////////
(0015)
(0016) #define ALARM_GLOBAL
(0017) #include "alarm.h"
(0018)
(0019) static void Flash(void);
(0020)
(0021) void Alarm() //执行器状态的LED告警指示
(0022) {
(0023)
(0024) if((MotorFlag == CLOSE)||(MotorFlag == OPEN)) //闪烁
_Alarm:
0416 91800065 LDS R24,MotorFlag
0418 3082 CPI R24,2
0419 F021 BEQ 0x041E
041A 91800065 LDS R24,MotorFlag
041C 3081 CPI R24,1
041D F409 BNE 0x041F
(0025) {
(0026) Flash();
041E D001 RCALL _Flash
(0027) }
041F 9508 RET
(0028)
(0029) }
(0030)
(0031) static void Flash()
(0032) {
(0033) static uchar last_flash = 0;
(0034) if(last_flash)
_Flash:
0420 90200063 LDS R2,last_flash
0422 2022 TST R2
0423 F051 BEQ 0x042E
(0035) {
(0036) if(GetLocal())
0424 99CE SBIC 0x19,6
0425 C001 RJMP 0x0427
(0037) {
(0038) SetRemoteLed();
0426 98C6 CBI 0x18,6
(0039) }
(0040) if(GetRemote())
0427 99CD SBIC 0x19,5
0428 C001 RJMP 0x042A
(0041) {
(0042) SetLocalLed();
0429 98C5 CBI 0x18,5
(0043) }
(0044) last_flash = 0;
042A 2422 CLR R2
042B 92200063 STS last_flash,R2
(0045) }
042D C009 RJMP 0x0437
(0046) else
(0047) {
(0048) if(GetLocal())
042E 99CE SBIC 0x19,6
042F C001 RJMP 0x0431
(0049) {
(0050) ClrRemoteLed();
0430 9AC6 SBI 0x18,6
(0051) }
(0052) if(GetRemote())
0431 99CD SBIC 0x19,5
0432 C001 RJMP 0x0434
(0053) {
(0054) ClrLocalLed();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -