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

📄 validatebaudrate.s

📁 Validate Baud rate s accuracy this program will show from FF to 00.
💻 S
字号:
	.module ValidateBaudRate.c
	.area text(rom, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
	.area vector(rom, abs)
	.org 44
	jmp _uart_rx_isr
	.area text(rom, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
	.area data(ram, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
_rec_head::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
	.dbsym e rec_head _rec_head I
_rec_tail::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
	.dbsym e rec_tail _rec_tail I
	.area text(rom, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
	.dbfunc e uart_rx_isr _uart_rx_isr fV
	.even
_uart_rx_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 56
; //ICC-AVR application builder : 2009-4-7 20:13:28
; // Target : M16
; // Crystal: 16.000Mhz
; 
; // Title: 		ValidateBaudRate.c
; // Operation:
; // 			    This program make echo to PC sending in Baudrate 38400
; //					 it receives sending from PC and sends the received one back to PC
; //				The LED group1 (the left one) makes counting on received data
; //				The LED group2 display the received data in binary
; // Attention:	A terminal program "Tera Term Pro" is contained in CD 
; // 				  for PC to communicate with the AVR Study Board	
; 
; /* UCSRA: Control & Status Register A
;    b7-RXC: 	USART receive complete
;    b6-TXC: 	USART transmit complete
;    b5-UDRE:	USART Data register empty
;    b4-FE:	Frame Error
;    b3-DOR:  Data overtun
;    b2-PE: 	Parity error
;    b1-U2X: 	double the USART transmission speed
;    b0-MPCM: multi-processor communication mode
;    
;    USARB
; *  b7-RXCIE: RX complete interrupt enable
;    b6-TXCIE: TX complete interrupt enable
;    b5-UDRIE: USART data register empty interrupt enable
; *  b4-RXEN:	 Receiver enable
; *  b3-TXEN:  Transmitter enable
;    b2-UCSZ2: chracter size     	 ------->0
;    b1-RXB8	 receive data bit 8
;    b0-TXB8:	 Transmit data 8
;    
;    UCSRC
; *  b7-URSEL: register select   	 0/UBRRH,	  1/UCSRC
;    b6-UMSEL: USART mode select 	 0/Asyn		  1/Synchronous
;    b5-UPM1:  -------- Parity mode 00/disable, 01 reserved
;    b4-UPM0:	 -------- 		 	  10 even,	  11 odd 
;    b3-USBS:	stop bit selection 0/1-bit, 1/2-bit
; *  b2-UCSZ1	 		  	   	   --------> 1
; *  b1-UCSZ0  				   --------> 1
;    b0-UCPOL: clock polarity	  0 rising XCK edge, 1 falling XCK edge  
; */
; 
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; #pragma interrupt_handler uart_rx_isr: 12//the interrupt of RX finish
; 
; unsigned char RecBuf[40];
; int rec_head=0, rec_tail=0;
; unsigned char rec_data;
; 
; void uart_rx_isr(void)
; {
	.dbline 57
;  RecBuf[rec_head]=UDR;
	ldi R24,<_RecBuf
	ldi R25,>_RecBuf
	lds R30,_rec_head
	lds R31,_rec_head+1
	add R30,R24
	adc R31,R25
	in R2,0xc
	std z+0,R2
	.dbline 58
;  rec_head++;
	lds R24,_rec_head
	lds R25,_rec_head+1
	adiw R24,1
	sts _rec_head+1,R25
	sts _rec_head,R24
	.dbline 59
;  if(rec_head>=40)
	cpi R24,40
	ldi R30,0
	cpc R25,R30
	brlt L2
X0:
	.dbline 60
;  	rec_head=0;			  
	clr R2
	clr R3
	sts _rec_head+1,R3
	sts _rec_head,R2
L2:
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 64
; }
; 
; void port_init(void)
; {
	.dbline 65
;  DDRA  = 0xFF;		//set PortA output
	ldi R24,255
	out 0x1a,R24
	.dbline 66
;  DDRB  = 0xff;		//set PORTB output
	out 0x17,R24
	.dbline 67
;  DDRC  = 0x00;		//set PORTC output
	clr R2
	out 0x14,R2
	.dbline 68
;  PORTC = 0xff;
	out 0x15,R24
	.dbline 69
;  DDRD  = 0x7f;		//set PD.7 input for RX ?
	ldi R24,127
	out 0x11,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e USART_init _USART_init fV
	.even
_USART_init::
	.dbline -1
	.dbline 74
;                     //PD.0 is RX.
; }
; 
; void USART_init(void)
; {
	.dbline 75
;  UCSRB=0x00;
	clr R2
	out 0xa,R2
	.dbline 76
;  UCSRA=0x00;
	out 0xb,R2
	.dbline 77
;  UCSRB=0b10011000;	 //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
	ldi R24,152
	out 0xa,R24
	.dbline 78
;  UBRRH=0x00;		 //
	out 0x20,R2
	.dbline 82
;  					 //Crystal=16MHx
;  //UBRRL=103;		 //Bausdrate=9600 tested work fine
;  //UBRRL=51;		 //Baudrate=19200 tested work fine
;  UBRRL=25;		 	 //Baudrate=38400 tested work fine //v7.14版本在这里代码生成器犯低级错误;
	ldi R24,25
	out 0x9,R24
	.dbline 85
;  //eg:in the application bulider,UBRR=25,however,it can bulid UBRR=19.
;  //UBRRL=8;	 		 //Baurate=115200 tested work fine
;  UCSRC=0b10000110;	 //Asyn, No parity, 1-stop, 8-bit, rising edge
	ldi R24,134
	out 0x20,R24
	.dbline 87
; // memset(RecBuf, 0, sizeof(RecBuf));
;  rec_head=0;
	clr R3
	sts _rec_head+1,R3
	sts _rec_head,R2
	.dbline 88
;  rec_tail=0;
	sts _rec_tail+1,R3
	sts _rec_tail,R2
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e delay _delay fV
;              i -> R20,R21
;              j -> R22,R23
;          count -> R16,R17
	.even
_delay::
	xcall push_xgsetF000
	.dbline -1
	.dbline 92
; } 
; 
; void delay(int count)
; {
	.dbline 94
;  int i, j;
;  for(i=count; i>0; i--)
	movw R20,R16
	xjmp L10
L7:
	.dbline 95
;     for(j=10; j>0; j--)
	ldi R22,10
	ldi R23,0
L11:
	.dbline 96
; 	   ;
L12:
	.dbline 95
	subi R22,1
	sbci R23,0
	.dbline 95
	clr R2
	clr R3
	cp R2,R22
	cpc R3,R23
	brlt L11
X1:
L8:
	.dbline 94
	subi R20,1
	sbci R21,0
L10:
	.dbline 94
	clr R2
	clr R3
	cp R2,R20
	cpc R3,R21
	brlt L7
X2:
	.dbline -2
L6:
	.dbline 0 ; func end
	xjmp pop_xgsetF000
	.dbsym r i 20 I
	.dbsym r j 22 I
	.dbsym r count 16 I
	.dbend
	.dbfunc e transmit _transmit fV
;          abyte -> R16
	.even
_transmit::
	.dbline -1
	.dbline 100
; }
; 
; void transmit(unsigned char abyte)
; {
	.dbline 101
;  UDR=abyte;
	out 0xc,R16
L16:
	.dbline 103
;  while(!(UCSRA&0b01000000))	//b6=1 TXE	,it quit when transmission finish.
; 	  ;
L17:
	.dbline 102
	sbis 0xb,6
	rjmp L16
X3:
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r abyte 16 c
	.dbend
	.dbfunc e main _main fV
;          dswin -> R10,R11
;       SendData -> R20
	.even
_main::
	.dbline -1
	.dbline 108
; }
; 
; //*****************************************************************
; void main(void)
; {
	.dbline 111
; // unsigned char outa=0b01010101, outb=0b10101010, outc=0x00, outd=0x00;
;  int dswin;
;  unsigned char SendData=0xFF;
	ldi R20,255
	.dbline 112
;  port_init();
	xcall _port_init
	.dbline 113
;  USART_init();
	xcall _USART_init
	.dbline 114
;  SEI();
	sei
	.dbline 116
;  do
;  {
L23:
	.dbline 117
;      while(!(UCSRA&(1<<UDRE)));
L24:
	.dbline 117
	sbis 0xb,5
	rjmp L23
X4:
	.dbline 118
;      UDR=SendData;
	out 0xc,R20
	.dbline 119
;      SendData--;
	dec R20
	.dbline 120
;  }
L21:
	.dbline 121
;  while(SendData!=0xFF);
	cpi R20,255
	brne L24
X5:
	xjmp L27
L26:
	.dbline 123
;  while(1)
;    {
	.dbline 124
;     WDR();				  	//Watchdog reset
	wdr
	.dbline 125
; 	if(rec_head!=rec_tail)
	lds R2,_rec_tail
	lds R3,_rec_tail+1
	lds R4,_rec_head
	lds R5,_rec_head+1
	cp R4,R2
	cpc R5,R3
	breq L29
X6:
	.dbline 126
; 	   {
	.dbline 127
; 	    rec_data=RecBuf[rec_tail];	//read data from head and write data at tail
	ldi R24,<_RecBuf
	ldi R25,>_RecBuf
	movw R30,R2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts _rec_data,R2
	.dbline 128
; 		rec_tail++;
	lds R24,_rec_tail
	lds R25,_rec_tail+1
	adiw R24,1
	sts _rec_tail+1,R25
	sts _rec_tail,R24
	.dbline 131
; 		//rec_data=RecBuf[rec_tail++]; //you can amend the sentences above two like that
; 		//i++; show that first use it,then add it.
; 		if(rec_tail>=40)	//make up circular queue
	cpi R24,40
	ldi R30,0
	cpc R25,R30
	brlt L31
X7:
	.dbline 132
; 		   rec_tail=0;
	clr R2
	clr R3
	sts _rec_tail+1,R3
	sts _rec_tail,R2
L31:
	.dbline 134
; 		   
; 		dswin=rec_head<<2;	//the lowest 2 bit of PORTD are RXD and TXD.
	lds R10,_rec_head
	lds R11,_rec_head+1
	lsl R10
	rol R11
	lsl R10
	rol R11
	.dbline 135
; 	    PORTD=dswin;        //The two ports are occupied,so it need "<<2".
	out 0x12,R10
	.dbline 136
; 		PORTA=rec_data;     //rec_head++,so it can stand for the number of received data.
	lds R2,_rec_data
	out 0x1b,R2
	.dbline 137
; 		transmit(rec_data);
	mov R16,R2
	xcall _transmit
	.dbline 138
; 		if(rec_data==13)	//★??
	lds R24,_rec_data
	cpi R24,13
	brne L33
X8:
	.dbline 139
; 			transmit(10);
	ldi R16,10
	xcall _transmit
L33:
	.dbline 140
; 	   } 
L29:
	.dbline 141
;    }
L27:
	.dbline 122
	xjmp L26
X9:
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbsym r dswin 10 I
	.dbsym r SendData 20 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\MYDOCU~1\EXPRIMENT\ICC\UART\ValidateBaudRate\ValidateBaudRate.c
_rec_data::
	.blkb 1
	.dbsym e rec_data _rec_data c
_RecBuf::
	.blkb 40
	.dbsym e RecBuf _RecBuf A[40:40]c
; }

⌨️ 快捷键说明

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