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

📄 inject.lst

📁 一个6缸发动机的ECU控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
      3F EFCF      LDI	R28,0xFF
      40 E0D4      LDI	R29,4
      41 BFCD      OUT	0x3D,R28
      42 BFDE      OUT	0x3E,R29
      43 55C0      SUBI	R28,0x50
      44 40D0      SBCI	R29,0
      45 EA0A      LDI	R16,0xAA
      46 8308      STD	Y+0,R16
      47 2400      CLR	R0
      48 E4EA      LDI	R30,0x4A
      49 E0F1      LDI	R31,1
      4A E011      LDI	R17,1
      4B 37E9      CPI	R30,0x79
      4C 07F1      CPC	R31,R17
      4D F011      BEQ	0x0050
      4E 9201      ST	R0,Z+
      4F CFFB      RJMP	0x004B
      50 8300      STD	Z+0,R16
      51 E3E4      LDI	R30,0x34
      52 E0F0      LDI	R31,0
      53 E0A0      LDI	R26,0
      54 E0B1      LDI	R27,1
      55 E010      LDI	R17,0
      56 E000      LDI	R16,0
      57 BF0B      OUT	0x3B,R16
      58 37EE      CPI	R30,0x7E
      59 07F1      CPC	R31,R17
      5A F021      BEQ	0x005F
      5B 95C8      LPM
      5C 9631      ADIW	R30,1
      5D 920D      ST	R0,X+
      5E CFF9      RJMP	0x0058
      5F D34C      RCALL	_main
_exit:
      60 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\Administrator\桌面\程序\油泵油嘴实验台\可用\油泵油~2\uart.c
