📄 communication.lis
字号:
02C6 9707 cpc R25,R23
02C8 44F4 brge L115
02CA .dbline 226
02CA ; {
02CA .dbline 227
02CA ; wdr();
02CA 0E940000 xcall _wdr
02CE .dbline 228
02CE ; tcounter=0;
02CE 6627 clr R22
02D0 7727 clr R23
02D2 .dbline 229
02D2 ; errorflag=1; //最多等待50s还没有数据传上来说明节点断开
02D2 81E0 ldi R24,1
02D4 80930000 sts _errorflag,R24
02D8 .dbline 230
02D8 ; break; //errorflag 为未接受到数据 标识
02D8 02C0 xjmp L112
02DA L115:
02DA .dbline 232
02DA L111:
02DA .dbline 216
02DA 5F9B sbis 0xb,7
02DC E3CF rjmp L110
02DE L112:
02DE .dbline 233
02DE ; }
02DE ; }
02DE ; j=UCSR0B;
02DE 4AB1 in R20,0xa
02E0 .dbline 234
02E0 ; return UDR0;
02E0 0CB1 in R16,0xc
02E2 .dbline -2
02E2 L109:
02E2 0E940000 xcall pop_gset3
02E6 .dbline 0 ; func end
02E6 0895 ret
02E8 .dbsym r j 20 c
02E8 .dbsym r tcounter 22 I
02E8 .dbsym r flag5 10 I
02E8 .dbend
02E8 .dbfunc e usart_transmit_char _usart_transmit_char fV
02E8 ; a -> R20
02E8 ; c -> R22
.even
02E8 _usart_transmit_char::
02E8 0E940000 xcall push_gset2
02EC 602F mov R22,R16
02EE .dbline -1
02EE .dbline 238
02EE ; }
02EE ; //发送一个字节
02EE ; void usart_transmit_char(uchar c)
02EE ; {
02EE .dbline 239
02EE ; uchar a=0;
02EE 4427 clr R20
02F0 .dbline 241
02F0 ; //delay_nus(6); //很重要,有待思考
02F0 ; delay_nus(9);
02F0 09E0 ldi R16,9
02F2 10E0 ldi R17,0
02F4 87DE xcall _delay_nus
02F6 .dbline 242
02F6 ; a=PIND;
02F6 40B3 in R20,0x10
02F8 03C0 xjmp L119
02FA L118:
02FA .dbline 244
02FA .dbline 245
02FA 40B3 in R20,0x10
02FC .dbline 246
02FC 0E940000 xcall _wdr
0300 .dbline 247
0300 L119:
0300 .dbline 243
0300 ; while((a&0x20)==0x20)
0300 242E mov R2,R20
0302 3324 clr R3
0304 25FC sbrc R2,5
0306 F9CF rjmp L118
0308 02C0 xjmp L122
030A L121:
030A .dbline 249
030A .dbline 250
030A 0E940000 xcall _wdr
030E .dbline 251
030E L122:
030E .dbline 248
030E ; {
030E ; a=PIND;
030E ; wdr();
030E ; }
030E ; while(!(UCSR1A&(1<<UDRE1)))
030E 20909B00 lds R2,155
0312 25FE sbrs R2,5
0314 FACF rjmp L121
0316 .dbline 253
0316 ; {
0316 ; wdr();
0316 ; }
0316 ; //;
0316 ; UDR1=c;
0316 60939C00 sts 156,R22
031A L124:
031A .dbline 255
031A L125:
031A .dbline 254
031A ; while(!(UCSR1A&(1<<TXC1)))
031A 20909B00 lds R2,155
031E 26FE sbrs R2,6
0320 FCCF rjmp L124
0322 .dbline 256
0322 ; ;
0322 ; UCSR1A|=1<<TXC1;
0322 80919B00 lds R24,155
0326 8064 ori R24,64
0328 80939B00 sts 155,R24
032C .dbline 257
032C ; delay_nus(1);
032C 01E0 ldi R16,1
032E 10E0 ldi R17,0
0330 69DE xcall _delay_nus
0332 .dbline -2
0332 L117:
0332 0E940000 xcall pop_gset2
0336 .dbline 0 ; func end
0336 0895 ret
0338 .dbsym r a 20 c
0338 .dbsym r c 22 c
0338 .dbend
0338 .dbfunc e byte_revert _byte_revert fc
0338 ; c -> R22
0338 ; b -> R10
0338 ; a -> R20
0338 ; data -> R16
.even
0338 _byte_revert::
0338 0E940000 xcall push_gset3
033C .dbline -1
033C .dbline 264
033C ; }
033C ; /**********************************************************************
033C ; TWI相关的函数开始
033C ; **********************************************************************/
033C ; //一个字节的高低位的翻转函数
033C ; uchar byte_revert(uchar data)
033C ; {
033C .dbline 266
033C ; unsigned char a, b, c;
033C ; a = data;
033C 402F mov R20,R16
033E .dbline 267
033E ; if( ( b = a | 0x81 ) != a
033E 842F mov R24,R20
0340 8168 ori R24,129
0342 A82E mov R10,R24
0344 8417 cp R24,R20
0346 51F0 breq L128
0348 81E8 ldi R24,129
034A 90E0 ldi R25,0
034C 242E mov R2,R20
034E 3324 clr R3
0350 2826 eor R2,R24
0352 3926 eor R3,R25
0354 622D mov R22,R2
0356 6A15 cp R22,R10
0358 09F0 breq L128
035A .dbline 269
035A ; && ( c = a^0x81 ) != b )
035A ; a = c;
035A 422D mov R20,R2
035C L128:
035C .dbline 270
035C ; if( ( b = a | 0x42 ) != a
035C 842F mov R24,R20
035E 8264 ori R24,66
0360 A82E mov R10,R24
0362 8417 cp R24,R20
0364 39F0 breq L130
0366 82E4 ldi R24,66
0368 242E mov R2,R20
036A 2826 eor R2,R24
036C 622D mov R22,R2
036E 6A15 cp R22,R10
0370 09F0 breq L130
0372 .dbline 272
0372 ; && ( c = a^0x42 ) != b )
0372 ; a = c;
0372 422D mov R20,R2
0374 L130:
0374 .dbline 273
0374 ; if( ( b = a | 0x24 ) != a
0374 842F mov R24,R20
0376 8462 ori R24,36
0378 A82E mov R10,R24
037A 8417 cp R24,R20
037C 39F0 breq L132
037E 84E2 ldi R24,36
0380 242E mov R2,R20
0382 2826 eor R2,R24
0384 622D mov R22,R2
0386 6A15 cp R22,R10
0388 09F0 breq L132
038A .dbline 275
038A ; && ( c = a^0x24 ) != b )
038A ; a = c;
038A 422D mov R20,R2
038C L132:
038C .dbline 276
038C ; if( ( b = a | 0x18 ) != a
038C 842F mov R24,R20
038E 8861 ori R24,24
0390 A82E mov R10,R24
0392 8417 cp R24,R20
0394 39F0 breq L134
0396 88E1 ldi R24,24
0398 242E mov R2,R20
039A 2826 eor R2,R24
039C 622D mov R22,R2
039E 6A15 cp R22,R10
03A0 09F0 breq L134
03A2 .dbline 278
03A2 ; && ( c = a^0x18 ) != b )
03A2 ; a = c;
03A2 422D mov R20,R2
03A4 L134:
03A4 .dbline 279
03A4 ; return a;
03A4 042F mov R16,R20
03A6 .dbline -2
03A6 L127:
03A6 0E940000 xcall pop_gset3
03AA .dbline 0 ; func end
03AA 0895 ret
03AC .dbsym r c 22 c
03AC .dbsym r b 10 c
03AC .dbsym r a 20 c
03AC .dbsym r data 16 c
03AC .dbend
03AC .dbfunc e TWI_Master_Initialise _TWI_Master_Initialise fV
.even
03AC _TWI_Master_Initialise::
03AC .dbline -1
03AC .dbline 286
03AC ; }
03AC ; /****************************************************************************
03AC ; Call this function to set up the TWI master to its initial standby state.
03AC ; Remember to enable interrupts from the main application after initializing the TWI.
03AC ; ****************************************************************************/
03AC ; void TWI_Master_Initialise(void)
03AC ; {
03AC .dbline 287
03AC ; TWBR = TWI_TWBR; // Set bit rate register (Baudrate)4k. Defined in header file.
03AC 8CE0 ldi R24,12
03AE 80937000 sts 112,R24
03B2 .dbline 289
03B2 ; // TWSR = TWI_TWPS; // Not used. Driver presumes prescaler to be 00.
03B2 ; TWDR = 0xFF; // Default content = SDA released.
03B2 8FEF ldi R24,255
03B4 80937300 sts 115,R24
03B8 .dbline 290
03B8 ; TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
03B8 84E0 ldi R24,4
03BA 80937400 sts 116,R24
03BE .dbline -2
03BE L136:
03BE .dbline 0 ; func end
03BE 0895 ret
03C0 .dbend
03C0 .dbfunc e i2c_wt_8bit _i2c_wt_8bit fV
03C0 ; data -> R16
.even
03C0 _i2c_wt_8bit::
03C0 .dbline -1
03C0 .dbline 298
03C0 ; (0<<TWIE)|(0<<TWINT)| // Disable Interupt.
03C0 ; (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // No Signal requests.
03C0 ; (0<<TWWC); //
03C0 ; }
03C0 ; /*************************** TWI相关函数结束*****************************/
03C0 ; //写数据到TWDR
03C0 ; void i2c_wt_8bit(unsigned char data)
03C0 ; {
03C0 .dbline 299
03C0 ; TWDR=data;
03C0 00937300 sts 115,R16
03C4 .dbline 300
03C4 ; TWCR=(1<<TWINT)|(1<<TWEN)|(0<<TWEA)|
03C4 84E8 ldi R24,132
03C6 80937400 sts 116,R24
03CA .dbline -2
03CA L137:
03CA .dbline 0 ; func end
03CA 0895 ret
03CC .dbsym r data 16 c
03CC .dbend
03CC .dbfunc e I2cRead _I2cRead fc
03CC ; j -> R22
03CC ; num -> R20
03CC ; addrlo -> y+10
03CC ; addrhi -> y+8
03CC ; device_rd -> R10
03CC ; device_wt -> R12
.even
03CC _I2cRead::
03CC 0E940000 xcall push_gset4
03D0 A22E mov R10,R18
03D2 C02E mov R12,R16
03D4 4C85 ldd R20,y+12
03D6 .dbline -1
03D6 .dbline 306
03D6 ; (0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
03D6 ; }
03D6 ; //device_addr为器件地址,addrhi,addrlo为全地址,num 要连续读的个数
03D6 ; //返回1:失败,0:成功 一次最多写32个字节
03D6 ; uchar I2cRead(uchar device_wt,uchar device_rd, uchar addrhi,uchar addrlo,uchar num)
03D6 ; {
03D6 .dbline 307
03D6 ; uchar j=0;
03D6 6627 clr R22
03D8 .dbline 308
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -