⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 communication.s

📁 基于PIC单片机
💻 S
📖 第 1 页 / 共 5 页
字号:
	.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 + -