(0001) #include <iom88v.h>
(0002) #include <macros.h>
(0003) #include <uart.h>
(0004) #include <timer1.h>
(0005) 
(0006) void FlashRxBuf(void)
(0007) {
(0008)   rx_error0 = 0;
_FlashRxBuf:
      61 2422      CLR	R2
      62 9220 0162 STS	rx_error0,R2
(0009)   rx_counter0 = 0;
      64 9220 0163 STS	rx_counter0,R2
(0010)   rx_rd_index0 = 0;
      66 9220 0164 STS	rx_rd_index0,R2
(0011)   FrameHead0 = 0;
      68 9220 0161 STS	FrameHead0,R2
      6A 9508      RET
(0012) }
(0013) 
(0014) //UART0 initialize
(0015) // desired baud rate: 9600
(0016) // actual: baud rate:9615 (0.2%)
(0017) // char size: 8 bit
(0018) // parity: Even
(0019) void uart0_init(void)
(0020) {
(0021)  UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
      6B 2422      CLR	R2
      6C 9220 00C1 STS	0x00C1,R2
(0022)  UCSR0A = 0x00;
      6E 9220 00C0 STS	0x00C0,R2
(0023)  UCSR0C = 0x26;
      70 E286      LDI	R24,0x26
      71 9380 00C2 STS	0x00C2,R24
(0024)  UBRR0L = 0x33; //set baud rate lo
      73 E383      LDI	R24,0x33
      74 9380 00C4 STS	0x00C4,R24
(0025)  UBRR0H = 0x00; //set baud rate hi
      76 9220 00C5 STS	0x00C5,R2
(0026)  UCSR0B = 0xD8;
      78 ED88      LDI	R24,0xD8
      79 9380 00C1 STS	0x00C1,R24
(0027)  FlashRxBuf();
      7B DFE5      RCALL	_FlashRxBuf
      7C 9508      RET
(0028) }
(0029) 
(0030) 
(0031) 
(0032) char TestFrameHead(char data)
(0033) {
(0034)   if(data == FRAMEFLAG1)  //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
_TestFrameHead:
  data                 --> R16
      7D 3F0F      CPI	R16,0xFF
      7E F411      BNE	0x0081
(0035)     return 1;
      7F E001      LDI	R16,1
      80 C001      RJMP	0x0082
(0036)   else 
(0037)     return 0;	
      81 2700      CLR	R16
      82 9508      RET
_uart0_rx_isr:
  data                 --> R10
  status               --> R20
      83 920A      ST	R0,-Y
      84 921A      ST	R1,-Y
      85 922A      ST	R2,-Y
      86 923A      ST	R3,-Y
      87 924A      ST	R4,-Y
      88 925A      ST	R5,-Y
      89 926A      ST	R6,-Y
      8A 927A      ST	R7,-Y
      8B 928A      ST	R8,-Y
      8C 929A      ST	R9,-Y
      8D 92AA      ST	R10,-Y
      8E 930A      ST	R16,-Y
      8F 931A      ST	R17,-Y
      90 932A      ST	R18,-Y
      91 933A      ST	R19,-Y
      92 934A      ST	R20,-Y
      93 938A      ST	R24,-Y
      94 939A      ST	R25,-Y
      95 93AA      ST	R26,-Y
      96 93BA      ST	R27,-Y
      97 93EA      ST	R30,-Y
      98 93FA      ST	R31,-Y
      99 B60F      IN	R0,0x3F
      9A 920A      ST	R0,-Y
      9B 92AA      ST	R10,-Y
      9C 934A      ST	R20,-Y
(0038) }
(0039) // USART0 Receiver interrupt service routine 
(0040) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0041) void uart0_rx_isr(void) 
(0042) { 
(0043)   char status,data; 
(0044)   status=UCSR0A; 
      9D 9140 00C0 LDS	R20,0x00C0
(0045)   data=UDR0; 
      9F 90A0 00C6 LDS	R10,0x00C6
(0046) //  		 putchar(251);  //回传接收成功标志 debug
(0047) //         putchar(251);  //回传接收成功标志debug
(0048) //  if(data == 0xFF)  //DEBUG
(0049) //    UDR0 = data;   //DEBUG
(0050)   if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
      A1 2F84      MOV	R24,R20
      A2 718C      ANDI	R24,0x1C
      A3 F531      BNE	0x00CA
(0051)     { 
(0052) 	  if(FrameHead0 == 0 && rx_counter0 == 0)  //判断是否帧头
      A4 9020 0161 LDS	R2,FrameHead0
      A6 2022      TST	R2
      A7 F459      BNE	0x00B3
      A8 9020 0163 LDS	R2,rx_counter0
      AA 2022      TST	R2
      AB F439      BNE	0x00B3
(0053) 	   {
(0054) 	    if(TestFrameHead(data))    //数据有效才设置FrameHead	
      AC 2D0A      MOV	R16,R10
      AD DFCF      RCALL	_TestFrameHead
      AE 2300      TST	R16
      AF F0E9      BEQ	0x00CD
(0055) 		 {
(0056) 	       FrameHead0 = data;
      B0 92A0 0161 STS	FrameHead0,R10
(0057) 		 }  
(0058) 	   } 
      B2 C01A      RJMP	0x00CD
(0059) 		
(0060) 	  else 
(0061) 	    {	
(0062)          rx_buffer0[rx_counter0]=data;  
      B3 E685      LDI	R24,0x65
      B4 E091      LDI	R25,1
      B5 91E0 0163 LDS	R30,rx_counter0
      B7 27FF      CLR	R31
      B8 0FE8      ADD	R30,R24
      B9 1FF9      ADC	R31,R25
      BA 82A0      STD	Z+0,R10
(0063) //		 putchar(251);  //回传接收成功标志 debug
(0064) //         putchar(251);  //回传接收成功标志debug
(0065)          if (++rx_counter0 == RX_BUFFER_SIZE0) 
      BB 9180 0163 LDS	R24,rx_counter0
      BD 5F8F      SUBI	R24,0xFF
      BE 2E28      MOV	R2,R24
      BF 9220 0163 STS	rx_counter0,R2
      C1 3184      CPI	R24,0x14
      C2 F451      BNE	0x00CD
(0066)           { 
(0067)             rx_counter0 = 0; 
      C3 2422      CLR	R2
      C4 9220 0163 STS	rx_counter0,R2
(0068)             rx_error0 = 1; 
      C6 E081      LDI	R24,1
      C7 9380 0162 STS	rx_error0,R24
(0069)           } 
(0070) 		} 
(0071)      } 
      C9 C003      RJMP	0x00CD
(0072)   else rx_error0 = 1 ;	 
      CA E081      LDI	R24,1
      CB 9380 0162 STS	rx_error0,R24
      CD 9149      LD	R20,Y+
      CE 90A9      LD	R10,Y+
      CF 9009      LD	R0,Y+
      D0 BE0F      OUT	0x3F,R0
      D1 91F9      LD	R31,Y+
      D2 91E9      LD	R30,Y+
      D3 91B9      LD	R27,Y+
      D4 91A9      LD	R26,Y+
      D5 9199      LD	R25,Y+
      D6 9189      LD	R24,Y+
      D7 9149      LD	R20,Y+
      D8 9139      LD	R19,Y+
      D9 9129      LD	R18,Y+
      DA 9119      LD	R17,Y+
      DB 9109      LD	R16,Y+
      DC 90A9      LD	R10,Y+
      DD 9099      LD	R9,Y+
      DE 9089      LD	R8,Y+
      DF 9079      LD	R7,Y+
      E0 9069      LD	R6,Y+
      E1 9059      LD	R5,Y+
      E2 9049      LD	R4,Y+
      E3 9039      LD	R3,Y+
      E4 9029      LD	R2,Y+
      E5 9019      LD	R1,Y+
      E6 9009      LD	R0,Y+
      E7 9518      RETI
(0073) } 
(0074) 
(0075) 
(0076) 
(0077) // Get a character from the USART0 Receiver buffer 
(0078) char getchar(void) 
(0079) { 
(0080)   char data; 
(0081)   char IisOn = 1;
_getchar:
  data                 --> R16
  IisOn                --> R18
      E8 E021      LDI	R18,1
(0082)   if((SREG & 0x80) == 0x00)  //I之前是否置位
      E9 B62F      IN	R2,0x3F
      EA FC27      SBRC	R2,7
      EB C001      RJMP	0x00ED
(0083)     IisOn = 0;
      EC 2722      CLR	R18
(0084) 	
(0085)   while (rx_counter0==0); 
      ED 9020 0163 LDS	R2,rx_counter0
      EF 2022      TST	R2
      F0 F3E1      BEQ	0x00ED
(0086)   data=rx_buffer0[rx_rd_index0]; 
      F1 E685      LDI	R24,0x65
      F2 E091      LDI	R25,1
      F3 91E0 0164 LDS	R30,rx_rd_index0
      F5 27FF      CLR	R31
      F6 0FE8      ADD	R30,R24
      F7 1FF9      ADC	R31,R25
      F8 8100      LDD	R16,Z+0
(0087)   if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
      F9 9180 0164 LDS	R24,rx_rd_index0
      FB 5F8F      SUBI	R24,0xFF
      FC 2E28      MOV	R2,R24
      FD 9220 0164 STS	rx_rd_index0,R2
      FF 3184      CPI	R24,0x14
     100 F419      BNE	0x0104
     101 2422      CLR	R2
     102 9220 0164 STS	rx_rd_index0,R2
(0088)   CLI(); 
     104 94F8      BCLR	7
(0089)   --rx_counter0; 
     105 9180 0163 LDS	R24,rx_counter0
     107 5081      SUBI	R24,1
     108 9380 0163 STS	rx_counter0,R24
(0090)   if(IisOn)
     10A 2322      TST	R18
     10B F009      BEQ	0x010D
(0091)     SEI(); 
     10C 9478      BSET	7
(0092)   return data; 
     10D 9508      RET
_uart0_tx_isr:
     10E 922A      ST	R2,-Y
     10F 938A      ST	R24,-Y
     110 939A      ST	R25,-Y
     111 93EA      ST	R30,-Y
     112 93FA      ST	R31,-Y
     113 B62F      IN	R2,0x3F
     114 922A      ST	R2,-Y
(0093) }
(0094) 
(0095) 
(0096) 
(0097) 
(0098) // USART0 Transmitter interrupt service routine 
(0099) #pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
(0100) void uart0_tx_isr(void)
(0101) { 
(0102)   if (tx_counter0) 
     115 9020 014A LDS	R2,tx_counter0
     117 2022      TST	R2
     118 F0D1      BEQ	0x0133
(0103)     { 
(0104)       --tx_counter0; 
     119 9180 014A LDS	R24,tx_counter0
     11B 5081      SUBI	R24,1
     11C 9380 014A STS	tx_counter0,R24
(0105)       UDR0=tx_buffer0[tx_rd_index0]; 
     11E E48D      LDI	R24,0x4D
     11F E091      LDI	R25,1
     120 91E0 014B LDS	R30,tx_rd_index0
     122 27FF      CLR	R31
     123 0FE8      ADD	R30,R24
     124 1FF9      ADC	R31,R25
     125 8020      LDD	R2,Z+0
     126 9220 00C6 STS	0x00C6,R2
(0106)       if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; 
     128 9180 014B LDS	R24,tx_rd_index0
     12A 5F8F      SUBI	R24,0xFF
     12B 2E28      MOV	R2,R24
     12C 9220 014B STS	tx_rd_index0,R2
     12E 3184      CPI	R24,0x14
     12F F419      BNE	0x0133
     130 2422      CLR	R2
     131 9220 014B STS	tx_rd_index0,R2
(0107)     }; 
     133 9029      LD	R2,Y+
     134 BE2F      OUT	0x3F,R2
     135 91F9      LD	R31,Y+
     136 91E9      LD	R30,Y+
     137 9199      LD	R25,Y+
     138 9189      LD	R24,Y+
     139 9029      LD	R2,Y+
     13A 9518      RETI
_putchar:
  IisOn                --> R20
  c                    --> R16
     13B 934A      ST	R20,-Y
(0108) } 
(0109) 
(0110) 
(0111) 
(0112) // Write a character to the USART0 Transmitter buffer 
(0113) void putchar(char c) 
(0114) { 
(0115)   char IisOn = 1;
     13C E041      LDI	R20,1
(0116)   if((SREG & 0x80) == 0x00)  //I之前是否置位
     13D B62F      IN	R2,0x3F
     13E FC27      SBRC	R2,7
     13F C001      RJMP	0x0141
(0117)     IisOn = 0;
     140 2744      CLR	R20
(0118)   while (tx_counter0 == TX_BUFFER_SIZE0); 
     141 9180 014A LDS	R24,tx_counter0
     143 3184      CPI	R24,0x14
     144 F3E1      BEQ	0x0141
(0119)   CLI(); 
     145 94F8      BCLR	7
(0120)   if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) 
     146 9020 014A LDS	R2,tx_counter0
     148 2022      TST	R2
     149 F421      BNE	0x014E
     14A 9020 00C0 LDS	R2,0x00C0
     14C FC25      SBRC	R2,5
     14D C019      RJMP	0x0167
