📄 canmonitor.lst
字号:
3D3 C005 RJMP 0x03D9
(0322) {
(0323) #ifdef DEBUG
(0324) rprintfStr("****bus shut off****");
(0325) rprintfCRLF();
(0326) #endif
(0327) sja_read_data(IR); //读取中断寄存器,清除中断位
3D4 E003 LDI R16,3
3D5 DE93 RCALL _sja_read_data
(0328) sja_write_data(MODE,0x08);
3D6 E028 LDI R18,0x8
3D7 2700 CLR R16
3D8 DE80 RCALL _sja_write_data
(0329) }
(0330) if(SearchStatus&0x02)//如果有数据溢出
3D9 FEA1 SBRS R10,1
3DA C003 RJMP 0x03DE
(0331) {
(0332) #ifdef DEBUG
(0333) rprintfStr("****data overflow****");
(0334) rprintfCRLF();
(0335) #endif
(0336) sja_write_data(CMR,0x0c); //在命令寄存器中清除数据溢出和释放接收缓冲区
3DB E02C LDI R18,0xC
3DC E001 LDI R16,1
3DD DE7B RCALL _sja_write_data
(0337) }
(0338) if(sja_read_data(IR) & 0x01)//IR.0=1,接收缓冲区有数据
3DE E003 LDI R16,3
3DF DE89 RCALL _sja_read_data
3E0 FF00 SBRS R16,0
3E1 C001 RJMP 0x03E3
(0339) {
(0340) led_on;
3E2 9897 CBI 0x12,7
(0341) #ifdef DEBUG
(0342) rprintfStr("****receive buffer have data****");
(0343) rprintfCRLF();
(0344) #endif
(0345) }
3E3 90A9 LD R10,Y+
3E4 9508 RET
_play_buffer:
i --> R10
ptr --> R12
3E5 940E 0671 CALL push_xgset003C
3E7 0168 MOVW R12,R16
(0346) // }
(0347) }
(0348)
(0349) //=============================================================================
(0350) //显示缓冲区内容
(0351) void play_buffer(unsigned char *ptr)
(0352) {
(0353) unsigned char i;
(0354) for (i=0;i<13;i++)
3E8 24AA CLR R10
3E9 C007 RJMP 0x03F1
(0355) {
(0356) rprintfu08(*ptr);
3EA 01F6 MOVW R30,R12
3EB 8100 LDD R16,Z+0
3EC DD39 RCALL _rprintfu08
(0357) // rprintfStr("--");
(0358) ptr++;
3ED 01C6 MOVW R24,R12
3EE 9601 ADIW R24,1
3EF 016C MOVW R12,R24
3F0 94A3 INC R10
3F1 2D8A MOV R24,R10
3F2 308D CPI R24,0xD
3F3 F3B0 BCS 0x03EA
(0359) }
(0360) rprintfCRLF();
3F4 DD1E RCALL _rprintfCRLF
3F5 940C 065F JMP pop_xgset003C
(0361) }
(0362)
(0363) //=============================================================================
(0364) //初始化换冲区,在此监控卡上只有模拟管理系统降低充电电压的情况
(0365) void buffer_init(void)
(0366) {
(0367) TransmitMessage[0]=0x88; //扩展贞,8个数据字节
_buffer_init:
3F7 E888 LDI R24,0x88
3F8 9380 00B9 STS TransmitMessage,R24
(0368)
(0369) TransmitMessage[1]=0xe7; //管理系统优先级7: ID.28--ID.21=111-00-111
3FA EE87 LDI R24,0xE7
3FB 9380 00BA STS TransmitMessage+1,R24
(0370) TransmitMessage[2]=0x58; //PF=255- 235 ID.20--ID.13=01011-000
3FD E588 LDI R24,0x58
3FE 9380 00BB STS TransmitMessage+2,R24
(0371) TransmitMessage[3]=0xb0; //PS=252- 22 ID.12--ID.5 =10110-000
400 EB80 LDI R24,0xB0
401 9380 00BC STS TransmitMessage+3,R24
(0372) TransmitMessage[4]=0x88; //As=0x11 ID.4--ID.0 =10001-000
403 E888 LDI R24,0x88
404 9380 00BD STS 0x00BD,R24
(0373)
(0374) TransmitMessage[5]=0xFF; //桢编号
406 EF8F LDI R24,0xFF
407 9380 00BE STS 0x00BE,R24
(0375)
(0376) TransmitMessage[6]=0x00;
409 2422 CLR R2
40A 9220 00BF STS 0x00BF,R2
(0377) TransmitMessage[7]=0xff;
40C 9380 00C0 STS 0x00C0,R24
(0378) TransmitMessage[8]=0xff;
40E 9380 00C1 STS 0x00C1,R24
(0379) TransmitMessage[9]=0xff;
410 9380 00C2 STS 0x00C2,R24
(0380) TransmitMessage[10]=0xff;
412 9380 00C3 STS 0x00C3,R24
(0381) TransmitMessage[11]=0xff;
414 9380 00C4 STS 0x00C4,R24
(0382) TransmitMessage[12]=0xff;
416 9380 00C5 STS 0x00C5,R24
418 9508 RET
(0383) }
(0384)
(0385) void test_can(void)
(0386) {
(0387) rprintfCRLF();
_test_can:
419 DCF9 RCALL _rprintfCRLF
(0388) rprintfStr("***CAN BUS DEBUG:***");
41A E905 LDI R16,0x95
41B E010 LDI R17,0
41C DCA0 RCALL _rprintfStr
(0389) rprintfCRLF();
41D DCF5 RCALL _rprintfCRLF
(0390)
(0391) rprintfStr("content of transmit buffer ");
41E E709 LDI R16,0x79
41F E010 LDI R17,0
420 DC9C RCALL _rprintfStr
(0392) rprintfCRLF();
421 DCF1 RCALL _rprintfCRLF
(0393) play_buffer(TransmitMessage);
422 EB09 LDI R16,0xB9
423 E010 LDI R17,0
424 DFC0 RCALL _play_buffer
(0394)
(0395) CLI();
425 94F8 BCLR 7
(0396) sja_tx(TransmitMessage);
426 EB09 LDI R16,0xB9
427 E010 LDI R17,0
428 DF03 RCALL _sja_tx
(0397) SEI();
429 9478 BSET 7
(0398) rprintfCRLF();
42A DCE8 RCALL _rprintfCRLF
42B 9508 RET
_RX_ISR:
i --> Y,+1
sreg --> R10
comm_tempRec --> R12
42C 920A ST R0,-Y
42D 921A ST R1,-Y
42E 922A ST R2,-Y
42F 923A ST R3,-Y
430 924A ST R4,-Y
431 925A ST R5,-Y
432 926A ST R6,-Y
433 927A ST R7,-Y
434 928A ST R8,-Y
435 929A ST R9,-Y
436 930A ST R16,-Y
437 931A ST R17,-Y
438 932A ST R18,-Y
439 933A ST R19,-Y
43A 938A ST R24,-Y
43B 939A ST R25,-Y
43C 93AA ST R26,-Y
43D 93BA ST R27,-Y
43E 93EA ST R30,-Y
43F 93FA ST R31,-Y
440 B60F IN R0,0x3F
441 920A ST R0,-Y
442 92AA ST R10,-Y
443 92CA ST R12,-Y
FILE: E:\li\liliang\can-232\CAN-232\uart.c
(0001) /********************************************************************
(0002) * 函数库说明:RS232总线驱动函数库 *
(0003) * 版本说明: 1.0 Bate *
(0004) * 作者: andylee *
(0005) * 日期: 2006年7月 *
(0006) * 平台: mega16 16M *
(0007) * 说明: 为上层提供RS232的基本读写函数 *
(0008) ********************************************************************/
(0009) #include "uart.h"
(0010) #include "can.h"
(0011)
(0012) unsigned char uart_b0_flag=0; //降压标志
(0013) unsigned char uart_b8_flag=0; //停止充电标志
(0014) unsigned char uart_normal_flag=0; //正常
(0015) unsigned char uart_alarm_flag=0; //报警
(0016)
(0017) /*************************************
(0018) * 函数说明:串口接收中断 *
(0019) * 输入:无 *
(0020) * 输出:无 *
(0021) ************************************/
(0022) #pragma interrupt_handler RX_ISR:12
(0023) void RX_ISR(void)
(0024) {
(0025) unsigned char sreg;
(0026) unsigned char comm_tempRec;
(0027) unsigned int i;
(0028)
(0029) sreg=SREG; //保存全局中断标志
444 B6AF IN R10,0x3F
(0030) CLI();
445 94F8 BCLR 7
(0031)
(0032) comm_tempRec=UDR;
446 B0CC IN R12,0x0C
(0033)
(0034) if(comm_tempRec==0xb0)//表示降电压
447 2D8C MOV R24,R12
448 3B80 CPI R24,0xB0
449 F429 BNE 0x044F
(0035) {
(0036) uart_b0_flag=1;
44A E081 LDI R24,1
44B 9380 0072 STS uart_b0_flag,R24
(0037) uartSendByte(comm_tempRec);
44D 2D0C MOV R16,R12
44E D070 RCALL _uartSendByte
(0038) }
(0039) if(comm_tempRec==0xb8)//表示停止充电
44F 2D8C MOV R24,R12
450 3B88 CPI R24,0xB8
451 F429 BNE 0x0457
(0040) {
(0041) uart_b8_flag=1;
452 E081 LDI R24,1
453 9380 0073 STS uart_b8_flag,R24
(0042) uartSendByte(0xb8);
455 EB08 LDI R16,0xB8
456 D068 RCALL _uartSendByte
(0043) }
(0044)
(0045) if(comm_tempRec==0xf0)//正常
457 2D8C MOV R24,R12
458 3F80 CPI R24,0xF0
459 F429 BNE 0x045F
(0046) {
(0047) uart_normal_flag=1;
45A E081 LDI R24,1
45B 9380 0074 STS uart_normal_flag,R24
(0048) uartSendByte(comm_tempRec);
45D 2D0C MOV R16,R12
45E D060 RCALL _uartSendByte
(0049) }
(0050) if(comm_tempRec==0xa0)//报警
45F 2D8C MOV R24,R12
460 3A80 CPI R24,0xA0
461 F429 BNE 0x0467
(0051) {
(0052) uart_alarm_flag=1;
462 E081 LDI R24,1
463 9380 0075 STS uart_alarm_flag,R24
(0053) uartSendByte(comm_tempRec);
465 2D0C MOV R16,R12
466 D058 RCALL _uartSendByte
(0054) }
(0055)
(0056) SREG=sreg;
467 BEAF OUT 0x3F,R10
(0057) SEI();
468 9478 BSET 7
469 90C9 LD R12,Y+
46A 90A9 LD R10,Y+
46B 9009 LD R0,Y+
46C BE0F OUT 0x3F,R0
46D 91F9 LD R31,Y+
46E 91E9 LD R30,Y+
46F 91B9 LD R27,Y+
470 91A9 LD R26,Y+
471 9199 LD R25,Y+
472 9189 LD R24,Y+
473 9139 LD R19,Y+
474 9129 LD R18,Y+
475 9119 LD R17,Y+
476 9109 LD R16,Y+
477 9099 LD R9,Y+
478 9089 LD R8,Y+
479 9079 LD R7,Y+
47A 9069 LD R6,Y+
47B 9059 LD R5,Y+
47C 9049 LD R4,Y+
47D 9039 LD R3,Y+
47E 9029 LD R2,Y+
47F 9019 LD R1,Y+
480 9009 LD R0,Y+
481 9518 RETI
_uartSetBaudRate:
baudratDiv --> R10
baudrate --> Y,+2
482 940E 05BC CALL push_arg4
484 92AA ST R10,-Y
485 92BA ST R11,-Y
(0058) }
(0059)
(0060) /*************************************
(0061) * 函数说明:波特率设置函数 *
(0062) * 输入:波特率 *
(0063) * 输出:无 *
(0064) *************************************/
(0065) void uartSetBaudRate(unsigned long baudrate)
(0066) {
(0067) unsigned int baudratDiv;
(0068)
(0069) baudratDiv = (F_CPU/(baudrate*16L)-1);
486 802A LDD R2,Y+2
487 803B LDD R3,Y+3
488 804C LDD R4,Y+4
489 805D LDD R5,Y+5
48A E180 LDI R24,0x10
48B E090 LDI R25,0
48C E0A0 LDI R26,0
48D E0B0 LDI R27,0
48E 925A ST R5,-Y
48F 924A ST R4,-Y
490 923A ST R3,-Y
491 922A ST R2,-Y
492 018C MOVW R16,R24
493 019D MOVW R18,R26
494 940E 062B CALL empy32s
496 E080 LDI R24,0
497 E294 LDI R25,0x24
498 EFA4 LDI R26,0xF4
499 E0B0 LDI R27,0
49A 933A ST R19,-Y
49B 932A ST R18,-Y
49C 931A ST R17,-Y
49D 930A ST R16,-Y
49E 018C MOVW R16,R24
49F 019D MOVW R18,R26
4A0 940E 05C1 CALL div32u
4A2 0118 MOVW R2,R16
4A3 0129 MOVW R4,R18
4A4 E081 LDI R24,1
4A5 E090 LDI R25,0
4A6 E0A0 LDI R26,0
4A7 E0B0 LDI R27,0
4A8 1A28 SUB R2,R24
4A9 0A39 SBC R3,R25
4AA 0A4A SBC R4,R26
4AB 0A5B SBC R5,R27
4AC 0151 MOVW R10,R2
(0070)
(0071) UBRRH=(unsigned char)(baudratDiv>>8);
4AD 2C23 MOV R2,R3
4AE 2433 CLR R3
4AF BC20 OUT 0x20,R2
(0072) UBRRL=(unsigned char)baudratDiv;
4B0 B8A9 OUT 0x09,R10
4B1 90B9 LD R11,Y+
4B2 90A9 LD R10,Y+
4B3 9624 ADIW R28,4
4B4 9508 RET
(0073) }
(0074)
(0075) /*************************************
(0076) * 函数说明
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -