📄 main.lst
字号:
_sja_rx_service:
ptr --> R10
number --> R12
i --> R14
042B 940E06CA CALL push_gset5x
(0266) }
(0267)
(0268)
(0269) /********************************************************************
(0270) * 函数说明:SJA1000接受中断服务函数, *
(0271) * 输入:无 *
(0272) * 输出:正确读取返回TURE否则返回FALSE 。 *
(0273) * 影响变量:接受缓冲在正确读取时被刷新 *
(0274) ********************************************************************/
(0275) void sja_rx_service(void)
(0276) {
(0277) unsigned char number,i,ptr;
(0278) ptr=RXEFF;
042D E180 LDI R24,0x10
042E 2EA8 MOV R10,R24
(0279) if((sja_read_data(RXEFF)&0x40)==0x40) //如果RTR=1,为远程帧
042F E100 LDI R16,0x10
0430 DECF RCALL _sja_read_data
0431 2F80 MOV R24,R16
0432 7480 ANDI R24,0x40
0433 3480 CPI R24,0x40
0434 F421 BNE 0x0439
(0280) {
(0281) sja_write_data(CMR,0x04); //则释放接收缓冲
0435 E024 LDI R18,4
0436 E001 LDI R16,1
0437 DEB8 RCALL _sja_write_data
(0282) }
0438 C027 RJMP 0x0460
(0283) else //为0,则是数据帧
(0284) {
(0285) number=(sja_read_data(RXEFF)&0x0f);//取第一个字节的低四位,即数据长度
0439 E100 LDI R16,0x10
043A DEC5 RCALL _sja_read_data
043B 2F80 MOV R24,R16
043C 708F ANDI R24,0xF
043D 2EC8 MOV R12,R24
(0286) if (number>0x08)
043E E088 LDI R24,0x8
043F 158C CP R24,R12
0440 F408 BCC 0x0442
(0287) number=0x08;
0441 2EC8 MOV R12,R24
(0288) if ((sja_read_data(RXEFF))&0x80) //判断是标准帧还是扩展帧
0442 E100 LDI R16,0x10
0443 DEBC RCALL _sja_read_data
0444 FF07 SBRS R16,7
0445 C004 RJMP 0x044A
(0289) {
(0290) number=number+5; //扩展帧,则帧的总长度加5(13字节)
0446 2D8C MOV R24,R12
0447 5F8B SUBI R24,0xFB
0448 2EC8 MOV R12,R24
(0291) }
0449 C003 RJMP 0x044D
(0292) else
(0293) {
(0294) number=number+3; //标准帧,则帧的总长度加3(11字节)
044A 2D8C MOV R24,R12
044B 5F8D SUBI R24,0xFD
044C 2EC8 MOV R12,R24
(0295) }
(0296) for(i=0;i<number;i++) //读取数据
044D 24EE CLR R14
044E C00C RJMP 0x045B
(0297) {
(0298) RxBuffer[i]=sja_read_data(RXEFF+i);
044F 2D0E MOV R16,R14
0450 5F00 SUBI R16,0xF0
0451 DEAE RCALL _sja_read_data
0452 EA8C LDI R24,0xAC
0453 E090 LDI R25,0
0454 2DEE MOV R30,R14
0455 27FF CLR R31
0456 0FE8 ADD R30,R24
0457 1FF9 ADC R31,R25
0458 8300 STD Z+0,R16
(0299) ptr++;
0459 94A3 INC R10
045A 94E3 INC R14
045B 14EC CP R14,R12
045C F390 BCS 0x044F
(0300) }
(0301) sja_write_data(CMR,0x04); //最后释放FXFIFO
045D E024 LDI R18,4
045E E001 LDI R16,1
045F DE90 RCALL _sja_write_data
(0302) }
0460 940E06C0 CALL pop_gset5x
0462 9508 RET
_Search:
SearchStatus --> R10
0463 940E06C3 CALL push_gset3x
(0303) }
(0304)
(0305) /********************************************************************
(0306) * 函数说明:SJA1000查询方式接收函数, *
(0307) * 输入:无 *
(0308) * 输出:无 *
(0309) ********************************************************************/
(0310) void Search(void)
(0311) {
(0312) unsigned char SearchStatus;
(0313) SearchStatus=sja_read_data(SR); //读取状态寄存器
0465 E002 LDI R16,2
0466 DE99 RCALL _sja_read_data
0467 2EA0 MOV R10,R16
(0314) #ifdef DEBUG
(0315) rprintfStr("SR: ");
(0316) rprintfu08(SearchStatus);
(0317) rprintfCRLF();
(0318) #endif
(0319) // if((SearchStatus & 0x83)) //是否存在总线关闭、错误状态、数据溢出、有数据位等状态
(0320) // {
(0321) if(SearchStatus&(1<<7))//如果总线关闭
0468 FF07 SBRS R16,7
0469 C005 RJMP 0x046F
(0322) {
(0323) #ifdef DEBUG
(0324) rprintfStr("****bus shut off****");
(0325) rprintfCRLF();
(0326) #endif
(0327) sja_read_data(IR); //读取中断寄存器,清除中断位
046A E003 LDI R16,3
046B DE94 RCALL _sja_read_data
(0328) sja_write_data(MODE,0x08);
046C E028 LDI R18,0x8
046D 2700 CLR R16
046E DE81 RCALL _sja_write_data
(0329) }
(0330) if(SearchStatus&0x02)//如果有数据溢出
046F FEA1 SBRS R10,1
0470 C003 RJMP 0x0474
(0331) {
(0332) #ifdef DEBUG
(0333) rprintfStr("****data overflow****");
(0334) rprintfCRLF();
(0335) #endif
(0336) sja_write_data(CMR,0x0c); //在命令寄存器中清除数据溢出和释放接收缓冲区
0471 E02C LDI R18,0xC
0472 E001 LDI R16,1
0473 DE7C RCALL _sja_write_data
(0337) }
(0338) if(sja_read_data(IR) & 0x01)//IR.0=1,接收缓冲区有数据
0474 E003 LDI R16,3
0475 DE8A RCALL _sja_read_data
0476 FD00 SBRC R16,0
(0339) {
(0340) led_on;
0477 9897 CBI 0x12,7
(0341) #ifdef DEBUG
(0342) rprintfStr("****receive buffer have data****");
(0343) rprintfCRLF();
(0344) #endif
(0345) }
0478 940E06B1 CALL pop_gset3x
047A 9508 RET
_play_buffer:
i --> R10
ptr --> R12
047B 940E06C6 CALL push_gset4x
047D 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++)
047E 24AA CLR R10
047F C007 RJMP 0x0487
(0355) {
(0356) rprintfu08(*ptr);
0480 01F6 MOVW R30,R12
0481 8100 LDD R16,Z+0
0482 DCB1 RCALL _rprintfu08
(0357) // rprintfStr("--");
(0358) ptr++;
0483 01C6 MOVW R24,R12
0484 9601 ADIW R24,1
0485 016C MOVW R12,R24
0486 94A3 INC R10
0487 2D8A MOV R24,R10
0488 308D CPI R24,0xD
0489 F3B0 BCS 0x0480
(0359) }
(0360) rprintfCRLF();
048A DC94 RCALL _rprintfCRLF
048B 940E06BD CALL pop_gset4x
048D 9508 RET
(0361) }
(0362)
(0363) //=============================================================================
(0364) //初始化换冲区,在此监控卡上只有模拟管理系统降低充电电压的情况
(0365) void buffer_init(void)
(0366) {
(0367) TransmitMessage[0]=0x88; //扩展贞,8个数据字节
_buffer_init:
048E E888 LDI R24,0x88
048F 938000B9 STS TransmitMessage,R24
(0368)
(0369) TransmitMessage[1]=192; //管理系统优先级7: ID.28--ID.21=111-00-111
0491 EC80 LDI R24,0xC0
0492 938000BA STS TransmitMessage+1,R24
(0370) TransmitMessage[2]=168; //PF=255- 235 ID.20--ID.13=01011-000
0494 EA88 LDI R24,0xA8
0495 938000BB STS TransmitMessage+2,R24
(0371) TransmitMessage[3]=0x00; //PS=252- 22 ID.12--ID.5 =10110-000
0497 2422 CLR R2
0498 922000BC STS TransmitMessage+3,R2
(0372) TransmitMessage[4]=0x08; //As=0x11 ID.4--ID.0 =10001-000
049A E088 LDI R24,0x8
049B 938000BD STS 0xBD,R24
(0373)
(0374) TransmitMessage[5]=0xCC; //桢编号
049D EC8C LDI R24,0xCC
049E 938000BE STS 0xBE,R24
(0375)
(0376) TransmitMessage[6]=0x00;
04A0 922000BF STS 0xBF,R2
(0377) TransmitMessage[7]=0x01;
04A2 E081 LDI R24,1
04A3 938000C0 STS 0xC0,R24
(0378) TransmitMessage[8]=0xa1;
04A5 EA81 LDI R24,0xA1
04A6 938000C1 STS 0xC1,R24
(0379) TransmitMessage[9]=0xa2;
04A8 EA82 LDI R24,0xA2
04A9 938000C2 STS 0xC2,R24
(0380) TransmitMessage[10]=0xa3;
04AB EA83 LDI R24,0xA3
04AC 938000C3 STS 0xC3,R24
(0381) TransmitMessage[11]=0xa4;
04AE EA84 LDI R24,0xA4
04AF 938000C4 STS 0xC4,R24
(0382) TransmitMessage[12]=0xff;
04B1 EF8F LDI R24,0xFF
04B2 938000C5 STS 0xC5,R24
04B4 9508 RET
(0383) }
(0384)
(0385) void test_can(void)
(0386) {
(0387) rprintfCRLF();
_test_can:
04B5 DC69 RCALL _rprintfCRLF
(0388) rprintfStr("***CAN BUS DEBUG:***");
04B6 E905 LDI R16,0x95
04B7 E010 LDI R17,0
04B8 DC0A RCALL _rprintfStr
(0389) rprintfCRLF();
04B9 DC65 RCALL _rprintfCRLF
(0390)
(0391) rprintfStr("content of transmit buffer ");
04BA E709 LDI R16,0x79
04BB E010 LDI R17,0
04BC DC06 RCALL _rprintfStr
(0392) rprintfCRLF();
04BD DC61 RCALL _rprintfCRLF
(0393) play_buffer(TransmitMessage);
04BE EB09 LDI R16,0xB9
04BF E010 LDI R17,0
04C0 DFBA RCALL _play_buffer
(0394)
(0395) CLI();
04C1 94F8 BCLR 7
(0396) sja_tx(TransmitMessage);
04C2 EB09 LDI R16,0xB9
04C3 E010 LDI R17,0
04C4 DF01 RCALL _sja_tx
(0397) SEI();
04C5 9478 BSET 7
(0398) rprintfCRLF();
04C6 DC58 RCALL _rprintfCRLF
04C7 9508 RET
_RX_ISR:
i --> Y+1
sreg --> R10
comm_tempRec --> R12
04C8 940E0719 CALL push_lset
04CA 940E06C6 CALL push_gset4x
FILE: D:\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; //保存全局中断标志
04CC B6AF IN R10,0x3F
(0030) CLI();
04CD 94F8 BCLR 7
(0031)
(0032) comm_tempRec=UDR;
04CE B0CC IN R12,0x0C
(0033)
(0034) if(comm_tempRec==0xb0)//表示降电压
04CF 2D8C MOV R24,R12
04D0 3B80 CPI R24,0xB0
04D1 F429 BNE 0x04D7
(0035) {
(0036) uart_b0_flag=1;
04D2 E081 LDI R24,1
04D3 93800072 STS uart_b0_flag,R24
(0037) uartSendByte(comm_tempRec);
04D5 2D0C MOV R16,R12
04D6 D05D RCALL _uartSendByte
(0038) }
(0039) if(comm_tempRec==0xb8)//表示停止充电
04D7 2D8C MOV R24,R12
04D8 3B88 CPI R24,0xB8
04D9 F429 BNE 0x04DF
(0040) {
(0041) uart_b8_flag=1;
04DA E081 LDI R24,1
04DB 93800073 STS uart_b8_flag,R24
(0042) uartSendByte(0xb8);
04DD EB08 LDI R16,0xB8
04DE D055 RCALL _uartSendByte
(0043) }
(0044)
(0045) if(comm_tempRec==0xf0)//正常
04DF 2D8C MOV R24,R12
04E0 3F80 CPI R24,0xF0
04E1 F429 BNE 0x04E7
(0046) {
(0047) uart_normal_flag=1;
04E2 E081 LDI R24,1
04E3 93800074 STS uart_normal_flag,R24
(0048) uartSendByte(comm_tempRec);
04E5 2D0C MOV R16,R12
04E6 D04D RCALL _uartSendByte
(0049) }
(0050) if(comm_tempRec==0xa0)//报警
04E7 2D8C MOV R24,R12
04E8 3A80 CPI R24,0xA0
04E9 F429 BNE 0x04EF
(0051) {
(0052) uart_alarm_flag=1;
04EA E081 LDI R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -