📄 motor_salve.lst
字号:
__start:
__text_start:
002D E5CF LDI R28,0x5F
002E E0D4 LDI R29,4
002F BFCD OUT 0x3D,R28
0030 BFDE OUT 0x3E,R29
0031 51C0 SUBI R28,0x10
0032 40D0 SBCI R29,0
0033 EA0A LDI R16,0xAA
0034 8308 STD Y+0,R16
0035 2400 CLR R0
0036 E6E6 LDI R30,0x66
0037 E0F0 LDI R31,0
0038 E010 LDI R17,0
0039 37E2 CPI R30,0x72
003A 07F1 CPC R31,R17
003B F011 BEQ 0x003E
003C 9201 ST R0,Z+
003D CFFB RJMP 0x0039
003E 8300 STD Z+0,R16
003F E5E4 LDI R30,0x54
0040 E0F0 LDI R31,0
0041 E6A0 LDI R26,0x60
0042 E0B0 LDI R27,0
0043 E010 LDI R17,0
0044 35EA CPI R30,0x5A
0045 07F1 CPC R31,R17
0046 F021 BEQ 0x004B
0047 95C8 LPM
0048 9631 ADIW R30,1
0049 920D ST R0,X+
004A CFF9 RJMP 0x0044
004B 940E0068 CALL _main
_exit:
004D CFFF RJMP _exit
FILE: F:\IccAvr_Pro\Motor_salve.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003)
(0004) #include "qep.h"
(0005) #include "SPI_slave.h"
(0006) #include "pwm.h"
(0007)
(0008)
(0009) extern unsigned char SPI_rx_buff[SPI_size];
(0010) extern unsigned char SPI_tx_buff[SPI_size];
(0011) extern unsigned char rx_index;
(0012) extern unsigned char tx_index,SPI_tx_flag;
(0013) extern int qep_cnt[QEP_size];
(0014) extern unsigned char pwm_value[2];
(0015) extern unsigned char pwm_flag;
(0016)
(0017)
(0018) void port_init(void)
(0019) {
(0020) PORTA = 0xFF;
_port_init:
004E EF8F LDI R24,0xFF
004F BB8B OUT 0x1B,R24
(0021) DDRA = 0x00;
0050 2422 CLR R2
0051 BA2A OUT 0x1A,R2
(0022) PORTB = 0xFF;
0052 BB88 OUT 0x18,R24
(0023) DDRB = 0x00;
0053 BA27 OUT 0x17,R2
(0024) PORTC = 0x00;
0054 BA25 OUT 0x15,R2
(0025) DDRC = 0x00;
0055 BA24 OUT 0x14,R2
(0026) PORTD = 0x00;
0056 BA22 OUT 0x12,R2
(0027) DDRD = 0x30;
0057 E380 LDI R24,0x30
0058 BB81 OUT 0x11,R24
0059 9508 RET
(0028) }
(0029)
(0030) //call this routine to initialize all peripherals
(0031) void init_devices(void)
(0032) {
(0033) //stop errant interrupts until set up
(0034) CLI(); //disable all interrupts
_init_devices:
005A 94F8 BCLR 7
(0035) port_init();
005B DFF2 RCALL _port_init
(0036) pwm_init();
005C 940E00BE CALL _pwm_init
(0037) spi_init();
005E 940E01AD CALL _spi_init
(0038)
(0039) MCUCR = 0x0A;
0060 E08A LDI R24,0xA
0061 BF85 OUT 0x35,R24
(0040) GICR = 0xC0;
0062 EC80 LDI R24,0xC0
0063 BF8B OUT 0x3B,R24
(0041) TIMSK = 0x00; //timer interrupt sources
0064 2422 CLR R2
0065 BE29 OUT 0x39,R2
(0042) SEI(); //re-enable interrupts
0066 9478 BSET 7
0067 9508 RET
(0043) //all peripherals are now initialized
(0044) }
(0045) void main(void)
(0046) {
(0047) init_devices();
_main:
0068 DFF1 RCALL _init_devices
0069 C009 RJMP 0x0073
(0048)
(0049) while(1)
(0050) {
(0051) if(pwm_flag)
006A 90200066 LDS R2,pwm_flag
006C 2022 TST R2
006D F029 BEQ 0x0073
(0052) {
(0053) pwm_change();
006E 940E00D4 CALL _pwm_change
(0054) pwm_flag=0;
0070 2422 CLR R2
0071 92200066 STS pwm_flag,R2
0073 CFF6 RJMP 0x006A
0074 9508 RET
_int0_isr:
0075 938A ST R24,-Y
0076 939A ST R25,-Y
0077 B78F IN R24,0x3F
0078 938A ST R24,-Y
FILE: F:\IccAvr_Pro\qep.c
(0001) #include "qep.h"
(0002) int qep_cnt[QEP_size]={0x0000,0x0000};
(0003) #pragma interrupt_handler int0_isr:2
(0004) void int0_isr(void)
(0005) {
(0006) //external interupt on INT0
(0007) if(PINC&BIT(QEP_B1))
0079 B383 IN R24,0x13
007A 7081 ANDI R24,1
007B F051 BEQ 0x0086
(0008) qep_cnt[0]--;
007C 91800060 LDS R24,qep_cnt
007E 91900061 LDS R25,qep_cnt+1
0080 9701 SBIW R24,1
0081 93900061 STS qep_cnt+1,R25
0083 93800060 STS qep_cnt,R24
0085 C009 RJMP 0x008F
(0009) else
(0010) qep_cnt[0]++;
0086 91800060 LDS R24,qep_cnt
0088 91900061 LDS R25,qep_cnt+1
008A 9601 ADIW R24,1
008B 93900061 STS qep_cnt+1,R25
008D 93800060 STS qep_cnt,R24
008F 9189 LD R24,Y+
0090 BF8F OUT 0x3F,R24
0091 9199 LD R25,Y+
0092 9189 LD R24,Y+
0093 9518 RETI
_int1_isr:
0094 938A ST R24,-Y
0095 939A ST R25,-Y
0096 B78F IN R24,0x3F
0097 938A ST R24,-Y
(0011) }
(0012) #pragma interrupt_handler int1_isr:3
(0013) void int1_isr(void)
(0014) {
(0015) //external interupt on INT1
(0016) if(PINC&BIT(QEP_B2))
0098 B383 IN R24,0x13
0099 7082 ANDI R24,2
009A F051 BEQ 0x00A5
(0017) qep_cnt[1]--;
009B 91800062 LDS R24,qep_cnt+2
009D 91900063 LDS R25,qep_cnt+3
009F 9701 SBIW R24,1
00A0 93900063 STS qep_cnt+3,R25
00A2 93800062 STS qep_cnt+2,R24
00A4 C009 RJMP 0x00AE
(0018) else
(0019) qep_cnt[1]++;
00A5 91800062 LDS R24,qep_cnt+2
00A7 91900063 LDS R25,qep_cnt+3
00A9 9601 ADIW R24,1
00AA 93900063 STS qep_cnt+3,R25
00AC 93800062 STS qep_cnt+2,R24
00AE 9189 LD R24,Y+
00AF BF8F OUT 0x3F,R24
00B0 9199 LD R25,Y+
00B1 9189 LD R24,Y+
00B2 9518 RETI
(0020) }
(0021) void qep_set(void)
(0022) {
(0023) qep_cnt[0]=0;
_qep_set:
00B3 2422 CLR R2
00B4 2433 CLR R3
00B5 92300061 STS qep_cnt+1,R3
00B7 92200060 STS qep_cnt,R2
(0024) qep_cnt[1]=0;
00B9 92300063 STS qep_cnt+3,R3
00BB 92200062 STS qep_cnt+2,R2
00BD 9508 RET
FILE: F:\IccAvr_Pro\pwm.c
(0001)
(0002) #include "pwm.h"
(0003)
(0004)
(0005) unsigned char pwm_value[2]={0x7f,0x7f};
(0006) unsigned char pwm_flag;
(0007) //TIMER1 initialize - prescale:1
(0008) // WGM: 8) PWM phz freq correct, TOP=ICRn
(0009) // desired value: 14.4KHz
(0010) // actual value: 14.456KHz (0.4%)
(0011) void pwm_init(void)
(0012) {
(0013) DDRD|=BIT(OC1B)|BIT(OC1A);
_pwm_init:
00BE B381 IN R24,0x11
00BF 6380 ORI R24,0x30
00C0 BB81 OUT 0x11,R24
(0014) //PORTD|=BIT(OC1B)|BIT(OC1A);
(0015) TCCR1B = 0x00; //stop
00C1 2422 CLR R2
00C2 BC2E OUT 0x2E,R2
(0016) TCNT1H = 0x00; //setup
00C3 BC2D OUT 0x2D,R2
(0017) TCNT1L = 0x00;
00C4 BC2C OUT 0x2C,R2
(0018) OCR1AH = 0x00;
00C5 BC2B OUT 0x2B,R2
(0019) OCR1AL = 0x7F;
00C6 E78F LDI R24,0x7F
00C7 BD8A OUT 0x2A,R24
(0020) OCR1BH = 0x00;
00C8 BC29 OUT 0x29,R2
(0021) OCR1BL = 0x7F;
00C9 BD88 OUT 0x28,R24
(0022) ICR1H = 0x00;
00CA BC27 OUT 0x27,R2
(0023) ICR1L = 0xFF;
00CB EF8F LDI R24,0xFF
00CC BD86 OUT 0x26,R24
(0024) TCCR1A = 0xA0;
00CD EA80 LDI R24,0xA0
00CE BD8F OUT 0x2F,R24
(0025) TCCR1B = 0x11; //start Timer
00CF E181 LDI R24,0x11
00D0 BD8E OUT 0x2E,R24
(0026) pwm_flag=0;
00D1 92200066 STS pwm_flag,R2
00D3 9508 RET
(0027) }
(0028)
(0029) void pwm_change(void)
(0030) {
(0031) if(pwm_value[0]<3)
_pwm_change:
00D4 91800064 LDS R24,pwm_value
00D6 3083 CPI R24,3
00D7 F418 BCC 0x00DB
(0032) pwm_value[0]=3;
00D8 E083 LDI R24,3
00D9 93800064 STS pwm_value,R24
(0033) if(pwm_value[0]>253)
00DB EF8D LDI R24,0xFD
00DC 90200064 LDS R2,pwm_value
00DE 1582 CP R24,R2
00DF F410 BCC 0x00E2
(0034) pwm_value[0]=253;
00E0 93800064 STS pwm_value,R24
(0035) OCR1AH=0x00;
00E2 2422 CLR R2
00E3 BC2B OUT 0x2B,R2
(0036) OCR1AL=pwm_value[0];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -