📄 motor_speed.lst
字号:
__text_start:
__start:
0031 E5CF LDI R28,0x5F
0032 E0D4 LDI R29,4
0033 BFCD OUT 0x3D,R28
0034 BFDE OUT 0x3E,R29
0035 51C0 SUBI R28,0x10
0036 40D0 SBCI R29,0
0037 EA0A LDI R16,0xAA
0038 8308 STD Y+0,R16
0039 2400 CLR R0
003A E6E4 LDI R30,0x64
003B E0F0 LDI R31,0
003C E010 LDI R17,0
003D 36EB CPI R30,0x6B
003E 07F1 CPC R31,R17
003F F011 BEQ 0x0042
0040 9201 ST R0,Z+
0041 CFFB RJMP 0x003D
0042 8300 STD Z+0,R16
0043 E5EE LDI R30,0x5E
0044 E0F0 LDI R31,0
0045 E6A0 LDI R26,0x60
0046 E0B0 LDI R27,0
0047 E010 LDI R17,0
0048 36E2 CPI R30,0x62
0049 07F1 CPC R31,R17
004A F021 BEQ 0x004F
004B 95C8 LPM
004C 9631 ADIW R30,1
004D 920D ST R0,X+
004E CFF9 RJMP 0x0048
004F 940E011F CALL _main
_exit:
0051 CFFF RJMP _exit
FILE: C:\icc\speedloop\motor_main.c
(0001) //ICC-AVR application builder : 2005-8-3
(0002) // Target : M16
(0003) // Crystal: 4.0000Mhz
(0004) //closed speed loop controlling
(0005)
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008)
(0009) #pragma data:code
(0010) const unsigned char table[]={0xbd,0x84,0xd9,0xcd,0xe4,0x6d,0x7d,0x85,0xfd,0xed};//7segment
(0011) #pragma data:data
(0012) unsigned char ledbuff[]={0xbd,0xbd,0xbd,0xbd};
(0013)
(0014) unsigned char adc_res8,count;
(0015) unsigned char ad_mux;
(0016) unsigned int adc_res16,count16;
(0017)
(0018) void port_init(void)
(0019) {
(0020) PORTA = 0x00;
_port_init:
0052 2422 CLR R2
0053 BA2B OUT 0x1B,R2
(0021) DDRA = 0xF0;//HIGH 4BIT AS OUTPUT
0054 EF80 LDI R24,0xF0
0055 BB8A OUT 0x1A,R24
(0022) PORTB = 0x00;
0056 BA28 OUT 0x18,R2
(0023) DDRB = 0xfd;//t1 input other output
0057 EF8D LDI R24,0xFD
0058 BB87 OUT 0x17,R24
(0024) PORTC = 0x00; //m103 output only
0059 BA25 OUT 0x15,R2
(0025) DDRC = 0x00;
005A BA24 OUT 0x14,R2
(0026) PORTD = 0x00;
005B BA22 OUT 0x12,R2
(0027) DDRD = 0xFF;//port d as a output
005C EF8F LDI R24,0xFF
005D BB81 OUT 0x11,R24
005E 9508 RET
(0028) }
(0029)
(0030)
(0031) //TIMER0 initialize - prescale:64
(0032) // WGM: Normal
(0033) // desired value: 2mSec
(0034) // actual value: 2.000mSec (0.0%)
(0035) void timer0_init(void)
(0036) {
(0037) TCCR0 = 0x00; //stop
_timer0_init:
005F 2422 CLR R2
0060 BE23 OUT 0x33,R2
(0038) TCNT0 = 0x16; //set count
0061 E186 LDI R24,0x16
0062 BF82 OUT 0x32,R24
(0039) OCR0 = 0x57; //set compare
0063 E587 LDI R24,0x57
0064 BF8C OUT 0x3C,R24
(0040) TCCR0 = 0x05; //start timer
0065 E085 LDI R24,5
0066 BF83 OUT 0x33,R24
0067 9508 RET
_timer0_ovf_isr:
temp --> R16
0068 922A ST R2,-Y
0069 923A ST R3,-Y
006A 930A ST R16,-Y
006B 938A ST R24,-Y
006C 939A ST R25,-Y
006D B62F IN R2,0x3F
006E 922A ST R2,-Y
(0041) }
(0042)
(0043) #pragma interrupt_handler timer0_ovf_isr:10
(0044) void timer0_ovf_isr(void)
(0045) {
(0046) unsigned char temp;
(0047) temp=SREG;
006F B70F IN R16,0x3F
(0048) //unsigned int temp16;
(0049) TCCR1B=0X00;//STOP T1
0070 2422 CLR R2
0071 BC2E OUT 0x2E,R2
(0050) TCCR0=0X00;//STOP T0
0072 BE23 OUT 0x33,R2
(0051) count++;
0073 91800069 LDS R24,_count
0075 5F8F SUBI R24,0xFF
0076 93800069 STS _count,R24
(0052) count16=TCNT1;
0078 B42C IN R2,0x2C
0079 B43D IN R3,0x2D
007A 92300065 STS _count16+1,R3
007C 92200064 STS _count16,R2
(0053) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
007E 2422 CLR R2
007F BC2D OUT 0x2D,R2
(0054) TCNT1L = 0x00 /*INVALID SETTING*/;
0080 BC2C OUT 0x2C,R2
(0055)
(0056) TCNT0 = 0x16; //reload counter value
0081 E186 LDI R24,0x16
0082 BF82 OUT 0x32,R24
(0057) OCR0=0X57;
0083 E587 LDI R24,0x57
0084 BF8C OUT 0x3C,R24
(0058) TCCR0=0X05;//START TIMER0
0085 E085 LDI R24,5
0086 BF83 OUT 0x33,R24
(0059) TCCR1B=0X07;//START T1
0087 E087 LDI R24,7
0088 BD8E OUT 0x2E,R24
(0060) if (count16==0)
0089 90200064 LDS R2,_count16
008B 90300065 LDS R3,_count16+1
008D 2022 TST R2
008E F421 BNE 0x0093
008F 2033 TST R3
0090 F411 BNE 0x0093
(0061) {
(0062) TCCR0=0X00;
0091 2422 CLR R2
0092 BE23 OUT 0x33,R2
(0063) }
(0064) SREG=temp;
0093 BF0F OUT 0x3F,R16
0094 9029 LD R2,Y+
0095 BE2F OUT 0x3F,R2
0096 9199 LD R25,Y+
0097 9189 LD R24,Y+
0098 9109 LD R16,Y+
0099 9039 LD R3,Y+
009A 9029 LD R2,Y+
009B 9518 RETI
(0065) }
(0066) //TIMER1 initialize - prescale:Rising edge
(0067) // WGM: 0) Normal, TOP=0xFFFF
(0068) // desired value: 1Hz
(0069) // actual value: Out of range
(0070) void timer1_init(void)
(0071) {
(0072) TCCR1B = 0x00; //stop
_timer1_init:
009C 2422 CLR R2
009D BC2E OUT 0x2E,R2
(0073) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
009E BC2D OUT 0x2D,R2
(0074) TCNT1L = 0x00 /*INVALID SETTING*/;
009F BC2C OUT 0x2C,R2
(0075) OCR1AH = 0x00 /*INVALID SETTING*/;
00A0 BC2B OUT 0x2B,R2
(0076) OCR1AL = 0x00 /*INVALID SETTING*/;
00A1 BC2A OUT 0x2A,R2
(0077) OCR1BH = 0x00 /*INVALID SETTING*/;
00A2 BC29 OUT 0x29,R2
(0078) OCR1BL = 0x00 /*INVALID SETTING*/;
00A3 BC28 OUT 0x28,R2
(0079) //OCR1CH = $OCR1CH$;
(0080) //OCR1CL = $OCR1CL$;
(0081) ICR1H = 0x00 /*INVALID SETTING*/;
00A4 BC27 OUT 0x27,R2
(0082) ICR1L = 0x00 /*INVALID SETTING*/;
00A5 BC26 OUT 0x26,R2
(0083) TCCR1A = 0x00;
00A6 BC2F OUT 0x2F,R2
(0084) TCCR1B = 0x07; //start Timer
00A7 E087 LDI R24,7
00A8 BD8E OUT 0x2E,R24
00A9 9508 RET
(0085) }
(0086)
(0087) //TIMER2 initialize - prescale:1
(0088) // WGM: PWM Phase correct
(0089) // actual value: 15.686KHz (93.6%)
(0090) void timer2_init(void)
(0091) {
(0092) TCCR2 = 0x00; //stop
_timer2_init:
00AA 2422 CLR R2
00AB BC25 OUT 0x25,R2
(0093) ASSR = 0x00; //set async mode
00AC BC22 OUT 0x22,R2
(0094) TCNT2 = 0x01; //setup
00AD E081 LDI R24,1
00AE BD84 OUT 0x24,R24
(0095) OCR2 = 0xFF;
00AF EF8F LDI R24,0xFF
00B0 BD83 OUT 0x23,R24
(0096) TCCR2 = 0x61; //start
00B1 E681 LDI R24,0x61
00B2 BD85 OUT 0x25,R24
00B3 9508 RET
(0097) }
(0098)
(0099) //#pragma interrupt_handler timer2_ovf_isr:5
(0100) //void timer2_ovf_isr(void)
(0101) //{
(0102) // unsigned char temp;
(0103) // temp=SREG;
(0104) // OCR2=adc_res8;
(0105) // SREG=temp;
(0106) //}
(0107)
(0108) //ADC initialize
(0109) // Conversion time: 3uS
(0110) void adc_init(void)
(0111) {ad_mux=0x01;
_adc_init:
00B4 E081 LDI R24,1
00B5 93800068 STS _ad_mux,R24
(0112) ADCSR = 0x00; //disable adc
00B7 2422 CLR R2
00B8 B826 OUT 0x06,R2
(0113) ADMUX = (1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f); //select adc input 0
00B9 708F ANDI R24,0xF
00BA 6E80 ORI R24,0xE0
00BB B987 OUT 0x07,R24
(0114) ACSR = 0x80;
00BC E880 LDI R24,0x80
00BD B988 OUT 0x08,R24
(0115) ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
00BE EC8E LDI R24,0xCE
00BF B986 OUT 0x06,R24
00C0 9508 RET
(0116) }
(0117)
(0118) //#pragma interrupt_handler adc_isr:15
(0119) //void adc_isr(void)
(0120) //{
(0121) // unsigned char temp;
(0122) // temp=SREG;
(0123) // adc_res8=ADCH;
(0124) //hex2bcd(adc_res8);
(0125) //ad_mux=0x01;
(0126) //ADMUX=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(ad_mux&0x0f);
(0127) // ADCSRA|=(1<<ADSC);//start adc again
(0128) // SREG=temp;
(0129) //}
(0130)
(0131) //call this routine to initialize all peripherals
(0132) void init_devices(void)
(0133) {
(0134) //stop errant interrupts until set up
(0135) CLI(); //disable all interrupts
_init_devices:
00C1 94F8 BCLR 7
(0136) port_init();
00C2 DF8F RCALL _port_init
(0137) timer0_init();
00C3 DF9B RCALL _timer0_init
(0138) timer1_init();
00C4 DFD7 RCALL _timer1_init
(0139) timer2_init();
00C5 DFE4 RCALL _timer2_init
(0140) //adc_init();
(0141)
(0142) MCUCR = 0x00;
00C6 2422 CLR R2
00C7 BE25 OUT 0x35,R2
(0143) GICR = 0x00;
00C8 BE2B OUT 0x3B,R2
(0144) TIMSK = 0x41; //enable timer0 timer2 interrupt sources
00C9 E481 LDI R24,0x41
00CA BF89 OUT 0x39,R24
(0145) SEI(); //re-enable interrupts
00CB 9478 BSET 7
00CC 9508 RET
(0146) //all peripherals are now initialized
(0147) }
(0148) void delay_1ms(void)
(0149) {
(0150) unsigned int i;
(0151) for (i=0;i<542;i++)
_delay_1ms:
i --> R16
00CD 2700 CLR R16
00CE 2711 CLR R17
00CF C002 RJMP 0x00D2
00D0 5F0F SUBI R16,0xFF
00D1 4F1F SBCI R17,0xFF
00D2 310E CPI R16,0x1E
00D3 E0E2 LDI R30,2
00D4 071E CPC R17,R30
00D5 F3D0 BCS 0x00D0
00D6 9508 RET
_hex2bcd:
temp --> R20
i --> R22
cnt --> R10
00D7 940E0166 CALL push_gset3
00D9 0158 MOVW R10,R16
(0152) ;
(0153) }
(0154) void hex2bcd(unsigned int cnt)
(0155) {
(0156) unsigned char i,temp;
(0157) for (i=0;i<4;i++)
00DA 2766 CLR R22
00DB C01B RJMP 0x00F7
(0158) {
(0159) temp=cnt%10;
00DC E02A LDI R18,0xA
00DD E030 LDI R19,0
00DE 0185 MOVW R16,R10
00DF 940E012C CALL mod16u
00E1 2F40 MOV R20,R16
(0160) ledbuff[i]=table[temp];
00E2 E584 LDI R24,0x54
00E3 E090 LDI R25,0
00E4 2FE4 MOV R30,R20
00E5 27FF CLR R31
00E6 0FE8 ADD R30,R24
00E7 1FF9 ADC R31,R25
00E8 91E4 LPM R30,0(Z)
00E9 E680 LDI R24,0x60
00EA E090 LDI R25,0
00EB 2FA6 MOV R26,R22
00EC 27BB CLR R27
00ED 0FA8 ADD R26,R24
00EE 1FB9 ADC R27,R25
00EF 93EC ST R30,0(X)
(0161) cnt=cnt/10;
00F0 E02A LDI R18,0xA
00F1 E030 LDI R19,0
00F2 0185 MOVW R16,R10
00F3 940E012E CALL div16u
00F5 0158 MOVW R10,R16
00F6 9563 INC R22
00F7 3064 CPI R22,4
00F8 F318 BCS 0x00DC
00F9 940E0148 CALL pop_gset3
00FB 9508 RET
_display:
i --> R20
00FC 940E014B CALL push_gset1
(0162) }
(0163) }
(0164)
(0165) void display(void)
(0166) {
(0167) unsigned char i;
(0168) for (i=0;i<4;i++)
00FE 2744 CLR R20
00FF C01A RJMP 0x011A
(0169) {
(0170) PORTB=ledbuff[i];
0100 E680 LDI R24,0x60
0101 E090 LDI R25,0
0102 2FE4 MOV R30,R20
0103 27FF CLR R31
0104 0FE8 ADD R30,R24
0105 1FF9 ADC R31,R25
0106 8020 LDD R2,Z+0
0107 BA28 OUT 0x18,R2
(0171) PORTA=~(1<<(4+i));
0108 2F14 MOV R17,R20
0109 5F1C SUBI R17,0xFC
010A E001 LDI R16,1
010B 940E016A CALL lsl8
010D 2E20 MOV R2,R16
010E 9420 COM R2
010F BA2B OUT 0x1B,R2
(0172) delay_1ms();
0110 DFBC RCALL _delay_1ms
(0173) PORTA|=(1<<(4+i));
0111 2F14 MOV R17,R20
0112 5F1C SUBI R17,0xFC
0113 E001 LDI R16,1
0114 940E016A CALL lsl8
0116 B22B IN R2,0x1B
0117 2A20 OR R2,R16
0118 BA2B OUT 0x1B,R2
0119 9543 INC R20
011A 3044 CPI R20,4
011B F320 BCS 0x0100
011C 940E014E CALL pop_gset1
011E 9508 RET
(0174) }
(0175) }
(0176)
(0177)
(0178) main()
(0179) {
(0180) init_devices();
_main:
011F DFA1 RCALL _init_devices
(0181) count=0;
0120 2422 CLR R2
0121 92200069 STS _count,R2
0123 C006 RJMP 0x012A
(0182) while(1)
(0183) {
(0184) //hex2bcd(adc_res8);
(0185) hex2bcd(count16);
0124 91000064 LDS R16,_count16
0126 91100065 LDS R17,_count16+1
0128 DFAE RCALL _hex2bcd
(0186) display();
FILE: <library>
0129 DFD2 RCALL _display
012A CFF9 RJMP 0x0124
012B 9508 RET
mod16u:
012C 9468 BSET 6
012D C001 RJMP xdiv16u
div16u:
012E 94E8 BCLR 6
xdiv16u:
012F 92EA ST R14,-Y
0130 92FA ST R15,-Y
0131 938A ST R24,-Y
0132 24EE CLR R14
0133 24FF CLR R15
0134 E180 LDI R24,0x10
0135 0F00 LSL R16
0136 1F11 ROL R17
0137 1CEE ROL R14
0138 1CFF ROL R15
0139 16E2 CP R14,R18
013A 06F3 CPC R15,R19
013B F018 BCS 0x013F
013C 1AE2 SUB R14,R18
013D 0AF3 SBC R15,R19
013E 9503 INC R16
013F 958A DEC R24
0140 F7A1 BNE 0x0135
0141 F416 BRTC 0x0144
0142 2D0E MOV R16,R14
0143 2D1F MOV R17,R15
0144 9189 LD R24,Y+
0145 90F9 LD R15,Y+
0146 90E9 LD R14,Y+
0147 9508 RET
pop_gset3:
0148 E0E4 LDI R30,4
0149 940C014F JMP pop
push_gset1:
014B 935A ST R21,-Y
014C 934A ST R20,-Y
014D 9508 RET
pop_gset1:
014E E0E1 LDI R30,1
pop:
014F 9149 LD R20,Y+
0150 9159 LD R21,Y+
0151 FDE0 SBRC R30,0
0152 9508 RET
0153 9169 LD R22,Y+
0154 9179 LD R23,Y+
0155 FDE1 SBRC R30,1
0156 9508 RET
0157 90A9 LD R10,Y+
0158 90B9 LD R11,Y+
0159 FDE2 SBRC R30,2
015A 9508 RET
015B 90C9 LD R12,Y+
015C 90D9 LD R13,Y+
015D FDE3 SBRC R30,3
015E 9508 RET
015F 90E9 LD R14,Y+
0160 90F9 LD R15,Y+
0161 9508 RET
push_gset2:
0162 937A ST R23,-Y
0163 936A ST R22,-Y
0164 940C014B JMP push_gset1
push_gset3:
0166 92BA ST R11,-Y
0167 92AA ST R10,-Y
0168 940C0162 JMP push_gset2
lsl8:
016A 2311 TST R17
016B F019 BEQ 0x016F
016C 0F00 LSL R16
016D 951A DEC R17
016E CFFB RJMP lsl8
016F 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -