📄 uart.lst
字号:
(0223) uint tempData = 0;
0292 2422 CLR R2
0293 2433 CLR R3
0294 8239 STD Y+1,R3
0295 8228 STD Y+0,R2
(0224)
(0225) //起始地址 40001 (0x9c41)
(0226) addr = (receBuf[2]<<8) + receBuf[3];
0296 9020010F LDS R2,receBuf+3
0298 9030010E LDS R3,receBuf+2
029A 2D53 MOV R21,R3
029B 2D42 MOV R20,R2
(0227)
(0228) //tempAddr = addr & 0xfff;
(0229) //addr = receBuf[3];
(0230) tempAddr = addr;
029C 016A MOVW R12,R20
(0231)
(0232) readCount = (receBuf[4]<<8) + receBuf[5]; //要读的个数
029D 90200111 LDS R2,0x111
029F 90300110 LDS R3,0x110
02A1 2D53 MOV R21,R3
02A2 2D42 MOV R20,R2
(0233) //readCount = receBuf[5];
(0234)
(0235) byteCount = readCount * 2;
02A3 E082 LDI R24,2
02A4 9F84 MUL R24,R20
02A5 2CA0 MOV R10,R0
(0236)
(0237) for(i=0;i<byteCount;i+=2,tempAddr++)
02A6 2766 CLR R22
02A7 2777 CLR R23
02A8 C01B RJMP 0x02C4
(0238) {
(0239) getRegisterVal(tempAddr,&tempData);
02A9 019E MOVW R18,R28
02AA 0186 MOVW R16,R12
02AB D048 RCALL _getRegisterVal
(0240) sendBuf[i+3] = tempData >> 8;
02AC E18C LDI R24,0x1C
02AD E091 LDI R25,1
02AE 01FB MOVW R30,R22
02AF 9633 ADIW R30,3
02B0 0FE8 ADD R30,R24
02B1 1FF9 ADC R31,R25
02B2 8028 LDD R2,Y+0
02B3 8039 LDD R3,Y+1
02B4 2C23 MOV R2,R3
02B5 2433 CLR R3
02B6 8220 STD Z+0,R2
(0241) sendBuf[i+4] = tempData & 0xff;
02B7 01FB MOVW R30,R22
02B8 9634 ADIW R30,4
02B9 0FE8 ADD R30,R24
02BA 1FF9 ADC R31,R25
02BB 8188 LDD R24,Y+0
02BC 8199 LDD R25,Y+1
02BD 7090 ANDI R25,0
02BE 8380 STD Z+0,R24
02BF 5F6E SUBI R22,0xFE
02C0 4F7F SBCI R23,0xFF
02C1 01C6 MOVW R24,R12
02C2 9601 ADIW R24,1
02C3 016C MOVW R12,R24
02C4 2C2A MOV R2,R10
02C5 2433 CLR R3
02C6 1562 CP R22,R2
02C7 0573 CPC R23,R3
02C8 F300 BCS 0x02A9
(0242) }
(0243)
(0244) sendBuf[0] = 0xff;
02C9 EF8F LDI R24,0xFF
02CA 9380011C STS sendBuf,R24
(0245) sendBuf[1] = 3;
02CC E083 LDI R24,3
02CD 9380011D STS sendBuf+1,R24
(0246) sendBuf[2] = byteCount;
02CF 92A0011E STS sendBuf+2,R10
(0247) byteCount += 3;
02D1 2D82 MOV R24,R2
02D2 5F8D SUBI R24,0xFD
02D3 2EA8 MOV R10,R24
(0248) crcData = CRC16(sendBuf,byteCount);
02D4 2F28 MOV R18,R24
02D5 2733 CLR R19
02D6 E10C LDI R16,0x1C
02D7 E011 LDI R17,1
02D8 DF7A RCALL _CRC16
02D9 01A8 MOVW R20,R16
(0249) sendBuf[byteCount] = crcData >> 8;
02DA E18C LDI R24,0x1C
02DB E091 LDI R25,1
02DC 2DEA MOV R30,R10
02DD 27FF CLR R31
02DE 0FE8 ADD R30,R24
02DF 1FF9 ADC R31,R25
02E0 011A MOVW R2,R20
02E1 2C23 MOV R2,R3
02E2 2433 CLR R3
02E3 8220 STD Z+0,R2
(0250) byteCount++;
02E4 94A3 INC R10
(0251) sendBuf[byteCount] = crcData & 0xff;
02E5 2DEA MOV R30,R10
02E6 27FF CLR R31
02E7 0FE8 ADD R30,R24
02E8 1FF9 ADC R31,R25
02E9 01CA MOVW R24,R20
02EA 7090 ANDI R25,0
02EB 8380 STD Z+0,R24
(0252) //----------
(0253) sendCount = byteCount + 1;
02EC 2D8A MOV R24,R10
02ED 5F8F SUBI R24,0xFF
02EE 93800130 STS sendCount,R24
(0254) // sendCount = 7;
(0255) //----------
(0256) beginSend();
02F0 DE93 RCALL _beginSend
02F1 9622 ADIW R28,2
02F2 D201 RCALL pop_gset4
02F3 9508 RET
_getRegisterVal:
tempAddr --> Y+1
result --> R20
p_tempData --> R22
addr --> R10
02F4 D207 RCALL push_gset3
02F5 01B9 MOVW R22,R18
02F6 0158 MOVW R10,R16
(0257) }//void readRegisters(void)
(0258)
(0259)
(0260) //取寄存器值 返回0表示成功
(0261) uint getRegisterVal(uint addr,uint *p_tempData)
(0262) {
(0263) uint result = 0;
02F7 2744 CLR R20
02F8 2755 CLR R21
(0264) uint tempAddr;
(0265)
(0266) // tempAddr = addr & 0xfff;
(0267) addr = addr - 40000;
02F9 01C5 MOVW R24,R10
02FA 5480 SUBI R24,0x40
02FB 499C SBCI R25,0x9C
02FC 015C MOVW R10,R24
(0268) switch(addr) //(tempAddr) // & 0xff)
02FD E180 LDI R24,0x10
02FE E090 LDI R25,0
02FF 158A CP R24,R10
0300 059B CPC R25,R11
0301 F40C BGE 0x0303
0302 C02C RJMP 0x032F
0303 E002 LDI R16,2
0304 E010 LDI R17,0
0305 0195 MOVW R18,R10
0306 D1D9 RCALL empy16s
0307 01F8 MOVW R30,R16
0308 E384 LDI R24,0x34
0309 E090 LDI R25,0
030A 0FE8 ADD R30,R24
030B 1FF9 ADC R31,R25
030C 9005 LPM R0,Z+
030D 9014 LPM R1,0(Z)
030E 01F0 MOVW R30,R0
030F 9409 IJMP
(0269) {
(0270) case 0:
(0271) break;
(0272) case 1:
(0273) *p_tempData = testVarAnalog; // 模拟量当前值.
0310 9020010A LDS R2,testVarAnalog
0312 9030010B LDS R3,testVarAnalog+1
0314 01FB MOVW R30,R22
0315 8231 STD Z+1,R3
0316 8220 STD Z+0,R2
(0274) break;
0317 C017 RJMP 0x032F
(0275) case 2:
(0276) *p_tempData = testVarPoint; // 小数点位置.
0318 90200108 LDS R2,testVarPoint
031A 90300109 LDS R3,testVarPoint+1
031C 01FB MOVW R30,R22
031D 8231 STD Z+1,R3
031E 8220 STD Z+0,R2
(0277) break;
031F C00F RJMP 0x032F
(0278) case 3:
(0279) *p_tempData = testVarInputUp; // 上限.
0320 90200106 LDS R2,testVarInputUp
0322 90300107 LDS R3,testVarInputUp+1
0324 01FB MOVW R30,R22
0325 8231 STD Z+1,R3
0326 8220 STD Z+0,R2
(0280) break;
0327 C007 RJMP 0x032F
(0281) case 4:
(0282) *p_tempData = testVarInputDown;// 下限.
0328 90200104 LDS R2,testVarInputDown
032A 90300105 LDS R3,testVarInputDown+1
032C 01FB MOVW R30,R22
032D 8231 STD Z+1,R3
032E 8220 STD Z+0,R2
(0283) break;
(0284) case 5:
(0285) break;
(0286) case 6:
(0287) break;
(0288) case 7:
(0289) break;
(0290) case 8:
(0291) break;
(0292) case 9:
(0293) break;
(0294) case 10:
(0295) break;
(0296) case 11:
(0297) break;
(0298) case 12:
(0299) break;
(0300) case 13:
(0301) break;
(0302) case 14:
(0303) break;
(0304) case 15:
(0305) break;
(0306) case 16:
(0307) //*tempData = testRegister;
(0308) break;
(0309) default:
(0310) break;
(0311) }
(0312) return result;
032F 018A MOVW R16,R20
0330 D1C1 RCALL pop_gset3
0331 9508 RET
FILE: D:\ICCTES~1\1128\timer2.c
(0001) // timer2
(0002) #include <iom48v.h>
(0003) #include <macros.h>
(0004) #include "main.h"
(0005) #include "modbus.h"
(0006) #include "timer2.h"
(0007)
(0008) volatile TIMEBASESTRCUT timeBase;
(0009) volatile LEDCONTROL ledControl;
(0010) //uchar var_a,var_b;
(0011)
(0012) //TIMER2 initialize - prescale:64
(0013) // WGM: Normal
(0014) // desired value: 1mSec
(0015) // actual value: 1.000mSec (0.0%)
(0016) void timer2_init(void)
(0017) {
(0018) TCCR2B = 0x00; //stop
_timer2_init:
0332 2422 CLR R2
0333 922000B1 STS 0xB1,R2
(0019) ASSR = 0x00; //set async mode
0335 922000B6 STS 0xB6,R2
(0020) TCNT2 = 0x83; //setup
0337 E883 LDI R24,0x83
0338 938000B2 STS 0xB2,R24
(0021) OCR2A = 0x7D;
033A E78D LDI R24,0x7D
033B 938000B3 STS 0xB3,R24
(0022) OCR2B = 0x00;
033D 922000B4 STS 0xB4,R2
(0023) TCCR2A = 0x00;
033F 922000B0 STS 0xB0,R2
(0024) TCCR2B = 0x04; //start
0341 E084 LDI R24,4
0342 938000B1 STS 0xB1,R24
0344 9508 RET
(0025) }
(0026)
(0027) // timebase module.
(0028) void time_mission (void)
(0029) {
(0030) static uchar Cnt100ms;
(0031) static uchar varcou;
(0032) static uint cnt500ms;
(0033) timeBase.bits.b1ms = 0;
_time_mission:
0345 91800138 LDS R24,timeBase
0347 7F8E ANDI R24,0xFE
0348 93800138 STS timeBase,R24
(0034) timeBase.bits.b10ms = 0;
034A 91800138 LDS R24,timeBase
034C 7F8B ANDI R24,0xFB
034D 93800138 STS timeBase,R24
(0035)
(0036) if(timeBase.bits.bt1ms)
034F 91800138 LDS R24,timeBase
0351 9586 LSR R24
0352 7081 ANDI R24,1
0353 F409 BNE 0x0355
0354 C044 RJMP 0x0399
(0037) {
(0038) //--------------------
(0039) // PORTC ^= 0x02;
(0040) // subled();
(0041) //-----------------------
(0042) timeBase.bits.bt1ms = 0;
0355 91800138 LDS R24,timeBase
0357 7F8D ANDI R24,0xFD
0358 93800138 STS timeBase,R24
(0043) timeBase.bits.b1ms = 1;
035A 91800138 LDS R24,timeBase
035C 6081 ORI R24,1
035D 93800138 STS timeBase,R24
(0044) if(receTimeOut>0)
035F 2422 CLR R2
0360 9030012C LDS R3,receTimeOut
0362 1423 CP R2,R3
0363 F470 BCC 0x0372
(0045) {
(0046) receTimeOut--;
0364 2D83 MOV R24,R3
0365 5081 SUBI R24,1
0366 9380012C STS receTimeOut,R24
(0047) if(receTimeOut==0 && receCount>0)
0368 2388 TST R24
0369 F441 BNE 0x0372
036A 9030012F LDS R3,receCount
036C 1423 CP R2,R3
036D F420 BCC 0x0372
(0048) {
(0049) receCount = 0;
036E 9220012F STS receCount,R2
(0050) checkoutError = 0;
0370 9220012D STS checkoutError,R2
(0051) }
(0052) } //if(receTimeOut>0)
(0053)
(0054) varcou++;
0372 91800133 LDS R24,varcou
0374 5F8F SUBI R24,0xFF
0375 93800133 STS varcou,R24
(0055) if(varcou>=5)
0377 3085 CPI R24,5
0378 F040 BCS 0x0381
(0056) {
(0057)
(0058) ledControl.bits.refurbish = 1;
0379 91800136 LDS R24,ledControl
037B 6082 ORI R24,2
037C 93800136 STS ledControl,R24
(0059) varcou = 0;
037E 2422 CLR R2
037F 92200133 STS varcou,R2
(0060) }
(0061)
(0062) cnt500ms++;
0381 91800134 LDS R24,cnt500ms
0383 91900135 LDS R25,cnt500ms+1
0385 9601 ADIW R24,1
0386 93900135 STS cnt500ms+1,R25
0388 93800134 STS cnt500ms,R24
(0063) if(cnt500ms>=200)
038A 3C88 CPI R24,0xC8
038B E0E0 LDI R30,0
038C 079E CPC R25,R30
038D F058 BCS 0x0399
(0064) {
(0065) cnt500ms = 0;
038E 2422 CLR R2
038F 2433 CLR R3
0390 92300135 STS cnt500ms+1,R3
0392 92200134 STS cnt500ms,R2
(0066) ledControl.bits.once128ms = 1;
0394 91800136 LDS R24,ledControl
0396 6081 ORI R24,1
0397 93800136 STS ledControl,R24
(0067) }
(0068) } //(timeBase.bits.bt1ms)
0399 9508 RET
FILE: D:\ICCTES~1\1128\led.c
(0001) //LED device
(0002) #include <iom48v.h>
(0003) #include <macros.h>
(0004) #include "main.h"
(0005) #include "modbus.h"
(0006) #include "timer2.h"
(0007)
(0008) static char aloneD[4];
(0009)
(0010) //led
(0011) void (*pcled[10])(void); //定义函数指针数组.
(0012) unsigned int LedShowLink;
(0013)
(0014) // PB0 PB1 PB2 PB3 PB4 PB5 PD6 PD7
(0015) // A B C D E F G dp
(0016) void light_0(void)
(0017) {
(0018) //0000'0011
(0019) PORTB &= 0xc0;
_light_0:
039A B185 IN R24,0x05
039B 7C80 ANDI R24,0xC0
039C B985 OUT 0x05,R24
(0020) PORTD |= 0x40;
039D 9A5E SBI 0x0B,6
039E 9508 RET
(0021) }
(0022)
(0023) void light_1(void)
(0024) { //0010'0101
(0025) PORTB &= 0b11111001;
_light_1:
039F B185 IN R24,0x05
03A0 7F89 ANDI R24,0xF9
03A1 B985 OUT 0x05,R24
(0026) PORTB |= 0b00111001;
03A2 B185 IN R24,0x05
03A3 6389 ORI R24,0x39
03A4 B985 OUT 0x05,R24
(0027) PORTD |= 0b01000000;
03A5 9A5E SBI 0x0B,6
03A6 9508 RET
(0028) }
(0029)
(0030) void light_2(void)
(0031) { //0010'0101
(0032) PORTB &= 0b11100100;
_light_2:
03A7 B185 IN R24,0x05
03A8 7E84 ANDI R24,0xE4
03A9 B985 OUT 0x05,R24
(0033) PORTB |= 0b00100100;
03AA B185 IN R24,0x05
03AB 6284 ORI R24,0x24
03AC B985 OUT 0x05,R24
(0034) PORTD &= 0b10111111;
03AD B18B IN R24,0x0B
03AE 7B8F ANDI R24,0xBF
03AF B98B OUT 0x0B,R24
03B0 9508 RET
(0035) }
(0036)
(0037) void light_3(void)
(0038) { //0000'1101
(0039) PORTB &= 0b11110000;
_light_3:
03B1 B185 IN R24,0x05
03B2 7F80 ANDI R24,0xF0
03B3 B985 OUT 0x05,R24
(0040) PORTB |= 0b00110000;
03B4 B185 IN R24,0x05
03B5 6380 ORI R24,0x30
03B6 B985 OUT 0x05,R24
(0041) PORTD &= 0b10111111;
03B7 B18B IN R24,0x0B
03B8 7B8F ANDI R24,0xBF
03B9 B98B OUT 0x0B,R24
03BA 9508 RET
(0042) }
(0043)
(0044) void light_4(void)
(0045) { //1001'1001
(0046) PORTB &= 0b11011001;
_light_4:
03BB B185 IN R24,0x05
03BC 7D89 ANDI R24,0xD9
03BD B985 OUT 0x05,R24
(0047) PORTB |= 0b00011001;
03BE B185 IN R24,0x05
03BF 6189 ORI R24,0x19
03C0 B985 OUT 0x05,R24
(0048) PORTD &= 0b10111111;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -