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

📄 uart.s

📁 一个6缸发动机的ECU控制程序
💻 S
📖 第 1 页 / 共 2 页
字号:
; #pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
; void uart0_tx_isr(void)
; { 
	.dbline 102
;   if (tx_counter0) 
	lds R2,_tx_counter0
	tst R2
	breq L26
X10:
	.dbline 103
;     { 
	.dbline 104
;       --tx_counter0; 
	lds R24,_tx_counter0
	subi R24,1
	sts _tx_counter0,R24
	.dbline 105
;       UDR0=tx_buffer0[tx_rd_index0]; 
	ldi R24,<_tx_buffer0
	ldi R25,>_tx_buffer0
	lds R30,_tx_rd_index0
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	sts 198,R2
	.dbline 106
;       if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; 
	lds R24,_tx_rd_index0
	subi R24,255    ; addi 1
	mov R2,R24
	sts _tx_rd_index0,R2
	cpi R24,8
	brne L28
X11:
	.dbline 106
	clr R2
	sts _tx_rd_index0,R2
L28:
	.dbline 107
;     }; 
L26:
	.dbline 107
	.dbline -2
L25:
	.dbline 0 ; func end
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e putchar _putchar fV
;          IisOn -> R20
;              c -> R16
	.even
_putchar::
	st -y,R20
	.dbline -1
	.dbline 114
; } 
; 
; 
; 
; // Write a character to the USART0 Transmitter buffer 
; void putchar(char c) 
; { 
	.dbline 115
;   char IisOn = 1;
	ldi R20,1
	.dbline 116
;   if((SREG & 0x80) == 0x00)  //I之前是否置位
	in R2,0x3f
	sbrc R2,7
	rjmp L34
X12:
	.dbline 117
;     IisOn = 0;
	clr R20
L33:
	.dbline 118
;   while (tx_counter0 == TX_BUFFER_SIZE0); 
L34:
	.dbline 118
	lds R24,_tx_counter0
	cpi R24,8
	breq L33
X13:
	.dbline 119
;   CLI(); 
	cli
	.dbline 120
;   if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) 
	lds R2,_tx_counter0
	tst R2
	brne L38
X14:
	lds R2,192
	sbrc R2,5
	rjmp L36
X15:
L38:
	.dbline 121
;     { 
	.dbline 122
;       tx_buffer0[tx_wr_index0]=c; 
	ldi R24,<_tx_buffer0
	ldi R25,>_tx_buffer0
	lds R30,_tx_wr_index0
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R16
	.dbline 123
;       if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; 
	lds R24,_tx_wr_index0
	subi R24,255    ; addi 1
	mov R2,R24
	sts _tx_wr_index0,R2
	cpi R24,8
	brne L39
X16:
	.dbline 123
	clr R2
	sts _tx_wr_index0,R2
L39:
	.dbline 124
;       ++tx_counter0; 
	lds R24,_tx_counter0
	subi R24,255    ; addi 1
	sts _tx_counter0,R24
	.dbline 125
;     } 
	rjmp L37
L36:
	.dbline 127
;   else 
;     UDR0=c;
	sts 198,R16
L37:
	.dbline 128
;   if(IisOn)	 	
	tst R20
	breq L41
X17:
	.dbline 129
;     SEI(); 
	sei
L41:
	.dbline -2
L30:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r IisOn 20 c
	.dbsym r c 16 c
	.dbend
	.dbfunc e DisposeBufDatas _DisposeBufDatas fV
;      sprayNumH -> y+3
;      sprayNumL -> y+2
;      tPivDelay -> R12
;      tSprayCyc -> R14,R15
;       tSprayOn -> R10
;       tPumpCyc -> y+1
;          IisOn -> y+0
	.even
_DisposeBufDatas::
	rcall push_xgsetF0FC
	sbiw R28,4
	.dbline -1
	.dbline 133
; } 
; 
; void DisposeBufDatas(void)
; {
	.dbline 142
;  //定义变量
;  unsigned char tPumpCyc;         //换能器周期,单位s
;  unsigned char tSprayOn;         //喷射脉宽,单位0.1ms
;  unsigned int tSprayCyc;        //喷射周期,单位ms
;  unsigned char tPivDelay;        //piv脉宽延时,单位0.1ms
;  char sprayNumL;                 //SprayNum低字节
;  char sprayNumH;                 //SprayNum高字节
;  
;  char IisOn = 1;
	clr R0
	inc R0
	std y+0,R0
	.dbline 143
;  if((SREG & 0x80) == 0x00)  //I之前是否置位
	in R2,0x3f
	sbrc R2,7
	rjmp L44
X18:
	.dbline 144
;    IisOn = 0;
	clr R0
	std y+0,R0
L44:
	.dbline 146
;  
;  if(rx_error0)                 //接收错误
	lds R2,_rx_error0
	tst R2
	breq L46
X19:
	.dbline 147
;   {
	.dbline 148
;    CLI();
	cli
	.dbline 149
;    putchar(SENDAGAIN);
	ldi R16,254
	rcall _putchar
	.dbline 150
;    putchar(SENDAGAIN);
	ldi R16,254
	rcall _putchar
	.dbline 151
;    if(IisOn)	
	ldd R0,y+0
	tst R0
	brne X23
	rjmp L47
X23:
X20:
	.dbline 152
;      SEI();
	sei
	.dbline 153
;   } 
	rjmp L47
L46:
	.dbline 155
;  else
;  { 
	.dbline 156
;    sprayNumL = getchar();
	rcall _getchar
	std y+2,R16
	.dbline 157
;    sprayNumH = getchar();
	rcall _getchar
	std y+3,R16
	.dbline 158
;    tPumpCyc = (unsigned int )getchar();
	rcall _getchar
	mov R10,R16
	mov R2,R10
	clr R3
	std y+1,R2
	.dbline 159
;    tSprayOn = getchar();
	rcall _getchar
	mov R10,R16
	.dbline 160
;    tSprayCyc = getchar();
	rcall _getchar
	mov R12,R16
	mov R14,R12
	clr R15
	.dbline 161
;    tPivDelay = getchar();
	rcall _getchar
	mov R12,R16
	.dbline 174
;    
; /************debug*****************
;      putchar(sprayNumL);   //debug
; 	 putchar(sprayNumH);   //debug
; 	 putchar(tPumpCyc);   //debug
; 	 putchar(tSprayOn);   //debug
; 	 putchar(tSprayCyc);   //debug
; 	 putchar(tPivDelay);   //debug
; 
; //**********************************/   
;    
;    //转换数据
;    SprayNum = (int)sprayNumL + ((int)sprayNumH << 8);
	ldd R2,y+3
	clr R3
	mov R3,R2
	clr R2
	ldd R4,y+2
	clr R5
	add R4,R2
	adc R5,R3
	sts _SprayNum+1,R5
	sts _SprayNum,R4
	.dbline 175
;    T1OveForPump = (unsigned char)(tPumpCyc * 1000 / (2 * 65.536));
	ldd R18,y+1
	clr R19
	ldi R16,1000
	ldi R17,3
	rcall empy16s
	rcall int2fp
	movw R2,R16
	movw R4,R18
	ldi R16,<L50
	ldi R17,>L50
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R2
	movw R18,R4
	rcall fpdiv2
	rcall fpint
	mov R2,R16
	clr R3
	sts _T1OveForPump+1,R3
	sts _T1OveForPump,R2
	.dbline 176
;    CSprayOn = (unsigned int)(tSprayOn  * 10 );
	ldi R24,10
	mul R24,R10
	sts _CSprayOn+1,R1
	sts _CSprayOn,R0
	.dbline 177
;    CSprayCyc = (unsigned long )tSprayCyc * 1000 ;
	movw R2,R14
	clr R4
	clr R5
	ldi R20,232
	ldi R21,3
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	rcall empy32u
	sts _CSprayCyc+1,R17
	sts _CSprayCyc,R16
	sts _CSprayCyc+2+1,R19
	sts _CSprayCyc+2,R18
	.dbline 178
;    CPivDelay = (unsigned int)(tPivDelay * 100 );
	ldi R24,100
	mul R24,R12
	sts _CPivDelay+1,R1
	sts _CPivDelay,R0
	.dbline 180
;    
;    if(CSprayCyc > 0xffff)
	ldi R20,255
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R2,R16
	movw R4,R18
	cp R20,R16
	cpc R21,R17
	cpc R22,R18
	cpc R23,R19
	brsh L51
X21:
	.dbline 181
;    {
	.dbline 182
;      IsLongCyc = 1;
	ldi R24,1
	sts _IsLongCyc,R24
	.dbline 183
; 	 HighByte = (unsigned char )(CSprayCyc >> 16);
	movw R2,R4
	clr R4
	clr R5
	sts _HighByte,R2
	.dbline 184
;    }  
L51:
	.dbline 186
;    
;    CLI();                //禁止中断,保证以下发送的两字节连续
	cli
	.dbline 187
;    putchar(REVSUCCEED);  //回传接收成功标志
	ldi R16,252
	rcall _putchar
	.dbline 188
;    putchar(REVSUCCEED);  //回传接收成功标志
	ldi R16,252
	rcall _putchar
	.dbline 190
; 
;    if(IisOn)
	ldd R0,y+0
	tst R0
	breq L53
X22:
	.dbline 191
;      SEI();
	sei
L53:
	.dbline 192
;  }
L47:
	.dbline 193
;  FlashRxBuf(); 
	rcall _FlashRxBuf
	.dbline -2
L43:
	.dbline 0 ; func end
	adiw R28,4
	rjmp pop_xgsetF0FC
	.dbsym l sprayNumH 3 c
	.dbsym l sprayNumL 2 c
	.dbsym r tPivDelay 12 c
	.dbsym r tSprayCyc 14 i
	.dbsym r tSprayOn 10 c
	.dbsym l tPumpCyc 1 c
	.dbsym l IisOn 0 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.c
_tx_counter0::
	.blkb 1
	.dbfile C:\DOCUME~1\Administrator\桌面\avr1\uart.h
	.dbsym e tx_counter0 _tx_counter0 c
_tx_rd_index0::
	.blkb 1
	.dbsym e tx_rd_index0 _tx_rd_index0 c
_tx_wr_index0::
	.blkb 1
	.dbsym e tx_wr_index0 _tx_wr_index0 c
_tx_buffer0::
	.blkb 8
	.dbsym e tx_buffer0 _tx_buffer0 A[8:8]c
_FrameHead0::
	.blkb 1
	.dbsym e FrameHead0 _FrameHead0 c
_rx_error0::
	.blkb 1
	.dbsym e rx_error0 _rx_error0 c
_rx_counter0::
	.blkb 1
	.dbsym e rx_counter0 _rx_counter0 c
_rx_rd_index0::
	.blkb 1
	.dbsym e rx_rd_index0 _rx_rd_index0 c
_rx_buffer0::
	.blkb 8
	.dbsym e rx_buffer0 _rx_buffer0 A[8:8]c
	.area lit(rom, con, rel)
L50:
	.word 0x126f,0x4303
;    
; }//DisposeBufDatas(void)结束

⌨️ 快捷键说明

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