📄 communication.s
字号:
.dbline 174
; uchar *pr;int bbb=0;
clr R22
clr R23
.dbline 175
; cs_485_send();
in R24,0x3
andi R24,251
out 0x3,R24
.dbline 176
ldi R22,1000
ldi R23,3
L87:
.dbline 176
L88:
.dbline 176
; for(bbb=1000;bbb>0;bbb--);//等待PB3引脚稳定
subi R22,1
sbci R23,0
.dbline 176
clr R2
clr R3
cp R2,R22
cpc R3,R23
brlt L87
.dbline 177
; for(pr=p;pr<(p+n);pr++)
movw R20,R18
xjmp L94
X0:
.dbline 178
; {
L95:
.dbline 180
L96:
.dbline 179
sbis 0xb,5
rjmp L95
.dbline 181
movw R30,R20
ldd R2,z+0
out 0xc,R2
.dbline 182
L92:
.dbline 177
subi R20,255 ; offset = 1
sbci R21,255
L94:
.dbline 177
mov R2,R16
clr R3
add R2,R18
adc R3,R19
cp R20,R2
cpc R21,R3
brlo L96
L98:
.dbline 184
L99:
.dbline 183
; while(!(UCSR0A&(1<<UDRE0)))
; ;
; UDR0= *pr;
; }
; while(!(UCSR0A&(1<<TXC0)))
sbis 0xb,6
rjmp L98
.dbline 185
; ;
; UCSR0A|=1<<TXC0;
sbi 0xb,6
.dbline 186
; cs_485_receive();
sbi 0x3,2
.dbline -2
L86:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r bbb 22 I
.dbsym r pr 20 pc
.dbsym r p 18 pc
.dbsym r n 16 c
.dbend
.dbfunc e Usart_Receive_Data _Usart_Receive_Data fc
; j -> R20
; tcounter -> R22,R23
; flag5 -> R10,R11
.even
_Usart_Receive_Data::
xcall push_gset3
.dbline -1
.dbline 190
; }
; //8位数据单字节接收函数Usart_Receive_Data()
; uchar Usart_Receive_Data(void)
; {
.dbline 191
; int flag5=0;uchar j=0;int tcounter=0;
clr R10
clr R11
.dbline 191
clr R20
.dbline 191
clr R22
clr R23
xjmp L103
L102:
.dbline 193
; while(!(UCSR0A&(1<<RXC0)))
; {
.dbline 194
; flag5++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 196
; //wdr();
; if(flag5>5000)
ldi R24,5000
ldi R25,19
cp R24,R10
cpc R25,R11
brge L105
.dbline 197
; {
.dbline 198
; wdr();
xcall _wdr
.dbline 199
; flag5=0;
clr R10
clr R11
.dbline 200
; tcounter++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 201
; }
L105:
.dbline 202
; if(tcounter>2) //原来是3
ldi R24,2
ldi R25,0
cp R24,R22
cpc R25,R23
brge L107
.dbline 203
; {
.dbline 204
; tcounter=0;
clr R22
clr R23
.dbline 205
; errorflag=1; //最多等待50s还没有数据传上来说明节点断开
ldi R24,1
sts _errorflag,R24
.dbline 206
; break; //errorflag 为未接受到数据 标识
xjmp L104
L107:
.dbline 208
L103:
.dbline 192
sbis 0xb,7
rjmp L102
L104:
.dbline 209
; }
; }
; j=UCSR0B;
in R20,0xa
.dbline 210
; return UDR0;
in R16,0xc
.dbline -2
L101:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r tcounter 22 I
.dbsym r flag5 10 I
.dbend
.dbfunc e Usart2_Receive_Data _Usart2_Receive_Data fc
; j -> R20
; tcounter -> R22,R23
; flag5 -> R10,R11
.even
_Usart2_Receive_Data::
xcall push_gset3
.dbline -1
.dbline 214
; }
; //8位数据单字节接收函数Usart2_Receive_Data() 调零专用
; uchar Usart2_Receive_Data(void)
; {
.dbline 215
; int flag5=0;uchar j=0;int tcounter=0;
clr R10
clr R11
.dbline 215
clr R20
.dbline 215
clr R22
clr R23
xjmp L111
L110:
.dbline 217
; while(!(UCSR0A&(1<<RXC0)))
; {
.dbline 218
; flag5++;
movw R24,R10
adiw R24,1
movw R10,R24
.dbline 219
; if(flag5>5000)
ldi R24,5000
ldi R25,19
cp R24,R10
cpc R25,R11
brge L113
.dbline 220
; {
.dbline 221
; wdr();
xcall _wdr
.dbline 222
; flag5=0;
clr R10
clr R11
.dbline 223
; tcounter++;
subi R22,255 ; offset = 1
sbci R23,255
.dbline 224
; }
L113:
.dbline 225
; if(tcounter>500) //
ldi R24,500
ldi R25,1
cp R24,R22
cpc R25,R23
brge L115
.dbline 226
; {
.dbline 227
; wdr();
xcall _wdr
.dbline 228
; tcounter=0;
clr R22
clr R23
.dbline 229
; errorflag=1; //最多等待50s还没有数据传上来说明节点断开
ldi R24,1
sts _errorflag,R24
.dbline 230
; break; //errorflag 为未接受到数据 标识
xjmp L112
L115:
.dbline 232
L111:
.dbline 216
sbis 0xb,7
rjmp L110
L112:
.dbline 233
; }
; }
; j=UCSR0B;
in R20,0xa
.dbline 234
; return UDR0;
in R16,0xc
.dbline -2
L109:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r tcounter 22 I
.dbsym r flag5 10 I
.dbend
.dbfunc e usart_transmit_char _usart_transmit_char fV
; a -> R20
; c -> R22
.even
_usart_transmit_char::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 238
; }
; //发送一个字节
; void usart_transmit_char(uchar c)
; {
.dbline 239
; uchar a=0;
clr R20
.dbline 241
; //delay_nus(6); //很重要,有待思考
; delay_nus(9);
ldi R16,9
ldi R17,0
xcall _delay_nus
.dbline 242
; a=PIND;
in R20,0x10
xjmp L119
L118:
.dbline 244
.dbline 245
in R20,0x10
.dbline 246
xcall _wdr
.dbline 247
L119:
.dbline 243
; while((a&0x20)==0x20)
mov R2,R20
clr R3
sbrc R2,5
rjmp L118
xjmp L122
L121:
.dbline 249
.dbline 250
xcall _wdr
.dbline 251
L122:
.dbline 248
; {
; a=PIND;
; wdr();
; }
; while(!(UCSR1A&(1<<UDRE1)))
lds R2,155
sbrs R2,5
rjmp L121
.dbline 253
; {
; wdr();
; }
; //;
; UDR1=c;
sts 156,R22
L124:
.dbline 255
L125:
.dbline 254
; while(!(UCSR1A&(1<<TXC1)))
lds R2,155
sbrs R2,6
rjmp L124
.dbline 256
; ;
; UCSR1A|=1<<TXC1;
lds R24,155
ori R24,64
sts 155,R24
.dbline 257
; delay_nus(1);
ldi R16,1
ldi R17,0
xcall _delay_nus
.dbline -2
L117:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r a 20 c
.dbsym r c 22 c
.dbend
.dbfunc e byte_revert _byte_revert fc
; c -> R22
; b -> R10
; a -> R20
; data -> R16
.even
_byte_revert::
xcall push_gset3
.dbline -1
.dbline 264
; }
; /**********************************************************************
; TWI相关的函数开始
; **********************************************************************/
; //一个字节的高低位的翻转函数
; uchar byte_revert(uchar data)
; {
.dbline 266
; unsigned char a, b, c;
; a = data;
mov R20,R16
.dbline 267
; if( ( b = a | 0x81 ) != a
mov R24,R20
ori R24,129
mov R10,R24
cp R24,R20
breq L128
ldi R24,129
ldi R25,0
mov R2,R20
clr R3
eor R2,R24
eor R3,R25
mov R22,R2
cp R22,R10
breq L128
.dbline 269
; && ( c = a^0x81 ) != b )
; a = c;
mov R20,R2
L128:
.dbline 270
; if( ( b = a | 0x42 ) != a
mov R24,R20
ori R24,66
mov R10,R24
cp R24,R20
breq L130
ldi R24,66
mov R2,R20
eor R2,R24
mov R22,R2
cp R22,R10
breq L130
.dbline 272
; && ( c = a^0x42 ) != b )
; a = c;
mov R20,R2
L130:
.dbline 273
; if( ( b = a | 0x24 ) != a
mov R24,R20
ori R24,36
mov R10,R24
cp R24,R20
breq L132
ldi R24,36
mov R2,R20
eor R2,R24
mov R22,R2
cp R22,R10
breq L132
.dbline 275
; && ( c = a^0x24 ) != b )
; a = c;
mov R20,R2
L132:
.dbline 276
; if( ( b = a | 0x18 ) != a
mov R24,R20
ori R24,24
mov R10,R24
cp R24,R20
breq L134
ldi R24,24
mov R2,R20
eor R2,R24
mov R22,R2
cp R22,R10
breq L134
.dbline 278
; && ( c = a^0x18 ) != b )
; a = c;
mov R20,R2
L134:
.dbline 279
; return a;
mov R16,R20
.dbline -2
L127:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r c 22 c
.dbsym r b 10 c
.dbsym r a 20 c
.dbsym r data 16 c
.dbend
.dbfunc e TWI_Master_Initialise _TWI_Master_Initialise fV
.even
_TWI_Master_Initialise::
.dbline -1
.dbline 286
; }
; /****************************************************************************
; Call this function to set up the TWI master to its initial standby state.
; Remember to enable interrupts from the main application after initializing the TWI.
; ****************************************************************************/
; void TWI_Master_Initialise(void)
; {
.dbline 287
; TWBR = TWI_TWBR; // Set bit rate register (Baudrate)4k. Defined in header file.
ldi R24,12
sts 112,R24
.dbline 289
; // TWSR = TWI_TWPS; // Not used. Driver presumes prescaler to be 00.
; TWDR = 0xFF; // Default content = SDA released.
ldi R24,255
sts 115,R24
.dbline 290
; TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
ldi R24,4
sts 116,R24
.dbline -2
L136:
.dbline 0 ; func end
ret
.dbend
.dbfunc e i2c_wt_8bit _i2c_wt_8bit fV
; data -> R16
.even
_i2c_wt_8bit::
.dbline -1
.dbline 298
; (0<<TWIE)|(0<<TWINT)| // Disable Interupt.
; (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // No Signal requests.
; (0<<TWWC); //
; }
; /*************************** TWI相关函数结束*****************************/
; //写数据到TWDR
; void i2c_wt_8bit(unsigned char data)
; {
.dbline 299
; TWDR=data;
sts 115,R16
.dbline 300
; TWCR=(1<<TWINT)|(1<<TWEN)|(0<<TWEA)|
ldi R24,132
sts 116,R24
.dbline -2
L137:
.dbline 0 ; func end
ret
.dbsym r data 16 c
.dbend
.dbfunc e I2cRead _I2cRead fc
; j -> R22
; num -> R20
; addrlo -> y+10
; addrhi -> y+8
; device_rd -> R10
; device_wt -> R12
.even
_I2cRead::
xcall push_gset4
mov R10,R18
mov R12,R16
ldd R20,y+12
.dbline -1
.dbline 306
; (0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);
; }
; //device_addr为器件地址,addrhi,addrlo为全地址,num 要连续读的个数
; //返回1:失败,0:成功 一次最多写32个字节
; uchar I2cRead(uchar device_wt,uchar device_rd, uchar addrhi,uchar addrlo,uchar num)
; {
.dbline 307
; uchar j=0;
clr R22
.dbline 308
; Start() ; //I2C开始
ldi R24,164
sts 116,R24
.dbline 309
L139:
.dbline 309
L140:
.dbline 309
; Wait() ; //等待TWIINT标志为1
lds R2,116
sbrs R2,7
rjmp L139
.dbline 309
.dbline 309
.dbline 310
; if(TestAck()!=TWI_START )
lds R24,113
andi R24,248
cpi R24,8
breq L142
.dbline 311
; {
.dbline 312
; TWI_Master_Initialise();
xcall _TWI_Master_Initialise
.dbline 313
; return 1; //出错
ldi R16,1
xjmp L138
L142:
.dbline 315
; }
; i2c_wt_8bit(device_wt); //写I2C从器件地址及写方式
mov R16,R12
xcall _i2c_wt_8bit
.dbline 316
L144:
.dbline 316
L145:
.dbline 316
; Wait(); //等
lds R2,116
sbrs R2,7
rjmp L144
.dbline 316
.dbline 316
.dbline 317
; if(TestAck()!=TWI_MTX_ADR_ACK ) //ACK
lds R24,113
andi R24,248
cpi R24,24
breq L147
.dbline 318
; {
.dbline 319
; TWI_Master_Initialise();
xcall _TWI_Master_Initialise
.dbline 320
; return 1; //出错
ldi R16,1
xjmp L138
L147:
.dbline 322
; }
; i2c_wt_8bit(addrhi); //高地址
ldd R16,y+8
xcall _i2c_wt_8bit
.dbline 323
L149:
.dbline 323
L150:
.dbline 323
; Wait(); //等
lds R2,116
sbrs R2,7
rjmp L149
.dbline 323
.dbline 323
.dbline 324
; if(TestAck()!=TWI_MTX_DATA_ACK ) //ACK
lds R24,113
andi R24,248
cpi R24,40
breq L152
.dbline 325
; {
.dbline 326
; TWI_Master_Initialise();
xcall _TWI_Master_Initialise
.dbline 327
; return 1; //出错
ldi R16,1
xjmp L138
L152:
.dbline 329
; }
; i2c_wt_8bit(addrlo); //低地址
ldd R16,y+10
xcall _i2c_wt_8bit
.dbline 330
L154:
.dbline 330
L155:
.dbline 330
; Wait(); //等
lds R2,116
sbrs R2,7
rjmp L154
.dbline 330
.dbline 330
.dbline 331
; if(TestAck()!=TWI_MTX_DATA_ACK ) //ACK
lds R24,113
andi R24,248
cpi R24,40
breq L157
.dbline 332
; {
.dbline 333
; TWI_Master_Initialise();
xcall _TWI_Master_Initialise
.dbline 334
; return 1; //出错
ldi R16,1
xjmp L138
L157:
.dbline 336
; }
; Start() ; //I2C从新开始
ldi R24,164
sts 116,R24
.dbline 337
L159:
.dbline 337
L160:
.dbline 337
; Wait() ; //等待TWIINT标志为1
lds R2,116
sbrs R2,7
rjmp L159
.dbline 337
.dbline 337
.dbline 338
; if(TestAck()!=TWI_REP_START ) //ACK
lds R24,113
andi R24,248
cpi R24,16
breq L162
.dbline 339
; {
.dbline 340
; TWI_Master_Initialise();
xcall _TWI_Master_Initialise
.dbline 341
; return 1; //出错
ldi R16,1
xjmp L138
L162:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -