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

📄 m8mp01.s

📁 AVR MEGA8双机串行口通讯程序,单工485方式,用于单片机组网,有PROTEUS仿真电路,可以立刻验证
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module M8MP01.c
	.area data(ram, con, rel)
_TXADFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e TXADFG _TXADFG c
_SlaveCR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e SlaveCR _SlaveCR c
_TXINTMAX::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e TXINTMAX _TXINTMAX c
_TXINTFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e TXINTFG _TXINTFG c
_RXINTMAX::
	.blkb 1
	.area idata
	.byte 16
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXINTMAX _RXINTMAX c
_RXINTCR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXINTCR _RXINTCR c
_RXINTFG::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXINTFG _RXINTFG c
_TXbufP::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e TXbufP _TXbufP c
_RXbufP::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXbufP _RXbufP c
_RXbufPmax::
	.blkb 1
	.area idata
	.byte 11
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXbufPmax _RXbufPmax c
_RXERROR::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e RXERROR _RXERROR c
_WaitCR0::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e WaitCR0 _WaitCR0 c
_WaitCR1::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbsym e WaitCR1 _WaitCR1 c
	.area text(rom, con, rel)
	.dbfile E:\m8com\M8MP01.c
	.dbfunc e SoftTimer _SoftTimer fV
	.even
_SoftTimer::
	.dbline -1
	.dbline 62
	.dbline 63
	lds R24,_WaitCR0
	subi R24,255    ; addi 1
	sts _WaitCR0,R24
	.dbline 64
	ldi R24,254
	lds R2,_WaitCR0
	cp R24,R2
	brsh L2
	.dbline 65
	.dbline 66
	clr R2
	sts _WaitCR0,R2
	.dbline 67
	lds R24,_WaitCR1
	subi R24,255    ; addi 1
	sts _WaitCR1,R24
	.dbline 68
L2:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SoftTimerStart _SoftTimerStart fV
	.even
_SoftTimerStart::
	.dbline -1
	.dbline 71
; //////////主机
; 
; #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;TXADFG=0;
; #define TXDATA UCSRB&=~1;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[16]; //发送缓冲区
; 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 72
;    WaitCR0=0;
	clr R2
	sts _WaitCR0,R2
	.dbline 73
;    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 77
;   }
;   
; void watchdog_init(void)
;      {
	.dbline 78
; 	   WDR();
	wdr
	.dbline 79
; 	   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 83
; 	 }
; 	 
; void Delay_1ms(void)
; 	{
	.dbline 86
; 	unsigned int i;
; 
; 	for (i = 1; i<1140; i++)
	ldi R16,1
	ldi R17,0
	rjmp L10
L7:
	.dbline 88
L8:
	.dbline 86
	subi R16,255  ; offset = 1
	sbci R17,255
L10:
	.dbline 86
	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 92
; 		
; 			;
; 	}
; 
; void delayXms(unsigned int n)
;      {
	.dbline 93
; 	   unsigned int i=0;
	clr R20
	clr R21
	rjmp L13
L12:
	.dbline 95
	.dbline 96
	rcall _Delay_1ms
	.dbline 97
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 98
L13:
	.dbline 94
; 	   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 103
; 	     {
; 		  Delay_1ms();
; 		  i++;
; 		 }
; 	 }
; 	 
; 	 
; void port_init(void)
;      {
	.dbline 106
; 	 
; 					 
; 	  PORTB=0xFF;    //PB set to 1
	ldi R24,255
	out 0x18,R24
	.dbline 107
; 	  DDRB=0xFF;     
	out 0x17,R24
	.dbline 109
; 					 
; 	  PORTC=0xFF;    //PC set to 1
	out 0x15,R24
	.dbline 110
; 	  DDRC=0x00;     //
	clr R2
	out 0x14,R2
	.dbline 112
; 	      
; 	  PORTD=0xFF;    //PD set to 1
	out 0x12,R24
	.dbline 113
; 	  DDRD=0x12;     //PD0:RXD PD1:TXD PD2:DI0 PD3:DI1
	ldi R24,18
	out 0x11,R24
	.dbline 117
; 	                 //PD4:DI2  PD5:DI3 
; 	  //OUTDEON;
; 	  
; 	SFIOR&=~(1<<PUD);  //OPEN UP LINK
	in R24,0x30
	andi R24,251
	out 0x30,R24
	.dbline 121
; 	//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 125
; 	 }
; //////////////////////////UART INIT
; void uart_init(void) 
;    {
	.dbline 127
;     
;     OUTDEOFF;
	cbi 0x12,4
	.dbline 128
;     UCSRB=0x00;
	clr R2
	out 0xa,R2
	.dbline 130
; 	//UBRRL=0x25;  //19.2kbps
; 	UBRRL=0x1;  //38.4kbps
	ldi R24,1
	out 0x9,R24
	.dbline 132
; 	//TX EN ,9Bit ,Adress init
; 	UCSRB=((1<<RXCIE)|(1<<TXCIE)|(1<<TXEN)|(1<<UCSZ2)|(1<<TXB8));
	ldi R24,205
	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\M8MP01.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\M8MP01.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 155
;     
; 	TXbufP++;
	lds R24,_TXbufP
	subi R24,255    ; addi 1
	sts _TXbufP,R24
	.dbline 156
; 	if(TXbufP<14)
	cpi R24,14
	brsh L20
	.dbline 157
; 	  {
	.dbline 159
;        
; 	   if(TXbufP==2 )
	cpi R24,2
	brne L22
	.dbline 160
; 	     {
	.dbline 161
; 	     OUTLED3Pulse;	    
	ldi R24,4
	in R2,0x18
	eor R2,R24
	out 0x18,R2
	.dbline 162
; 		 TXDATA;	 
	cbi 0xa,0
	.dbline 162
	ldi R24,1
	sts _TXADFG,R24
	.dbline 162
	.dbline 164
; 		
; 	     }//if(TXbufP>1)
L22:
	.dbline 165
; 		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 166
; 	  }
	rjmp L21
L20:
	.dbline 168
	.dbline 169
	cbi 0x12,4
	.dbline 170
	cbi 0x18,0
	.dbline 171
	cbi 0xa,3
	.dbline 171
	sbi 0xa,4
	.dbline 172
L21:
	.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\M8MP01.c
	.dbfunc e uart1_rx_isr _uart1_rx_isr fV
;           TmpD -> R16
	.even
_uart1_rx_isr::
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 179
; 	else
; 	    {
; 		 OUTDEOFF;
; 		 OUTLED1ON;
; 		 RXENABLE
; 		}//else
; 	
; 	

⌨️ 快捷键说明

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