📄 main.lst
字号:
0256 01FE MOVW R30,R28
0257 8020 LDD R2,Z+0
0258 8031 LDD R3,Z+1
0259 8042 LDD R4,Z+2
025A 8053 LDD R5,Z+3
025B 925A ST R5,-Y
025C 924A ST R4,-Y
025D 923A ST R3,-Y
025E 922A ST R2,-Y
025F E602 LDI R16,0x62
0260 E010 LDI R17,0
0261 940E0705 CALL lpm32
0263 933A ST R19,-Y
0264 932A ST R18,-Y
0265 931A ST R17,-Y
0266 930A ST R16,-Y
0267 940E08A7 CALL cmp32f
0269 F421 BNE 0x026E
026A E081 LDI R24,1
026B E090 LDI R25,0
026C 015C MOVW R10,R24
026D C002 RJMP 0x0270
026E 24AA CLR R10
026F 24BB CLR R11
0270 842C LDD R2,Y+12
0271 2433 CLR R3
0272 2C4E MOV R4,R14
0273 2455 CLR R5
0274 2842 OR R4,R2
0275 2853 OR R5,R3
0276 284A OR R4,R10
0277 285B OR R5,R11
0278 2044 TST R4
0279 F411 BNE 0x027C
027A 2055 TST R5
027B F039 BEQ 0x0283
(0190) {
(0191) firstplace = TRUE;
027C 2400 CLR R0
027D 9403 INC R0
027E 860C STD Y+12,R0
(0192) rprintfChar(digit+0x30);
027F 2D0E MOV R16,R14
0280 5D00 SUBI R16,0xD0
0281 DE34 RCALL _rprintfChar
(0193) }
0282 C002 RJMP 0x0285
(0194) else
(0195) rprintfChar(' ');
0283 E200 LDI R16,0x20
0284 DE31 RCALL _rprintfChar
(0196)
(0197) if(place == 1.0)
0285 01FE MOVW R30,R28
0286 8020 LDD R2,Z+0
0287 8031 LDD R3,Z+1
0288 8042 LDD R4,Z+2
0289 8053 LDD R5,Z+3
028A 925A ST R5,-Y
028B 924A ST R4,-Y
028C 923A ST R3,-Y
028D 922A ST R2,-Y
028E E602 LDI R16,0x62
028F E010 LDI R17,0
0290 940E0705 CALL lpm32
0292 933A ST R19,-Y
0293 932A ST R18,-Y
0294 931A ST R17,-Y
0295 930A ST R16,-Y
0296 940E08A7 CALL cmp32f
0298 F411 BNE 0x029B
(0198) {
(0199) rprintfChar('.');
0299 E20E LDI R16,0x2E
029A DE1B RCALL _rprintfChar
(0200) }
(0201)
(0202) x -= (digit*place);
029B 01FE MOVW R30,R28
029C 8825 LDD R2,Z+21
029D 8836 LDD R3,Z+22
029E 8847 LDD R4,Z+23
029F 8C50 LDD R5,Z+24
02A0 925A ST R5,-Y
02A1 924A ST R4,-Y
02A2 923A ST R3,-Y
02A3 922A ST R2,-Y
02A4 2D0E MOV R16,R14
02A5 2711 CLR R17
02A6 940E078F CALL int2fp
02A8 933A ST R19,-Y
02A9 932A ST R18,-Y
02AA 931A ST R17,-Y
02AB 930A ST R16,-Y
02AC 01FE MOVW R30,R28
02AD 8420 LDD R2,Z+8
02AE 8431 LDD R3,Z+9
02AF 8442 LDD R4,Z+10
02B0 8453 LDD R5,Z+11
02B1 925A ST R5,-Y
02B2 924A ST R4,-Y
02B3 923A ST R3,-Y
02B4 922A ST R2,-Y
02B5 940E08D8 CALL empy32fs
02B7 940E07F4 CALL sub32f
02B9 01FE MOVW R30,R28
02BA 8B05 STD Z+21,R16
02BB 8B16 STD Z+22,R17
02BC 8B27 STD Z+23,R18
02BD 8F30 STD Z+24,R19
(0203) place /= 10.0;
02BE 01FE MOVW R30,R28
02BF 8020 LDD R2,Z+0
02C0 8031 LDD R3,Z+1
02C1 8042 LDD R4,Z+2
02C2 8053 LDD R5,Z+3
02C3 925A ST R5,-Y
02C4 924A ST R4,-Y
02C5 923A ST R3,-Y
02C6 922A ST R2,-Y
02C7 E50A LDI R16,0x5A
02C8 E010 LDI R17,0
02C9 940E0705 CALL lpm32
02CB 933A ST R19,-Y
02CC 932A ST R18,-Y
02CD 931A ST R17,-Y
02CE 930A ST R16,-Y
02CF 940E084D CALL div32f
02D1 01FE MOVW R30,R28
02D2 8300 STD Z+0,R16
02D3 8311 STD Z+1,R17
02D4 8322 STD Z+2,R18
02D5 8333 STD Z+3,R19
02D6 94C3 INC R12
02D7 880B LDD R0,Y+19
02D8 14C0 CP R12,R0
02D9 F408 BCC 0x02DB
02DA CF2B RJMP 0x0206
02DB 962D ADIW R28,0xD
02DC 940E06C0 CALL pop_gset5x
02DE 9624 ADIW R28,4
02DF 9508 RET
FILE: D:\liliang\can-232\CAN-232\can.c
(0001) /********************************************************************
(0002) * 函数库说明:CAN总线驱动函数库 *
(0003) * 版本说明: 1.0 Bate *
(0004) * 作者: andylee *
(0005) * 日期: 2006年7月 *
(0006) * 平台: mega16 16M *
(0007) * 说明: 为上层提供CAN控制器的基本读写函数,数据发送、接受函数*
(0008) ********************************************************************/
(0009) #include "can.h"
(0010) #include "delay.h"
(0011)
(0012) //#define DEBUG
(0013) #define TransBuffer TransmitMessage
(0014) /*********************
(0015) * 全局变量定义 *
(0016) *********************/
(0017) //unsigned char CanMode[14];
(0018) unsigned char TransmitMessage[13];
(0019) unsigned char RxBuffer[13];
(0020) #ifdef DEBUG
(0021) unsigned char temp1;
(0022) #endif
(0023)
(0024) /********************************************************** **********
(0025) * 函数说明:CAN控制器引脚初始化 *
(0026) * 输入: *
(0027) * 输出:无 *
(0028) ********************************************************************/
(0029) void sja_port_init(void)
(0030) {
(0031) //CAN数据线设置
(0032) PORTC=0x00;
_sja_port_init:
02E0 2422 CLR R2
02E1 BA25 OUT 0x15,R2
(0033) DDRC=0xff;
02E2 EF8F LDI R24,0xFF
02E3 BB84 OUT 0x14,R24
(0034) PORTD=0b11000000; //INT引脚输入不上拉
02E4 EC80 LDI R24,0xC0
02E5 BB82 OUT 0x12,R24
(0035) DDRD =0b11111000;
02E6 EF88 LDI R24,0xF8
02E7 BB81 OUT 0x11,R24
(0036) //CAN 控制引脚设置
(0037) CAN_DDR|=(1<<WR)|(1<<RD)|(1<<ALE)|(1<<CS);
02E8 B38A IN R24,0x1A
02E9 6F80 ORI R24,0xF0
02EA BB8A OUT 0x1A,R24
(0038) WR_H;
02EB 9ADD SBI 0x1B,5
(0039) RD_H;
02EC 9ADE SBI 0x1B,6
(0040) ALE_L;
02ED 98DC CBI 0x1B,4
(0041) CS_H;
02EE 9ADF SBI 0x1B,7
02EF 9508 RET
(0042) }
(0043)
(0044) /********************************************************************
(0045) * 函数说明:模拟CAN收发时序,写一个字节到CAN控制器 *
(0046) * 输入:data,address *
(0047) * 输出:无 *
(0048) ********************************************************************/
(0049) void sja_write_data(unsigned char addr,unsigned char data)
(0050) {
(0051) RD_H;
_sja_write_data:
data --> R18
addr --> R16
02F0 9ADE SBI 0x1B,6
(0052) DDRC=0xFF; //总线设置为输出
02F1 EF8F LDI R24,0xFF
02F2 BB84 OUT 0x14,R24
(0053) // ALE_L;
(0054) PORTC=addr;
02F3 BB05 OUT 0x15,R16
(0055) ALE_H;
02F4 9ADC SBI 0x1B,4
(0056) NOP();
02F5 0000 NOP
(0057) ALE_L; //下降沿地址锁存
02F6 98DC CBI 0x1B,4
(0058) NOP();
02F7 0000 NOP
(0059)
(0060) PORTC=data;
02F8 BB25 OUT 0x15,R18
(0061) CS_L;
02F9 98DF CBI 0x1B,7
(0062) WR_L;
02FA 98DD CBI 0x1B,5
(0063) NOP();
02FB 0000 NOP
(0064) WR_H; //上升沿数据写入
02FC 9ADD SBI 0x1B,5
(0065) NOP();
02FD 0000 NOP
(0066) // ALE_H;
(0067) CS_H;
02FE 9ADF SBI 0x1B,7
02FF 9508 RET
_sja_read_data:
data --> R10
addr --> R16
0300 940E06C3 CALL push_gset3x
(0068) }
(0069)
(0070) /********************************************************************
(0071) * 函数说明:模拟CAN收发时序,从CAN控制器读一个字节 *
(0072) * 输入:address *
(0073) * 输出:data *
(0074) ********************************************************************/
(0075) unsigned char sja_read_data(unsigned char addr)
(0076) {
(0077) unsigned char data;
(0078) WR_H;
0302 9ADD SBI 0x1B,5
(0079) DDRC=0xFF; //总线设置为输出
0303 EF8F LDI R24,0xFF
0304 BB84 OUT 0x14,R24
(0080)
(0081) ALE_L;
0305 98DC CBI 0x1B,4
(0082) PORTC=addr;
0306 BB05 OUT 0x15,R16
(0083) ALE_H;
0307 9ADC SBI 0x1B,4
(0084) NOP();
0308 0000 NOP
(0085) ALE_L; //地址锁存
0309 98DC CBI 0x1B,4
(0086) NOP();
030A 0000 NOP
(0087)
(0088) PORTC=0xFF;
030B BB85 OUT 0x15,R24
(0089) DDRC=0x00; //总线设置为输入,内部上拉
030C 2422 CLR R2
030D BA24 OUT 0x14,R2
(0090) CS_L;
030E 98DF CBI 0x1B,7
(0091) RD_L;
030F 98DE CBI 0x1B,6
(0092) NOP();
0310 0000 NOP
(0093) RD_H;
0311 9ADE SBI 0x1B,6
(0094) NOP();
0312 0000 NOP
(0095) data=PINC;
0313 B2A3 IN R10,0x13
(0096) CS_H;
0314 9ADF SBI 0x1B,7
(0097) return data;
0315 2D0A MOV R16,R10
0316 940E06B1 CALL pop_gset3x
0318 9508 RET
(0098) }
(0099)
(0100) /********************************************************************
(0101) * 函数说明:初始化SJA1000的相关寄存器:设置工作模式,波特率,验收码*
(0102) * 输入:无 *
(0103) * 输出:无 *
(0104) ********************************************************************/
(0105) void sja_init(void)
(0106) {
(0107) unsigned char temp;
(0108) unsigned int k ;
(0109)
(0110) CLI();
_sja_init:
k --> Y+1
temp --> Y+1
0319 94F8 BCLR 7
(0111) sja_write_data(MODE,0x09); //单个验收滤波,复位模式
031A E029 LDI R18,0x9
031B 2700 CLR R16
031C DFD3 RCALL _sja_write_data
(0112)
(0113) sja_read_data(IR); //读取CAN的中断标识,除接受中断外的所有中断复位
031D E003 LDI R16,3
031E DFE1 RCALL _sja_read_data
031F C003 RJMP 0x0323
(0114)
(0115) while(!( sja_read_data(MODE)&0x01)) //检测SJA1000是否达到复位工作模式
(0116) {
(0117) sja_write_data(MODE,0x09); //进入复位工作模式
0320 E029 LDI R18,0x9
0321 2700 CLR R16
0322 DFCD RCALL _sja_write_data
0323 2700 CLR R16
0324 DFDB RCALL _sja_read_data
0325 FF00 SBRS R16,0
0326 CFF9 RJMP 0x0320
(0118) }
(0119) delay_nus(5); //延时约5us
0327 E005 LDI R16,5
0328 E010 LDI R17,0
0329 DD5D RCALL _delay_nus
(0120) sja_write_data(CDR,REG_CDR_DATA); //PeliCAN 模式,旁路输入比较器,禁能CLOCKOUT引脚
032A E828 LDI R18,0x88
032B E10F LDI R16,0x1F
032C DFC3 RCALL _sja_write_data
(0121) delay_nus(5); //延时约5us
032D E005 LDI R16,5
032E E010 LDI R17,0
032F DD57 RCALL _delay_nus
(0122)
(0123) sja_write_data(BTR0,BTR0_Rate_250k); //同步跳转宽度4;时钟4分频,波特率250Kb/s
0330 E021 LDI R18,1
0331 E006 LDI R16,6
0332 DFBD RCALL _sja_write_data
(0124) sja_write_data(BTR1,BTR1_Rate_250k); //采样3次;时间段1,2=10,5
0333 E12C LDI R18,0x1C
0334 E007 LDI R16,7
0335 DFBA RCALL _sja_write_data
(0125)
(0126) sja_write_data(OCR,REG_OCR_DATA); //输出控制,推拉结构,正逻辑
0336 E12A LDI R18,0x1A
0337 E008 LDI R16,0x8
0338 DFB7 RCALL _sja_write_data
(0127)
(0128) sja_write_data(RXERR,0x00); //收发错误寄存器清零
0339 2722 CLR R18
033A E00E LDI R16,0xE
033B DFB4 RCALL _sja_write_data
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -