📄 communication.s
字号:
L322:
.dbline 618
ldd R24,y+13
cpi R24,33
brlo L319
.dbline 621
; det_link[k]=EEPROM_read(0x0090+k) ;
; //以下是为了显示屏蔽灯而编写的程序段
; gal3data|=0x22; //关闭两个屏蔽灯
lds R24,_gal3data
ori R24,34
sts _gal3data,R24
.dbline 622
; GAL3ADDR=gal3data;
mov R2,R24
sts 12288,R2
.dbline 623
; for(fl=1;fl<=32;fl++) //32个转换器 fu le
ldi R24,1
sts _fl,R24
xjmp L326
L323:
.dbline 624
; {
.dbline 625
; wdr();
xcall _wdr
.dbline 626
; if((gal3data|0xdd)==0xdd) //两个屏蔽灯都亮
lds R24,_gal3data
ori R24,221
cpi R24,221
brne L327
.dbline 627
; break;
xjmp L325
L327:
.dbline 628
; temp1=(fl-1)%8; //余数
ldi R17,8
lds R16,_fl
subi R16,1
xcall mod8u
std y+22,R16
.dbline 629
; temp2=(fl-1)/8; //商
lds R20,_fl
subi R20,1
lsr R20
lsr R20
lsr R20
.dbline 630
; if((xuanbit2[temp1]&canuse[temp2])==0) //表示对应的转换器投用
ldi R24,<_canuse
ldi R25,>_canuse
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
movw R24,R28
adiw R24,5
mov R30,R16
clr R31
add R30,R24
adc R31,R25
ldd R3,z+0
and R3,R2
breq X4
xjmp L329
X4:
.dbline 631
; {
.dbline 632
; for(i=1;i<=8;i++) //前8号节点
clr R0
inc R0
std y+14,R0
xjmp L334
L331:
.dbline 633
; {
.dbline 634
; temp3=(i-1)%8; //余数
ldi R17,8
ldd R16,y+14
subi R16,1
xcall mod8u
mov R22,R16
.dbline 635
; temp4=(i-1)/8; //商
ldd R24,y+14
subi R24,1
mov R10,R24
lsr R10
lsr R10
lsr R10
.dbline 636
; temp5=i%8; //余数
ldi R17,8
ldd R16,y+14
xcall mod8u
mov R12,R16
.dbline 637
; temp6=i/8; //商
ldd R14,y+14
lsr R14
lsr R14
lsr R14
.dbline 638
; if(((detuse[fl][temp4]& xuanbit2[temp3])!=0)&&((detuse[fl][temp6]&xuanbit2[temp5])==0)) //该节点不投用下个节点投用
lds R2,_fl
ldi R24,4
mul R24,R2
movw R2,R0
ldi R24,<_detuse
ldi R25,>_detuse
add R2,R24
adc R3,R25
movw R24,R28
adiw R24,5
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R4,z+0
mov R30,R10
clr R31
add R30,R2
adc R31,R3
ldd R5,z+0
and R5,R4
brne X5
xjmp L335
X5:
movw R24,R28
adiw R24,5
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R4,z+0
mov R30,R14
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
and R2,R4
breq X6
xjmp L335
X6:
.dbline 639
; {
.dbline 641
; //读取外部ram中的标志字节
; addrxy=(uint)(fl*256)+(i-1)*8; //探测器和节点对应的RAM地址
ldi R24,8
ldd R0,y+14
mul R24,R0
movw R24,R0
sbiw R24,8
lds R18,_fl
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
movw R2,R16
add R2,R24
adc R3,R25
std y+19,R3
std y+18,R2
.dbline 642
; addrxyh=(uchar)(((addrxy&0xff00)>>8)); //高址
movw R24,R2
andi R24,0
mov R24,R25
clr R25
std y+20,R24
.dbline 643
; addrxyl=(uchar)(addrxy&0x00ff); //低址
ldd R24,y+18
ldd R25,y+19
andi R25,0
std y+21,R24
.dbline 644
; EIMSK&=~(1<<INT6);
in R24,0x39
andi R24,191
out 0x39,R24
.dbline 645
; fhz=I2cRead(SLA1_W,SLA1_R, addrxyh,addrxyl,1); //读出
ldi R24,1
std y+4,R24
ldd R0,y+21
std y+2,R0
ldd R0,y+20
std y+0,R0
ldi R18,161
ldi R16,160
xcall _I2cRead
sts _fhz,R16
.dbline 646
; k=i2c_rd_buff[0]; //转移命令
lds R2,_i2c_rd_buff
std y+13,R2
.dbline 647
; EIMSK|=(1<<INT6);
in R24,0x39
ori R24,64
out 0x39,R24
.dbline 648
; if(k==0x55) //探测器屏蔽
mov R24,R2
cpi R24,85
brne L337
.dbline 649
; {
.dbline 650
; gal3data&=0xfd; //探测器屏蔽灯亮
lds R24,_gal3data
andi R24,253
sts _gal3data,R24
.dbline 651
; GAL3ADDR=gal3data;
mov R2,R24
sts 12288,R2
.dbline 652
; }
xjmp L338
L337:
.dbline 653
; else if(k==0xa9) //联动
ldd R24,y+13
cpi R24,169
brne L339
.dbline 654
; {
.dbline 655
; gal3data&=0xdf; //联动屏蔽灯亮
lds R24,_gal3data
andi R24,223
sts _gal3data,R24
.dbline 656
; GAL3ADDR=gal3data; //
mov R2,R24
sts 12288,R2
.dbline 657
; }
L339:
L338:
.dbline 658
; }
L335:
.dbline 659
L332:
.dbline 632
ldd R0,y+14
inc R0
std y+14,R0
L334:
.dbline 632
ldi R24,8
ldd R0,y+14
cp R24,R0
brlo X7
xjmp L331
X7:
.dbline 660
; }
; for(i=9;i<=31;i++) //9-32
ldi R24,9
std y+14,R24
xjmp L344
L341:
.dbline 661
; {
.dbline 662
; temp3=(i-1)%8; //余数
ldi R17,8
ldd R16,y+14
subi R16,1
xcall mod8u
mov R22,R16
.dbline 663
; temp4=(i-1)/8; //商
ldd R24,y+14
subi R24,1
mov R10,R24
lsr R10
lsr R10
lsr R10
.dbline 664
; temp5=i%8; //余数
ldi R17,8
ldd R16,y+14
xcall mod8u
mov R12,R16
.dbline 665
; temp6=i/8; //商
ldd R14,y+14
lsr R14
lsr R14
lsr R14
.dbline 666
; if(((detuse[fl][temp4]& xuanbit2[temp3])!=0)&&((detuse[fl][temp6]&xuanbit2[temp5])==0)) //该节点不投用下个节点投用
lds R2,_fl
ldi R24,4
mul R24,R2
movw R2,R0
ldi R24,<_detuse
ldi R25,>_detuse
add R2,R24
adc R3,R25
movw R24,R28
adiw R24,5
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R4,z+0
mov R30,R10
clr R31
add R30,R2
adc R31,R3
ldd R5,z+0
and R5,R4
breq L345
movw R24,R28
adiw R24,5
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R4,z+0
mov R30,R14
clr R31
add R30,R2
adc R31,R3
ldd R2,z+0
and R2,R4
brne L345
.dbline 667
; {
.dbline 668
; gal3data&=0xfd; //探测器屏蔽灯亮
lds R24,_gal3data
andi R24,253
sts _gal3data,R24
.dbline 669
; GAL3ADDR=gal3data;
mov R2,R24
sts 12288,R2
.dbline 670
; break;
xjmp L343
L345:
.dbline 672
L342:
.dbline 660
ldd R0,y+14
inc R0
std y+14,R0
L344:
.dbline 660
ldi R24,31
ldd R0,y+14
cp R24,R0
brlo X8
xjmp L341
X8:
L343:
.dbline 673
; }
; }
; }
L329:
.dbline 674
L324:
.dbline 623
lds R24,_fl
subi R24,255 ; addi 1
sts _fl,R24
L326:
.dbline 623
ldi R24,32
lds R2,_fl
cp R24,R2
brlo X9
xjmp L323
X9:
L325:
.dbline -2
L274:
adiw R28,23
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r temp2 20 c
.dbsym l temp1 22 c
.dbsym l addrxyl 21 c
.dbsym l addrxyh 20 c
.dbsym l addrxy 18 i
.dbsym l t 16 i
.dbsym r temp6 14 c
.dbsym r temp5 12 c
.dbsym r temp4 10 c
.dbsym r temp3 22 c
.dbsym l xuanbit2 5 A[8:8]c
.dbsym l j 15 c
.dbsym l i 14 c
.dbsym l k 13 c
.dbend
.area lit(rom, con, rel)
L348:
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.byte 0,0
.area text(rom, con, rel)
.dbfile F:\AVR\zhulast\communication.c
.dbfunc e conv_auto_search _conv_auto_search fV
; tem2 -> R10
; tem1 -> R10
; tempbuf -> y+0
; i -> R22
; t -> R20,R21
.even
_conv_auto_search::
xcall push_gset3
sbiw R28,10
.dbline -1
.dbline 679
; }
; }
;
; //转换器自动搜索
; void conv_auto_search(void)
; {
.dbline 680
; uchar i=0; uint t=0;
clr R22
.dbline 680
clr R20
clr R21
.dbline 681
; uchar tempbuf[10]={0,0,0,0,0,0,0,0,0,0};
ldi R24,<L348
ldi R25,>L348
movw R30,R28
ldi R16,10
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
xcall asgncblk
.dbline 682
; uchar tem1=0,tem2=0;
clr R10
.dbline 682
.dbline 683
; EEPROM_write(0x0008,0xff);
ldi R18,255
ldi R16,8
ldi R17,0
xcall _EEPROM_write
.dbline 684
; EEPROM_write(0x0009,0xff);
ldi R18,255
ldi R16,9
ldi R17,0
xcall _EEPROM_write
.dbline 685
; EEPROM_write(0x000a,0xff);
ldi R18,255
ldi R16,10
ldi R17,0
xcall _EEPROM_write
.dbline 686
; EEPROM_write(0x000b,0xff);
ldi R18,255
ldi R16,11
ldi R17,0
xcall _EEPROM_write
.dbline 687
; for(i=0;i<32;i++)
xjmp L352
L349:
.dbline 688
ldi R24,<_can_cuo_flag
ldi R25,>_can_cuo_flag
mov R30,R22
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
L350:
.dbline 687
inc R22
L352:
.dbline 687
cpi R22,32
brlo L349
.dbline 689
; can_cuo_flag[i]=0;
; for(nnn=1;nnn<=32;nnn++)
ldi R24,1
sts _nnn,R24
xjmp L356
L353:
.dbline 690
; {
.dbline 691
; write_MCP(TXB0SIDH,nnn); //接收方的地址
lds R18,_nnn
ldi R16,49
xcall _write_MCP
.dbline 692
; write_MCP(TXB0SIDL,0x08); //扩展帧格式
ldi R18,8
ldi R16,50
xcall _write_MCP
.dbline 693
; write_MCP(TXB0EID8,0x00); //标识发送方地址
clr R18
ldi R16,51
xcall _write_MCP
.dbline 694
; write_MCP(TXB0EID0,0x00); //485节点地址
clr R18
ldi R16,52
xcall _write_MCP
.dbline 695
; write_MCP(TXB0DLC, 8); //发送8个字节
ldi R18,8
ldi R16,53
xcall _write_MCP
.dbline 696
; write_MCP(TXB0D0, 0xaa); //命令字节1
ldi R18,170
ldi R16,54
xcall _write_MCP
.dbline 697
; write_MCP(TXB0D1, 0xbb); //命令字节2
ldi R18,187
ldi R16,55
xcall _write_MCP
.dbline 698
; write_MCP(TXB0D2, 0x00);
clr R18
ldi R16,56
xcall _write_MCP
.dbline 699
; write_MCP(TXB0D3, 0x00);
clr R18
ldi R16,57
xcall _write_MCP
.dbline 700
; write_MCP(TXB0D4, 0x00);
clr R18
ldi R16,58
xcall _write_MCP
.dbline 701
; write_MCP(TXB0D5, 0x00);
clr R18
ldi R16,59
xcall _write_MCP
.dbline 702
; write_MCP(TXB0D6, 0x00);
clr R18
ldi R16,60
xcall _write_MCP
.dbline 703
; write_MCP(TXB0D7, 0x00);
clr R18
ldi R16,61
xcall _write_MCP
.dbline 704
; mcu_ok(1);
ldi R16,1
xcall _mcu_ok
.dbline 705
; wdr();
xcall _wdr
.dbline 706
; EIMSK&=~(1<<INT6) ;
in R24,0x39
andi R24,191
out 0x39,R24
.dbline 707
; UCSR1B&=~(1<<RXCIE1);
lds R24,154
andi R24,127
sts 154,R24
.dbline 708
; send_box_0(); //发送
xcall _send_box_0
.dbline 709
; delay_nms(5);
ldi R16,5
ldi R17,0
xcall _delay_nms
xjmp L358
L357:
.dbline 711
; while(zhongbuff[0][2]!=0xbd) //一直等待
; {
.dbline 712
; t++;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 713
; if(t>10000)
ldi R24,10000
ldi R25,39
cp R24,R20
cpc R25,R21
brsh L361
.dbline 714
; {
.dbline 715
; t=0;
clr R20
clr R21
.dbline 716
; break;
xjmp L359
L361:
.dbline 718
L358:
.dbline 710
lds R24,_zhongbuff+2
cpi R24,189
brne L357
L359:
.dbline 719
; }
; }
; t=0;
clr R20
clr R21
.dbline 720
; mcu_ok(0);
clr R16
xcall _mcu_ok
.dbline 721
; if(zhongbuff[0][2]==0xbd) //正确返回时
lds R24,_zhongbuff+2
cpi R24,189
brne L363
.dbline 722
; {
.dbline 723
; save1(0x0008 ,nnn);
lds R18,_nnn
ldi R16,8
ldi R17,0
xcall _save1
.dbline 724
; }
L363:
.dbline 725
clr R2
sts _zhongbuff+2,R2
.dbline 726
in R24,0x39
ori R24,64
out 0x39,R24
.dbline 727
lds R24,154
ori R24,128
sts 154,R24
.dbline 728
ldi R16,3
ldi R17,0
xcall _delay_nms
.dbline 729
L354:
.dbline 689
lds R24,_nnn
subi R24,255 ; addi 1
sts _nnn,R24
L356:
.dbline 689
ldi R24,32
lds R2,_nnn
cp R24,R2
brlo X10
xjmp L353
X10:
.dbline 730
; zhongbuff[0][2]=0;
; EIMSK|=(1<<INT6) ;
; UCSR1B|=(1<<RXCIE1);
; delay_nms(3);
; }
; delay_nms(10);
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline -2
L347:
adiw R28,10
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r tem2 10 c
.dbsym r tem1 10 c
.dbsym l tempbuf 0 A[10:10]c
.dbsym r i 22 c
.dbsym r t 20 i
.dbend
.area lit(rom, con, rel)
L368:
.byte 254,253
.byte 251,247
.byte 239,223
.byte 191,127
L369:
.byte 1,2
.b
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -