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

📄 uart.s

📁 一个6缸发动机的ECU控制程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module uart.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
_SprayNum::
	.blkb 2
	.area idata
	.word 120
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e SprayNum _SprayNum I
_CSprayCyc::
	.blkb 4
	.area idata
	.word 53392,3
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e CSprayCyc _CSprayCyc l
_CSprayOn::
	.blkb 2
	.area idata
	.word 2000
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e CSprayOn _CSprayOn i
_CPivDelay::
	.blkb 2
	.area idata
	.word 1000
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e CPivDelay _CPivDelay i
_T1OveForPump::
	.blkb 2
	.area idata
	.word 458
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e T1OveForPump _T1OveForPump i
_T1OveCnt::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e T1OveCnt _T1OveCnt c
_ActFlag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e ActFlag _ActFlag c
_IsLongCyc::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e IsLongCyc _IsLongCyc c
_HighByte::
	.blkb 1
	.area idata
	.byte 3
	.area data(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbsym e HighByte _HighByte c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\timer1.h
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
	.dbfunc e FlashRxBuf _FlashRxBuf fV
	.even
_FlashRxBuf::
	.dbline -1
	.dbline 7
; #include <iom88v.h>
; #include <macros.h>
; #include <uart.h>
; #include <timer1.h>
; 
; void FlashRxBuf(void)
; {
	.dbline 8
;   rx_error0 = 0;
	clr R2
	sts _rx_error0,R2
	.dbline 9
;   rx_counter0 = 0;
	sts _rx_counter0,R2
	.dbline 10
;   rx_rd_index0 = 0;
	sts _rx_rd_index0,R2
	.dbline 11
;   FrameHead0 = 0;
	sts _FrameHead0,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart0_init _uart0_init fV
	.even
_uart0_init::
	.dbline -1
	.dbline 20
; }
; 
; //UART0 initialize
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; // char size: 8 bit
; // parity: Even
; void uart0_init(void)
; {
	.dbline 21
;  UCSR0B = 0x00; //disable while setting baud rate
	clr R2
	sts 193,R2
	.dbline 22
;  UCSR0A = 0x00;
	sts 192,R2
	.dbline 23
;  UCSR0C = 0x26;
	ldi R24,38
	sts 194,R24
	.dbline 24
;  UBRR0L = 0x33; //set baud rate lo
	ldi R24,51
	sts 196,R24
	.dbline 25
;  UBRR0H = 0x00; //set baud rate hi
	sts 197,R2
	.dbline 26
;  UCSR0B = 0xD8;
	ldi R24,216
	sts 193,R24
	.dbline 27
;  FlashRxBuf();
	rcall _FlashRxBuf
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e TestFrameHead _TestFrameHead fc
;           data -> R16
	.even
_TestFrameHead::
	.dbline -1
	.dbline 33
; }
; 
; 
; 
; char TestFrameHead(char data)
; {
	.dbline 34
;   if(data == FRAMEFLAG1)  //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
	cpi R16,255
	brne L4
X0:
	.dbline 35
;     return 1;
	ldi R16,1
	rjmp L3
L4:
	.dbline 37
;   else 
;     return 0;	
	clr R16
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbend
	.area vector(rom, abs)
	.org 36
	rjmp _uart0_rx_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
	.dbfunc e uart0_rx_isr _uart0_rx_isr fV
;           data -> R10
;         status -> R20
	.even
_uart0_rx_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R10
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R20
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 42
; }
; // USART0 Receiver interrupt service routine 
; #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
; void uart0_rx_isr(void) 
; { 
	.dbline 44
;   char status,data; 
;   status=UCSR0A; 
	lds R20,192
	.dbline 45
;   data=UDR0; 
	lds R10,198
	.dbline 50
; //  		 putchar(251);  //回传接收成功标志 debug
; //         putchar(251);  //回传接收成功标志debug
; //  if(data == 0xFF)  //DEBUG
; //    UDR0 = data;   //DEBUG
;   if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
	mov R24,R20
	andi R24,28
	brne L7
X1:
	.dbline 51
;     { 
	.dbline 52
; 	  if(FrameHead0 == 0 && rx_counter0 == 0)  //判断是否帧头
	lds R2,_FrameHead0
	tst R2
	brne L9
X2:
	lds R2,_rx_counter0
	tst R2
	brne L9
X3:
	.dbline 53
; 	   {
	.dbline 54
; 	    if(TestFrameHead(data))    //数据有效才设置FrameHead	
	mov R16,R10
	rcall _TestFrameHead
	tst R16
	breq L8
X4:
	.dbline 55
; 		 {
	.dbline 56
; 	       FrameHead0 = data;
	sts _FrameHead0,R10
	.dbline 57
; 		 }  
	.dbline 58
; 	   } 
	rjmp L8
L9:
	.dbline 61
; 		
; 	  else 
; 	    {	
	.dbline 62
;          rx_buffer0[rx_counter0]=data;  
	ldi R24,<_rx_buffer0
	ldi R25,>_rx_buffer0
	lds R30,_rx_counter0
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R10
	.dbline 65
; //		 putchar(251);  //回传接收成功标志 debug
; //         putchar(251);  //回传接收成功标志debug
;          if (++rx_counter0 == RX_BUFFER_SIZE0) 
	lds R24,_rx_counter0
	subi R24,255    ; addi 1
	mov R2,R24
	sts _rx_counter0,R2
	cpi R24,8
	brne L8
X5:
	.dbline 66
;           { 
	.dbline 67
;             rx_counter0 = 0; 
	clr R2
	sts _rx_counter0,R2
	.dbline 68
;             rx_error0 = 1; 
	ldi R24,1
	sts _rx_error0,R24
	.dbline 69
;           } 
	.dbline 70
; 		} 
	.dbline 71
;      } 
	rjmp L8
L7:
	.dbline 72
;   else rx_error0 = 1 ;	 
	ldi R24,1
	sts _rx_error0,R24
L8:
	.dbline -2
L6:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R20,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R10,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbsym r data 10 c
	.dbsym r status 20 c
	.dbend
	.dbfunc e getchar _getchar fc
;           data -> R16
;          IisOn -> R18
	.even
_getchar::
	.dbline -1
	.dbline 79
; } 
; 
; 
; 
; // Get a character from the USART0 Receiver buffer 
; char getchar(void) 
; { 
	.dbline 81
;   char data; 
;   char IisOn = 1;
	ldi R18,1
	.dbline 82
;   if((SREG & 0x80) == 0x00)  //I之前是否置位
	in R2,0x3f
	sbrc R2,7
	rjmp L19
X6:
	.dbline 83
;     IisOn = 0;
	clr R18
L18:
	.dbline 85
; 	
;   while (rx_counter0==0); 
L19:
	.dbline 85
	lds R2,_rx_counter0
	tst R2
	breq L18
X7:
	.dbline 86
;   data=rx_buffer0[rx_rd_index0]; 
	ldi R24,<_rx_buffer0
	ldi R25,>_rx_buffer0
	lds R30,_rx_rd_index0
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	.dbline 87
;   if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
	lds R24,_rx_rd_index0
	subi R24,255    ; addi 1
	mov R2,R24
	sts _rx_rd_index0,R2
	cpi R24,8
	brne L21
X8:
	.dbline 87
	clr R2
	sts _rx_rd_index0,R2
L21:
	.dbline 88
;   CLI(); 
	cli
	.dbline 89
;   --rx_counter0; 
	lds R24,_rx_counter0
	subi R24,1
	sts _rx_counter0,R24
	.dbline 90
;   if(IisOn)
	tst R18
	breq L23
X9:
	.dbline 91
;     SEI(); 
	sei
L23:
	.dbline 92
;   return data; 
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 c
	.dbsym r IisOn 18 c
	.dbend
	.area vector(rom, abs)
	.org 40
	rjmp _uart0_tx_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
	.dbfunc e uart0_tx_isr _uart0_tx_isr fV
	.even
_uart0_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 101
; }
; 
; 
; 
; 
; // USART0 Transmitter interrupt service routine 

⌨️ 快捷键说明

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