(0121)     { 
(0122)       tx_buffer0[tx_wr_index0]=c; 
     14E E48D      LDI	R24,0x4D
     14F E091      LDI	R25,1
     150 91E0 014C LDS	R30,tx_wr_index0
     152 27FF      CLR	R31
     153 0FE8      ADD	R30,R24
     154 1FF9      ADC	R31,R25
     155 8300      STD	Z+0,R16
(0123)       if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; 
     156 9180 014C LDS	R24,tx_wr_index0
     158 5F8F      SUBI	R24,0xFF
     159 2E28      MOV	R2,R24
     15A 9220 014C STS	tx_wr_index0,R2
     15C 3184      CPI	R24,0x14
     15D F419      BNE	0x0161
     15E 2422      CLR	R2
     15F 9220 014C STS	tx_wr_index0,R2
(0124)       ++tx_counter0; 
     161 9180 014A LDS	R24,tx_counter0
     163 5F8F      SUBI	R24,0xFF
     164 9380 014A STS	tx_counter0,R24
(0125)     } 
     166 C002      RJMP	0x0169
(0126)   else 
(0127)     UDR0=c;
     167 9300 00C6 STS	0x00C6,R16
(0128)   if(IisOn)	 	
     169 2344      TST	R20
     16A F009      BEQ	0x016C
