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

📄 m8mpt.s

📁 AVR MEGA8双机串行口通讯程序,单工485方式,用于单片机组网,有PROTEUS仿真电路,可以立刻验证
💻 S
字号:
	.module M8MPt.c
	.area data(ram, con, rel)
_TXADFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e TXADFG _TXADFG c
_SlaveCR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e SlaveCR _SlaveCR c
_TXINTMAX::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e TXINTMAX _TXINTMAX c
_TXINTFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e TXINTFG _TXINTFG c
_RXINTMAX::
	.blkb 1
	.area idata
	.byte 16
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXINTMAX _RXINTMAX c
_RXINTCR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXINTCR _RXINTCR c
_RXINTFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXINTFG _RXINTFG c
_TXbufP::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e TXbufP _TXbufP c
_RXbufP::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXbufP _RXbufP c
_RXbufPmax::
	.blkb 1
	.area idata
	.byte 11
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXbufPmax _RXbufPmax c
_RXERROR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e RXERROR _RXERROR c
_WaitCR0::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e WaitCR0 _WaitCR0 c
_WaitCR1::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e WaitCR1 _WaitCR1 c
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbfunc e SoftTimer _SoftTimer fV
	.even
_SoftTimer::
	.dbline -1
	.dbline 63
	.dbline 64
	lds R24,_WaitCR0
	subi R24,255    ; addi 1
	sts _WaitCR0,R24
	.dbline 65
	ldi R24,254
	lds R2,_WaitCR0
	cp R24,R2
	brsh L2
	.dbline 66
	.dbline 67
	clr R2
	sts _WaitCR0,R2
	.dbline 68
	lds R24,_WaitCR1
	subi R24,255    ; addi 1
	sts _WaitCR1,R24
	.dbline 69
L2:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SoftTimerStart _SoftTimerStart fV
	.even
_SoftTimerStart::
	.dbline -1
	.dbline 72
; //////////主机
; 
; #include <iom8v.h>
; #include <macros.h>
; //ISARM pro
; #define OUTLED1OFF PORTB|=0x01       //for 
; #define OUTLED1ON PORTB&=~0x01
; #define OUTLED2OFF PORTB|=0x02       //For 
; #define OUTLED2ON PORTB&=~0x02
; #define OUTLED2Pulse PORTB^=0x02
; 
; #define OUTLED3OFF PORTB|=0x04      //For 
; #define OUTLED3ON PORTB&=~0x04
; #define OUTLED3Pulse PORTB^=0x04
; #define OUTLED4OFF PORTB|=0x08      //For 
; #define OUTLED4ON PORTB&=~0x08
; #define OUTLED4Pulse PORTB^=0x08
; 
; #define OUTDEON PORTD|=0x10
; #define OUTDEOFF PORTD&=~0x10
; 
; #define KB0 (PINC&0x01)
; #define KB1 (PINC&0x02)
; 
; 
; ///UART///
; #define TXENABLE UCSRB&=~(1<<RXEN);UCSRB|=(1<<TXEN); 
; #define RXENABLE UCSRB&=~(1<<TXEN);UCSRB|=(1<<RXEN); 
; #define TXADDRESS UCSRB|=(1<<TXB8);TXADFG=0;
; #define TXDATA UCSRB&=~(1<<TXB8);TXADFG=1;
; //
; #define TRFG0 0xFE
; #define TRFG1 0xFD
; #define TRFG2 0xF1
; #define TRFG3 0xF0
; //最大子板数
; #define SlaveBMAX 15
; //////////////////////////////
; //////////////////////////////
; unsigned char TXADFG=0;
; 
; unsigned char SlaveEN[17];
; unsigned char SlaveCR=0;  //子板编号计数器,当作物理地址
; unsigned char TXINTMAX=1;//下行发送中断次数控制值
; //unsigned char TXINTCR=0;//下行发送中断次数计数器
; unsigned char TXINTFG=0;//下行发送中断次数完成标志
; unsigned char RXINTMAX=16;//下行发送中断次数控制值
; unsigned char RXINTCR=0;//下行发送中断次数计数器
; unsigned char RXINTFG=0;//下行发送中断次数完成标志
; 
; unsigned char TXBUF[30]; //发送缓冲区
; unsigned char RXBUF[30];  //接收缓冲区
; unsigned char TXbufP=0;  //发送缓冲区下标
; unsigned char RXbufP=0;  //接收缓冲区下标
; unsigned char RXbufPmax=11;//接收数据实际长度
; 
; unsigned char RXERROR=0;
; /////Soft Timer
; unsigned char WaitCR0=0;
; unsigned char WaitCR1=0;
; 
; void SoftTimer(void)
;   {
;     WaitCR0++;
; 	if(WaitCR0>254)
; 	 {
; 	  WaitCR0=0;
; 	  WaitCR1++;
; 	 }//if(WaitCR0>0)
;   }
; void SoftTimerStart(void)
;   {
	.dbline 73
;    WaitCR0=0;
	clr R2
	sts _WaitCR0,R2
	.dbline 74
;    WaitCR1=0;
	sts _WaitCR1,R2
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e watchdog_init _watchdog_init fV
	.even
_watchdog_init::
	.dbline -1
	.dbline 78
;   }
;   
; void watchdog_init(void)
;      {
	.dbline 79
; 	   WDR();
	wdr
	.dbline 80
; 	   WDTCR=0x0F ;
	ldi R24,15
	out 0x21,R24
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Delay_1ms _Delay_1ms fV
;              i -> R16,R17
	.even
_Delay_1ms::
	.dbline -1
	.dbline 84
; 	 }
; 	 
; void Delay_1ms(void)
; 	{
	.dbline 87
; 	unsigned int i;
; 
; 	for (i = 1; i<1140; i++)
	ldi R16,1
	ldi R17,0
	rjmp L10
L7:
	.dbline 89
L8:
	.dbline 87
	subi R16,255  ; offset = 1
	sbci R17,255
L10:
	.dbline 87
	cpi R16,116
	ldi R30,4
	cpc R17,R30
	brlo L7
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e delayXms _delayXms fV
;              i -> R20,R21
;              n -> R22,R23
	.even
_delayXms::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 93
; 		
; 			;
; 	}
; 
; void delayXms(unsigned int n)
;      {
	.dbline 94
; 	   unsigned int i=0;
	clr R20
	clr R21
	rjmp L13
L12:
	.dbline 96
	.dbline 97
	rcall _Delay_1ms
	.dbline 98
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 99
L13:
	.dbline 95
; 	   while(i<n)
	cp R20,R22
	cpc R21,R23
	brlo L12
	.dbline -2
L11:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r n 22 i
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 104
; 	     {
; 		  Delay_1ms();
; 		  i++;
; 		 }
; 	 }
; 	 
; 	 
; void port_init(void)
;      {
	.dbline 107
; 	 
; 					 
; 	  PORTB=0xFF;    //PB set to 1
	ldi R24,255
	out 0x18,R24
	.dbline 108
; 	  DDRB=0xFF;     
	out 0x17,R24
	.dbline 110
; 					 
; 	  PORTC=0xFF;    //PC set to 1
	out 0x15,R24
	.dbline 111
; 	  DDRC=0x00;     //
	clr R2
	out 0x14,R2
	.dbline 113
; 	      
; 	  PORTD=0xFF;    //PD set to 1
	out 0x12,R24
	.dbline 114
; 	  DDRD=0x12;     //PD0:RXD PD1:TXD PD2:DI0 PD3:DI1
	ldi R24,18
	out 0x11,R24
	.dbline 118
; 	                 //PD4:DI2  PD5:DI3 
; 	  //OUTDEON;
; 	  
; 	SFIOR&=~(1<<PUD);  //OPEN UP LINK
	in R24,0x30
	andi R24,251
	out 0x30,R24
	.dbline 122
; 	//MCUCR|=(1<<ISC11); //Down edge int1
; 	//GICR=(1<<INT1); //enable INT1
; 	  
; 	  delayXms(10); //delay 1s
	ldi R16,10
	ldi R17,0
	rcall _delayXms
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart_init _uart_init fV
	.even
_uart_init::
	.dbline -1
	.dbline 126
; 	 }
; //////////////////////////UART INIT
; void uart_init(void) 
;    {
	.dbline 128
;     
;     OUTDEOFF;
	cbi 0x12,4
	.dbline 129
;     UCSRB=0x00;
	clr R2
	out 0xa,R2
	.dbline 130
; 	UBRRL=0x25;  //19.2kbps
	ldi R24,37
	out 0x9,R24
	.dbline 132
; 	//TX EN ,9Bit ,Adress init
; 	UCSRB=((1<<RXCIE)|(1<<TXCIE)|(1<<UCSZ2));
	ldi R24,196
	out 0xa,R24
	.dbline -2
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer_init _timer_init fV
	.even
_timer_init::
	.dbline -1
	.dbline 138
; 	//UCSRB=((1<<TXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<TXB8));
;    }//void uart_init(void) 
; 
; ///////////////Timer init	 
; void timer_init(void)
;      {
	.dbline 139
; 	  ;
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 16
	rjmp _timer1_ovf_isr
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
	.even
_timer1_ovf_isr::
	.dbline -1
	.dbline 145
; 	 }	 	 
; 	
; 
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {	
	.dbline 146
; 	 ;  
	.dbline -2
L18:
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 26
	rjmp _uart1_tx_isr
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbfunc e uart1_tx_isr _uart1_tx_isr fV
	.even
_uart1_tx_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 153
; 	 
; }//void timer1_ovf_isr(void)
; 
; //TR to SLAVE
; #pragma interrupt_handler uart1_tx_isr:14
; void uart1_tx_isr(void)
;  {  
	.dbline 154
;     TXbufP++;
	lds R24,_TXbufP
	subi R24,255    ; addi 1
	sts _TXbufP,R24
	.dbline 157
; 	
; 	  
; 	if(TXbufP<14)
	cpi R24,14
	brsh L20
	.dbline 158
; 	  {
	.dbline 160
;        
; 	   if(TXbufP==2 )
	cpi R24,2
	brne L22
	.dbline 161
; 	     {
	.dbline 162
; 	     OUTLED3Pulse;
	ldi R24,4
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline 165
; 	    // Delay_1ms();
; 	     //delayXms(1000);
; 		 TXDATA;
	cbi 0xa,0
	.dbline 165
	ldi R24,1
	sts _TXADFG,R24
	.dbline 165
	.dbline 169
; 		 
; 		 //OUTLED3Pulse;
; 	     //
; 	     }//if(TXbufP>1)
L22:
	.dbline 170
; 		UDR=TXBUF[TXbufP]; 
	ldi R24,<_TXBUF
	ldi R25,>_TXBUF
	lds R30,_TXbufP
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0xc,R2
	.dbline 171
; 	  }
	rjmp L21
L20:
	.dbline 173
; 	else
; 	    {
	.dbline 174
; 		 OUTLED1ON;
	cbi 0x18,0
	.dbline 175
; 		 RXENABLE
	cbi 0xa,3
	.dbline 175
	sbi 0xa,4
	.dbline 176
; 		}//else
L21:
	.dbline 177
; 	OUTLED2Pulse;
	ldi R24,2
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline -2
L19:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 22
	rjmp _uart1_rx_isr
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbfunc e uart1_rx_isr _uart1_rx_isr fV
	.even
_uart1_rx_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 184
	.dbline 185
	ldi R24,<_RXBUF
	ldi R25,>_RXBUF
	lds R30,_RXbufP
	clr R31
	add R30,R24
	adc R31,R25
	in R2,0xc
	std z+0,R2
	.dbline 186
	lds R24,_RXbufP
	subi R24,255    ; addi 1
	sts _RXbufP,R24
	.dbline 187
	lds R24,_RXBUF+11
	cpi R24,240
	brne L25
	.dbline 188
	cbi 0x18,3
L25:
	.dbline -2
L24:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e TXbufRDY _TXbufRDY fV
	.even
_TXbufRDY::
	.dbline -1
	.dbline 192
; 	//Delay_1ms();
; 	//OUTLED2Pulse;
;  }//void uart1_tx_isr(void)
; 
; #pragma interrupt_handler uart1_rx_isr:12
; void uart1_rx_isr(void)
;  {	
;     RXBUF[RXbufP]=UDR;
; 	RXbufP++;
; 	if(RXBUF[11]==TRFG3)
; 	   OUTLED4ON;
; 	
;  }//void uart1_rx_isr(void)
; void TXbufRDY(void)
; {
	.dbline 193
;  TXBUF[0]=5;
	ldi R24,5
	sts _TXBUF,R24
	.dbline 194
;  TXBUF[1]=5;
	sts _TXBUF+1,R24
	.dbline 195
;  TXBUF[2]=TRFG0;
	ldi R24,254
	sts _TXBUF+2,R24
	.dbline 196
;  TXBUF[3]=TRFG1;
	ldi R24,253
	sts _TXBUF+3,R24
	.dbline 197
;  TXBUF[4]=0;
	clr R2
	sts _TXBUF+4,R2
	.dbline 198
;  TXBUF[5]=1;
	ldi R24,1
	sts _TXBUF+5,R24
	.dbline 199
;  TXBUF[12]=TRFG2;
	ldi R24,241
	sts _TXBUF+12,R24
	.dbline 200
;  TXBUF[13]=TRFG3;
	ldi R24,240
	sts _TXBUF+13,R24
	.dbline -2
L28:
	.dbline 0 ; func end
	ret
	.dbend
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
_SLSTEP::
	.blkb 1
	.area idata
	.byte 10
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbsym e SLSTEP _SLSTEP c
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MPt.c
	.dbfunc e main _main fV
;              i -> R20
	.even
_main::
	.dbline -1
	.dbline 207
; }//void TXbufRDY(void)
; 
; 
; 
; unsigned char SLSTEP=10;
; void main()
; {
	.dbline 208
;    unsigned char i=0;
	clr R20
	.dbline 211
;    
; 	//delayXms(500); 
; 	port_init(); //IO初始化	
	rcall _port_init
	.dbline 212
; 	uart_init();
	rcall _uart_init
	.dbline 215
; 	//timer_init();
; 	
; 	delayXms(100); 
	ldi R16,100
	ldi R17,0
	rcall _delayXms
	.dbline 216
; 	RXbufP=0;
	clr R2
	sts _RXbufP,R2
	.dbline 217
; 	TXbufRDY()
	rcall _TXbufRDY
	sei
	.dbline 219
; 	SEI();
; 	TXbufP=0;
	clr R2
	sts _TXbufP,R2
	.dbline 220
; 	TXADDRESS;
	sbi 0xa,0
	.dbline 220
	sts _TXADFG,R2
	.dbline 220
	.dbline 221
; 	TXENABLE;
	cbi 0xa,4
	.dbline 221
	sbi 0xa,3
	.dbline 221
	.dbline 222
; 	UDR=TXBUF[0];
	lds R2,_TXBUF
	out 0xc,R2
L37:
	.dbline 224
	.dbline 228
L38:
	.dbline 223
	rjmp L37
X0:
	.dbline -2
L36:
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile E:\m8com\M8MPt.c
_RXBUF::
	.blkb 30
	.dbsym e RXBUF _RXBUF A[30:30]c
_TXBUF::
	.blkb 30
	.dbsym e TXBUF _TXBUF A[30:30]c
_SlaveEN::
	.blkb 17
	.dbsym e SlaveEN _SlaveEN A[17:17]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -