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

📄 motor_speed.lst

📁 基于AVRICC开发环境的ATMEL mega16单片机的电机速度控制程序
💻 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 + -