(0129)     SEI(); 
     16B 9478      BSET	7
     16C 9149      LD	R20,Y+
     16D 9508      RET
_DisposeBufDatas:
  spray2NumH           --> R14
  spray2NumL           --> R12
  spray1NumH           --> Y,+6
  spray1NumL           --> Y,+5
  tPump1On             --> R10
  tSpray1Cyc           --> Y,+3
  tSpray1On            --> Y,+2
  tPump1Cyc            --> Y,+1
  IisOn                --> Y,+0
     16E D2BA      RCALL	push_xgsetF0FC
     16F 9727      SBIW	R28,7
(0130) } 
(0131) 
(0132) void DisposeBufDatas(void)
(0133) {
(0134)  //定义变量
(0135)  unsigned char tPump1Cyc;         //油泵1周期,单位ms
(0136)  unsigned char tSpray1On;         //喷射脉宽,单位0.1ms
(0137)  //unsigned char tSpray1OnH;
(0138)  unsigned int tSpray1Cyc;        //喷射周期,单位ms
(0139)  unsigned char tPump1On;       //油泵1脉宽,单位0.1ms
(0140)  char spray1NumL;                 //SprayNum低字节
(0141)  char spray1NumH;                 //SprayNum高字节
(0142)  
(0143)  //unsigned char tPump2Cyc;         //油泵2周期,单位ms
(0144)  //unsigned char tSpray2On;         //喷射脉宽,单位0.1ms
(0145)  //unsigned int tSpray2Cyc;        //喷射周期,单位ms
(0146)  //unsigned char tPump2On;       //油泵2脉宽,单位0.1ms
(0147)  char spray2NumL;                 //SprayNum低字节
(0148)  char spray2NumH;                 //SprayNum高字节
(0149)  
(0150)  char IisOn = 1;
     170 2400      CLR	R0

⌨️ 快捷键说明

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