📄 motor_master.lst
字号:
__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 + -