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

📄 motor_master.lst

📁 用ICC编写的程序包括SPI
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    002B E5CF      LDI	R28,0x5F
    002C E0D4      LDI	R29,4
    002D BFCD      OUT	0x3D,R28
    002E BFDE      OUT	0x3E,R29
    002F 52C0      SUBI	R28,0x20
    0030 40D0      SBCI	R29,0
    0031 EA0A      LDI	R16,0xAA
    0032 8308      STD	Y+0,R16
    0033 2400      CLR	R0
    0034 E6E2      LDI	R30,0x62
    0035 E0F0      LDI	R31,0
    0036 E011      LDI	R17,1
    0037 33ED      CPI	R30,0x3D
    0038 07F1      CPC	R31,R17
    0039 F011      BEQ	0x003C
    003A 9201      ST	R0,Z+
    003B CFFB      RJMP	0x0037
    003C 8300      STD	Z+0,R16
    003D E5E4      LDI	R30,0x54
    003E E0F0      LDI	R31,0
    003F E6A0      LDI	R26,0x60
    0040 E0B0      LDI	R27,0
    0041 E010      LDI	R17,0
    0042 35E6      CPI	R30,0x56
    0043 07F1      CPC	R31,R17
    0044 F021      BEQ	0x0049
    0045 95C8      LPM
    0046 9631      ADIW	R30,1
    0047 920D      ST	R0,X+
    0048 CFF9      RJMP	0x0042
    0049 940E0162  CALL	_main
_exit:
    004B CFFF      RJMP	_exit
FILE: F:\IccAvr_Pro\time_master.c
(0001) #include "time_master.h"
(0002) 
(0003) unsigned char timeflag;
(0004) unsigned char dispflag;
(0005) unsigned char disp_cnt;
(0006) 
(0007) //TIMER0 initialize - prescale:256
(0008) // WGM: Normal
(0009) // desired value: 5mSec
(0010) // actual value:  4.965mSec (0.7%)
(0011) void timer0_init(void)
(0012) {
(0013)  TCCR0 = 0x00; //stop
_timer0_init:
    004C 2422      CLR	R2
    004D BE23      OUT	0x33,R2
(0014)  TCNT0 = 0x71; //set count
    004E E781      LDI	R24,0x71
    004F BF82      OUT	0x32,R24
(0015)  OCR0  = 0x8F;  //set compare
    0050 E88F      LDI	R24,0x8F
    0051 BF8C      OUT	0x3C,R24
(0016)  TCCR0 = 0x04; //start timer
    0052 E084      LDI	R24,4
    0053 BF83      OUT	0x33,R24
(0017)  timeflag=1;
    0054 E081      LDI	R24,1
    0055 93800064  STS	timeflag,R24
    0057 9508      RET
_timer0_ovf_isr:
    0058 938A      ST	R24,-Y
    0059 B78F      IN	R24,0x3F
    005A 938A      ST	R24,-Y
(0018) }
(0019) 
(0020) #pragma interrupt_handler timer0_ovf_isr:10
(0021) void timer0_ovf_isr(void)
(0022) {
(0023)  TCNT0 = 0x71; //reload counter value
    005B E781      LDI	R24,0x71
    005C BF82      OUT	0x32,R24
(0024)  timeflag=1;
    005D E081      LDI	R24,1
    005E 93800064  STS	timeflag,R24
    0060 9189      LD	R24,Y+
    0061 BF8F      OUT	0x3F,R24
    0062 9189      LD	R24,Y+
    0063 9518      RETI
(0025) }
(0026) 
(0027) //TIMER2 initialize - prescale:256
(0028) // WGM: Normal
(0029) // desired value: 5mSec
(0030) // actual value:  4.965mSec (0.7%)
(0031) void timer2_init(void)
(0032) {
(0033)  TCCR2 = 0x00; //stop
_timer2_init:
    0064 2422      CLR	R2
    0065 BC25      OUT	0x25,R2
(0034)  ASSR  = 0x00; //set async mode
    0066 BC22      OUT	0x22,R2
(0035)  TCNT2 = 0x00; //setup
    0067 BC24      OUT	0x24,R2
(0036)  OCR2  = 0xD7;
    0068 ED87      LDI	R24,0xD7
    0069 BD83      OUT	0x23,R24
(0037)  TCCR2 = 0x07; //start
    006A E087      LDI	R24,7
    006B BD85      OUT	0x25,R24
(0038)  dispflag=0;
    006C 92200063  STS	dispflag,R2
(0039)  disp_cnt=0;
    006E 92200062  STS	disp_cnt,R2
    0070 9508      RET
_timer2_ovf_isr:
    0071 922A      ST	R2,-Y
    0072 923A      ST	R3,-Y
    0073 938A      ST	R24,-Y
    0074 939A      ST	R25,-Y
    0075 B62F      IN	R2,0x3F
    0076 922A      ST	R2,-Y
(0040) }
(0041) 
(0042) #pragma interrupt_handler timer2_ovf_isr:5
(0043) void timer2_ovf_isr(void)
(0044) {
(0045)  TCNT2 = 0x00; //reload counter value
    0077 2422      CLR	R2
    0078 BC24      OUT	0x24,R2
(0046)  if(disp_cnt++>100)
    0079 90200062  LDS	R2,disp_cnt
    007B 2433      CLR	R3
    007C 2D82      MOV	R24,R2
    007D 5F8F      SUBI	R24,0xFF
    007E 93800062  STS	disp_cnt,R24
    0080 E684      LDI	R24,0x64
    0081 1582      CP	R24,R2
    0082 F430      BCC	0x0089
(0047)  {
(0048)  disp_cnt=0;
    0083 2422      CLR	R2
    0084 92200062  STS	disp_cnt,R2
(0049)  dispflag=1;
    0086 E081      LDI	R24,1
    0087 93800063  STS	dispflag,R24
(0050)  }
    0089 9029      LD	R2,Y+
    008A BE2F      OUT	0x3F,R2
    008B 9199      LD	R25,Y+
    008C 9189      LD	R24,Y+
    008D 9039      LD	R3,Y+
    008E 9029      LD	R2,Y+
    008F 9518      RETI
_spi_stc_isr:
    0090 922A      ST	R2,-Y
    0091 938A      ST	R24,-Y
    0092 939A      ST	R25,-Y
    0093 93EA      ST	R30,-Y
    0094 93FA      ST	R31,-Y
    0095 B62F      IN	R2,0x3F
    0096 922A      ST	R2,-Y
FILE: F:\IccAvr_Pro\SPI_master.c
(0001) #include "SPI_master.h"
(0002) 
(0003) unsigned char SPI_rx_buff[SIZE];  
(0004) unsigned char SPI_tx_buff[SIZE];  
(0005) unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;  
(0006) unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok,SPI_datain,temp; 
(0007) 
(0008) #pragma interrupt_handler spi_stc_isr:11  
(0009) void spi_stc_isr(void)  
(0010) {  
(0011)   //PORTB|=BIT(SS);
(0012)     if (tx_counter)        //如果发送缓冲区中有待发的数据  
    0097 90200068  LDS	R2,tx_counter
    0099 2022      TST	R2
    009A F0D9      BEQ	0x00B6
(0013)   {  
(0014)      --tx_counter;  
    009B 2D82      MOV	R24,R2
    009C 5081      SUBI	R24,1
    009D 93800068  STS	tx_counter,R24
(0015) 	 
(0016) 	 SPDR = SPI_tx_buff[tx_rd_index]; //发送一个字节数据,并调整指针  
    009F E68F      LDI	R24,0x6F
    00A0 E090      LDI	R25,0
    00A1 91E00069  LDS	R30,tx_rd_index
    00A3 27FF      CLR	R31
    00A4 0FE8      ADD	R30,R24
    00A5 1FF9      ADC	R31,R25
    00A6 8020      LDD	R2,Z+0
    00A7 B82F      OUT	0x0F,R2
(0017)      SPI_ok=0;
    00A8 2422      CLR	R2
    00A9 92200067  STS	SPI_ok,R2
(0018) 	 if (++tx_rd_index == SIZE) tx_rd_index = 0;  
    00AB 91800069  LDS	R24,tx_rd_index
    00AD 5F8F      SUBI	R24,0xFF
    00AE 2E28      MOV	R2,R24
    00AF 92200069  STS	tx_rd_index,R2
    00B1 3684      CPI	R24,0x64
    00B2 F419      BNE	0x00B6
    00B3 2422      CLR	R2
    00B4 92200069  STS	tx_rd_index,R2
(0019)   }
(0020)   SPI_rx_buff[rx_wr_index] = SPDR;    //从ISP口读出收到的字节  
    00B6 ED83      LDI	R24,0xD3
    00B7 E090      LDI	R25,0
    00B8 91E0006E  LDS	R30,rx_wr_index
    00BA 27FF      CLR	R31
    00BB 0FE8      ADD	R30,R24
    00BC 1FF9      ADC	R31,R25
    00BD B02F      IN	R2,0x0F
    00BE 8220      STD	Z+0,R2
(0021)   
(0022)   SPI_datain=1;
    00BF E081      LDI	R24,1
    00C0 93800066  STS	SPI_datain,R24
(0023)   SPI_ok=1;
    00C2 93800067  STS	SPI_ok,R24
(0024)   if (++rx_wr_index == SIZE) rx_wr_index = 0;    //放入接收缓冲区,并调整队列指针  
    00C4 9180006E  LDS	R24,rx_wr_index
    00C6 5F8F      SUBI	R24,0xFF
    00C7 2E28      MOV	R2,R24
    00C8 9220006E  STS	rx_wr_index,R2
    00CA 3684      CPI	R24,0x64
    00CB F419      BNE	0x00CF
    00CC 2422      CLR	R2
    00CD 9220006E  STS	rx_wr_index,R2
(0025)   if (++rx_counter == SIZE)  
    00CF 9180006C  LDS	R24,rx_counter
    00D1 5F8F      SUBI	R24,0xFF
    00D2 2E28      MOV	R2,R24
    00D3 9220006C  STS	rx_counter,R2
    00D5 3684      CPI	R24,0x64
    00D6 F431      BNE	0x00DD
(0026)   {  
(0027)     rx_counter = 0;  
    00D7 2422      CLR	R2
    00D8 9220006C  STS	rx_counter,R2
(0028)     rx_buffer_overflow = 1;  
    00DA E081      LDI	R24,1
    00DB 9380006B  STS	rx_buffer_overflow,R24
(0029)   }  
    00DD 9029      LD	R2,Y+
    00DE BE2F      OUT	0x3F,R2
    00DF 91F9      LD	R31,Y+
    00E0 91E9      LD	R30,Y+
    00E1 9199      LD	R25,Y+
    00E2 9189      LD	R24,Y+
    00E3 9029      LD	R2,Y+
    00E4 9518      RETI
(0030)    //PORTB&=~BIT(SS);
(0031) }  
(0032) 
(0033) unsigned char getSPIchar(void)  
(0034) {  
(0035)   unsigned char data;  
(0036)   while (rx_counter == 0);     //无接收数据,等待  
_getSPIchar:
  data                 --> R16
    00E5 9020006C  LDS	R2,rx_counter
    00E7 2022      TST	R2
    00E8 F3E1      BEQ	0x00E5
(0037)   data = SPI_rx_buff[rx_rd_index];    //从接收缓冲区取出一个SPI收到的数据  
    00E9 ED83      LDI	R24,0xD3
    00EA E090      LDI	R25,0
    00EB 91E0006D  LDS	R30,rx_rd_index
    00ED 27FF      CLR	R31
    00EE 0FE8      ADD	R30,R24
    00EF 1FF9      ADC	R31,R25
    00F0 8100      LDD	R16,Z+0
(0038)   if (++rx_rd_index == SIZE) rx_rd_index = 0;    //调整指针  
    00F1 9180006D  LDS	R24,rx_rd_index
    00F3 5F8F      SUBI	R24,0xFF
    00F4 2E28      MOV	R2,R24
    00F5 9220006D  STS	rx_rd_index,R2
    00F7 3684      CPI	R24,0x64
    00F8 F419      BNE	0x00FC
    00F9 2422      CLR	R2
    00FA 9220006D  STS	rx_rd_index,R2
(0039)   CLI();  
    00FC 94F8      BCLR	7
(0040)   --rx_counter;  
    00FD 9180006C  LDS	R24,rx_counter
    00FF 5081      SUBI	R24,1
    0100 9380006C  STS	rx_counter,R24
(0041)   SEI();  
    0102 9478      BSET	7
(0042)   return data;  
    0103 9508      RET
(0043) }  
(0044) 
(0045) void putSPIchar(char c)  
(0046) {  
(0047)   while (tx_counter == SIZE);//发送缓冲区满,等待  
_putSPIchar:
  c                    --> R16
    0104 91800068  LDS	R24,tx_counter
    0106 3684      CPI	R24,0x64
    0107 F3E1      BEQ	0x0104
(0048)   CLI();  
    0108 94F8      BCLR	7
(0049)   if (tx_counter || (SPI_ok==0))//发送缓冲区已中有待发数据  
    0109 2388      TST	R24
    010A F421      BNE	0x010F
    010B 90200067  LDS	R2,SPI_ok
    010D 2022      TST	R2
    010E F4C9      BNE	0x0128
(0050)   {                //或SPI正在发送数据时  
(0051)     SPI_tx_buff[tx_wr_index] = c;    //将数据放入发送缓冲区排队  
    010F E68F      LDI	R24,0x6F
    0110 E090      LDI	R25,0
    0111 91E0006A  LDS	R30,tx_wr_index
    0113 27FF      CLR	R31
    0114 0FE8      ADD	R30,R24
    0115 1FF9      ADC	R31,R25
    0116 8300      STD	Z+0,R16
(0052)     if (++tx_wr_index == SIZE) tx_wr_index = 0;    //调整指针  
    0117 9180006A  LDS	R24,tx_wr_index
    0119 5F8F      SUBI	R24,0xFF
    011A 2E28      MOV	R2,R24
    011B 9220006A  STS	tx_wr_index,R2
    011D 3684      CPI	R24,0x64
    011E F419      BNE	0x0122
    011F 2422      CLR	R2
    0120 9220006A  STS	tx_wr_index,R2
(0053)     ++tx_counter;  
    0122 91800068  LDS	R24,tx_counter
    0124 5F8F      SUBI	R24,0xFF
    0125 93800068  STS	tx_counter,R24
(0054)   }  
    0127 C007      RJMP	0x012F
(0055)   else  
(0056)     {
(0057) 	//PORTB&=~BIT(SS);
(0058) 	SPDR = c;        //发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送  
    0128 B90F      OUT	0x0F,R16
(0059)     temp=SPDR;
    0129 B02F      IN	R2,0x0F
    012A 92200065  STS	temp,R2
(0060) 	SPI_ok=0;
    012C 2422      CLR	R2
    012D 92200067  STS	SPI_ok,R2
(0061) 	}
(0062)   SEI();  
    012F 9478      BSET	7
    0130 9508      RET
(0063) }  
(0064) 
(0065) 	   	   			 //主机模式
(0066) void spi_init(void)  
(0067) {    
(0068)   DDRB |= BIT(MOSI)|BIT(SCK)|BIT(SS);    //MISO=input and MOSI,SCK,SS = output 
_spi_init:
    0131 B387      IN	R24,0x17
    0132 6B80      ORI	R24,0xB0
    0133 BB87      OUT	0x17,R24
(0069)   DDRB &=~BIT(MISO); 
    0134 98BE      CBI	0x17,6
(0070)   PORTB|= BIT(SCK)|BIT(MOSI)|BIT(SS);    //MISO上拉电阻有效   
    0135 B388      IN	R24,0x18
    0136 6B80      ORI	R24,0xB0
    0137 BB88      OUT	0x18,R24
(0071)   SPCR = 0xD4;    //SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/4系统时钟速率  
    0138 ED84      LDI	R24,0xD4
    0139 B98D      OUT	0x0D,R24
(0072)   SPSR = 0x00;  
    013A 2422      CLR	R2
    013B B82E      OUT	0x0E,R2
(0073)   temp = SPSR;  
    013C B02E      IN	R2,0x0E
    013D 92200065  STS	temp,R2
(0074)   temp = SPDR;    //清空SPI,和中断标志,使SPI空闲
    013F B02F      IN	R2,0x0F
    0140 92200065  STS	temp,R2
(0075)   SPI_ok=1;
    0142 E081      LDI	R24,1
    0143 93800067  STS	SPI_ok,R24
(0076)   SPI_datain=0;  
    0145 2422      CLR	R2
    0146 92200066  STS	SPI_datain,R2

⌨️ 快捷键说明

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