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

📄 minid.lst

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    001A EFCF      LDI	R28,0xFF
    001B E0D2      LDI	R29,2
    001C BFCD      OUT	0x3D,R28
    001D BFDE      OUT	0x3E,R29
    001E 52C0      SUBI	R28,0x20
    001F 40D0      SBCI	R29,0
    0020 EA0A      LDI	R16,0xAA
    0021 8308      STD	Y+0,R16
    0022 2400      CLR	R0
    0023 E0E0      LDI	R30,0
    0024 E0F1      LDI	R31,1
    0025 E011      LDI	R17,1
    0026 31ED      CPI	R30,0x1D
    0027 07F1      CPC	R31,R17
    0028 F011      BEQ	0x002B
    0029 9201      ST	R0,Z+
    002A CFFB      RJMP	0x0026
    002B 8300      STD	Z+0,R16
    002C E3E4      LDI	R30,0x34
    002D E0F0      LDI	R31,0
    002E E0A0      LDI	R26,0
    002F E0B1      LDI	R27,1
    0030 E010      LDI	R17,0
    0031 33E4      CPI	R30,0x34
    0032 07F1      CPC	R31,R17
    0033 F021      BEQ	0x0038
    0034 95C8      LPM
    0035 9631      ADIW	R30,1
    0036 920D      ST	R0,X+
    0037 CFF9      RJMP	0x0031
    0038 D025      RCALL	_main
_exit:
    0039 CFFF      RJMP	_exit
FILE: E:\PMax\单片机源代码\函数库\MiniD\MiniD_20050711.c
(0001) //ICC-AVR application builder : 2005-7-11 14:38:07
(0002) // Target : M48
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include "Minid.h"
(0006) 
(0007) 
(0008) //函数定义
(0009) void adc_init(void); 					       //ADC initialize
(0010) void adc_isr(void);
(0011) word AdcPedal(word adcp);						//踏板信号转换为对应的控制值
(0012) 
(0013) 
(0014) void port_init(void)
(0015) {
(0016)  PORTB = 0xff;
_port_init:
    003A EF8F      LDI	R24,0xFF
    003B B985      OUT	0x05,R24
(0017)  DDRB  = 0x00;
    003C 2422      CLR	R2
    003D B824      OUT	0x04,R2
(0018)  PORTC = 0xff; //m103 output only
    003E B988      OUT	0x08,R24
(0019)  DDRC  = 0x00;
    003F B827      OUT	0x07,R2
(0020)  PORTD = 0xff;
    0040 B98B      OUT	0x0B,R24
(0021)  DDRD  = 0x00;
    0041 B82A      OUT	0x0A,R2
    0042 9508      RET
(0022) }
(0023) 
(0024) //call this routine to initialize all peripherals
(0025) void init_devices(void)
(0026) {
(0027)  //stop errant interrupts until set up
(0028)  CLI(); //disable all interrupts
_init_devices:
    0043 94F8      BCLR	7
(0029)  port_init();
    0044 DFF5      RCALL	_port_init
(0030)  timer1_init();
    0045 D04B      RCALL	_timer1_init
(0031) 
(0032)  MCUCR = 0x00;
    0046 2422      CLR	R2
    0047 BE25      OUT	0x35,R2
(0033)  EICRA = 0x00; //extended ext ints
    0048 92200069  STS	0x69,R2
(0034)  EIMSK = 0x00;
    004A BA2D      OUT	0x1D,R2
(0035)  
(0036)  TIMSK0 = 0x00; //timer 0 interrupt sources
    004B 9220006E  STS	0x6E,R2
(0037)  TIMSK1 = 0x21; //timer 1 interrupt sources
    004D E281      LDI	R24,0x21
    004E 9380006F  STS	0x6F,R24
(0038)  TIMSK2 = 0x00; //timer 2 interrupt sources
    0050 92200070  STS	0x70,R2
(0039)  
(0040)  PCMSK0 = 0x00; //pin change mask 0 
    0052 9220006B  STS	0x6B,R2
(0041)  PCMSK1 = 0x00; //pin change mask 1 
    0054 9220006C  STS	0x6C,R2
(0042)  PCMSK2 = 0x00; //pin change mask 2
    0056 9220006D  STS	0x6D,R2
(0043)  PCICR = 0x00; //pin change enable 
    0058 92200068  STS	0x68,R2
(0044)  PRR = 0x00; //power controller
    005A 92200064  STS	0x64,R2
(0045)  SEI(); //re-enable interrupts
    005C 9478      BSET	7
    005D 9508      RET
_main:
  d                    --> R20
  jj                   --> R22
  j                    --> R10
  i                    --> Y+0
    005E 9724      SBIW	R28,4
(0046)  //all peripherals are now initialized
(0047) }
(0048) 
(0049) //
(0050) void main(void)
(0051) {
(0052) 	dword i;
(0053) 	word j,jj;
(0054) 	byte d;
(0055) 	init_devices();
    005F DFE3      RCALL	_init_devices
(0056) 	
(0057) 	//insert your functional code here...
(0058) 	PIDInit (&sPID);
    0060 E00D      LDI	R16,0xD
    0061 E011      LDI	R17,1
    0062 D228      RCALL	_PIDInit
    0063 C02A      RJMP	0x008E
(0059) 	while (1)
(0060) 	{
(0061) 	i = g_DeltaEnc;
    0064 90400106  LDS	R4,g_DeltaEnc+2
    0066 90500107  LDS	R5,g_DeltaEnc+3
    0068 90200104  LDS	R2,g_DeltaEnc
    006A 90300105  LDS	R3,g_DeltaEnc+1
    006C 01FE      MOVW	R30,R28
    006D 8220      STD	Z+0,R2
    006E 8231      STD	Z+1,R3
    006F 8242      STD	Z+2,R4
    0070 8253      STD	Z+3,R5
(0062) 	j ++;
    0071 01C5      MOVW	R24,R10
    0072 9601      ADIW	R24,1
    0073 015C      MOVW	R10,R24
(0063) 	jj = AdcPedal(j);
    0074 018C      MOVW	R16,R24
    0075 D194      RCALL	_AdcPedal
    0076 01B8      MOVW	R22,R16
(0064) 	sPID.I = 0;
    0077 2422      CLR	R2
    0078 2433      CLR	R3
    0079 92300112  STS	0x112,R3
    007B 92200111  STS	0x111,R2
(0065) 	sPID.P = 0;
    007D 92300110  STS	sPID+3,R3
    007F 9220010F  STS	sPID+2,R2
(0066) 	sPID.SetValue = 5000;
    0081 E888      LDI	R24,0x88
    0082 E193      LDI	R25,0x13
    0083 9390010E  STS	sPID+1,R25
    0085 9380010D  STS	sPID,R24
(0067) 	d = PIDCalc(&sPID, i);
    0087 01FE      MOVW	R30,R28
    0088 8120      LDD	R18,Z+0
    0089 8131      LDD	R19,Z+1
    008A E00D      LDI	R16,0xD
    008B E011      LDI	R17,1
    008C D20C      RCALL	_PIDCalc
    008D 2F40      MOV	R20,R16
    008E CFD5      RJMP	0x0064
    008F 9624      ADIW	R28,4
    0090 9508      RET
FILE: E:\PMax\单片机源代码\函数库\ENC\ENC.c
(0001) /*****************************************************************
(0002)  *  文件名:      ENC.c
(0003)  *  版本号:      
(0004)  *  创作日期:    2005.7.7
(0005)  *  作者:        wangzq
(0006)  *  功能说明:    采集转速数值
(0007)  
(0008)  *  其它说明:    使用AVR单片机Atmaga48, 晶振:8Mhz
(0009)                   
(0010)  *****************************************************************/
(0011)  
(0012) 
(0013) /*****************************************************************
(0014) 
(0015)  *   修改日期:     
(0016)  *   修改人:	  
(0017)  *   修改原因:   
(0018)                   
(0019) *******************************************************************/
(0020) 
(0021) 
(0022) //包含文件
(0023) #include "ENC.h"
(0024) 
(0025) //TIMER1 initialize - prescale:1
(0026) // WGM: 0) Normal, TOP=0xFFFF
(0027) // desired value: 
(0028) // actual value: Out of range
(0029) void timer1_init(void)
(0030) {
(0031)  TCCR1B = 0x00; //stop
_timer1_init:
    0091 2422      CLR	R2
    0092 92200081  STS	0x81,R2
(0032)  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
    0094 92200085  STS	0x85,R2
(0033)  TCNT1L = 0x00 /*INVALID SETTING*/;
    0096 92200084  STS	0x84,R2
(0034)  OCR1AH = 0x00 /*INVALID SETTING*/;
    0098 92200089  STS	0x89,R2
(0035)  OCR1AL = 0x00 /*INVALID SETTING*/;
    009A 92200088  STS	0x88,R2
(0036)  OCR1BH = 0x00 /*INVALID SETTING*/;
    009C 9220008B  STS	0x8B,R2
(0037)  OCR1BL = 0x00 /*INVALID SETTING*/;
    009E 9220008A  STS	0x8A,R2
(0038)  ICR1H  = 0x00 /*INVALID SETTING*/;
    00A0 92200087  STS	0x87,R2
(0039)  ICR1L  = 0x00 /*INVALID SETTING*/;
    00A2 92200086  STS	0x86,R2
(0040)  TCCR1A = 0x00;
    00A4 92200080  STS	0x80,R2
(0041)  TCCR1B = 0xC1; //start Timer
    00A6 EC81      LDI	R24,0xC1
    00A7 93800081  STS	0x81,R24
    00A9 9508      RET
_timer1_capt_isr:
    00AA 922A      ST	R2,-Y
    00AB 923A      ST	R3,-Y
    00AC 924A      ST	R4,-Y
    00AD 925A      ST	R5,-Y
    00AE 928A      ST	R8,-Y
    00AF 929A      ST	R9,-Y
    00B0 938A      ST	R24,-Y
    00B1 939A      ST	R25,-Y
    00B2 93EA      ST	R30,-Y
    00B3 B62F      IN	R2,0x3F
    00B4 922A      ST	R2,-Y
    00B5 D4AD      RCALL	push_gset2
(0042) }
(0043) 
(0044) #pragma interrupt_handler timer1_capt_isr:11
(0045) void timer1_capt_isr(void)
(0046) {
(0047) 	g_CntUpdate = ICR1L;
    00B6 90200086  LDS	R2,0x86
    00B8 2433      CLR	R3
    00B9 9230010B  STS	g_CntUpdate+1,R3
    00BB 9220010A  STS	g_CntUpdate,R2
(0048) 	g_CntUpdate |=(int)ICR1H << 8;
    00BD 90200087  LDS	R2,0x87
    00BF 2433      CLR	R3
    00C0 2C32      MOV	R3,R2
    00C1 2422      CLR	R2
    00C2 9040010A  LDS	R4,g_CntUpdate
    00C4 9050010B  LDS	R5,g_CntUpdate+1
    00C6 2842      OR	R4,R2
    00C7 2853      OR	R5,R3
    00C8 9250010B  STS	g_CntUpdate+1,R5
    00CA 9240010A  STS	g_CntUpdate,R4
(0049) 	
(0050) 	if ((TIFR1&0x01) != 0)       //判断定时器1溢出
    00CC 9BB0      SBIS	0x16,0
    00CD C006      RJMP	0x00D4
(0051) 	{
(0052) 	g_TotalEnc++;
    00CE 9180010C  LDS	R24,g_TotalEnc
    00D0 5F8F      SUBI	R24,0xFF
    00D1 9380010C  STS	g_TotalEnc,R24
(0053) 	TIFR1 |= 0x01;              //取消定时器1溢出标志位
    00D3 9AB0      SBI	0x16,0
(0054) 	}
(0055) 	
(0056) 	if (g_CntOld < g_CntUpdate)
    00D4 9020010A  LDS	R2,g_CntUpdate
    00D6 9030010B  LDS	R3,g_CntUpdate+1
    00D8 90400108  LDS	R4,g_CntOld
    00DA 90500109  LDS	R5,g_CntOld+1
    00DC 1442      CP	R4,R2
    00DD 0453      CPC	R5,R3
    00DE F498      BCC	0x00F2
(0057) 	{
(0058) 	g_DeltaEnc = g_CntUpdate - g_CntOld;
    00DF 0112      MOVW	R2,R4
    00E0 9040010A  LDS	R4,g_CntUpdate
    00E2 9050010B  LDS	R5,g_CntUpdate+1
    00E4 1842      SUB	R4,R2
    00E5 0853      SBC	R5,R3
    00E6 0112      MOVW	R2,R4
    00E7 2444      CLR	R4
    00E8 2455      CLR	R5
    00E9 92300105  STS	g_DeltaEnc+1,R3
    00EB 92200104  STS	g_DeltaEnc,R2
    00ED 92500107  STS	g_DeltaEnc+3,R5
    00EF 92400106  STS	g_DeltaEnc+2,R4
(0059) 		
(0060) 	}
    00F1 C020      RJMP	0x0112
(0061) 	else 
(0062) 	{
(0063) 	g_DeltaEnc = (0x10000 - g_CntOld) + g_CntUpdate;
    00F2 90200108  LDS	R2,g_CntOld
    00F4 90300109  LDS	R3,g_CntOld+1
    00F6 2444      CLR	R4
    00F7 2455      CLR	R5
    00F8 E040      LDI	R20,0
    00F9 E050      LDI	R21,0
    00FA E061      LDI	R22,1
    00FB E070      LDI	R23,0
    00FC 1942      SUB	R20,R2
    00FD 0953      SBC	R21,R3
    00FE 0964      SBC	R22,R4
    00FF 0975      SBC	R23,R5
    0100 9020010A  LDS	R2,g_CntUpdate
    0102 9030010B  LDS	R3,g_CntUpdate+1
    0104 2444      CLR	R4
    0105 2455      CLR	R5
    0106 0D42      ADD	R20,R2
    0107 1D53      ADC	R21,R3
    0108 1D64      ADC	R22,R4
    0109 1D75      ADC	R23,R5
    010A 93500105  STS	g_DeltaEnc+1,R21
    010C 93400104  STS	g_DeltaEnc,R20
    010E 93700107  STS	g_DeltaEnc+3,R23
    0110 93600106  STS	g_DeltaEnc+2,R22
(0064) 	}
(0065) 	
(0066) 	if (g_TotalEnc > 10) 
    0112 E08A      LDI	R24,0xA
    0113 9020010C  LDS	R2,g_TotalEnc
    0115 1582      CP	R24,R2
    0116 F500      BCC	0x0137
(0067) 	g_TotalEnc = 10;
    0117 9380010C  STS	g_TotalEnc,R24
(0068) 	
(0069) 	for (; g_TotalEnc != 0; g_TotalEnc--)
    0119 C01D      RJMP	0x0137
(0070) 	{
(0071) 	g_DeltaEnc += 0x10000;
    011A E040      LDI	R20,0
    011B E050      LDI	R21,0
    011C E061      LDI	R22,1
    011D E070      LDI	R23,0
    011E 90400106  LDS	R4,g_DeltaEnc+2
    0120 90500107  LDS	R5,g_DeltaEnc+3
    0122 90200104  LDS	R2,g_DeltaEnc
    0124 90300105  LDS	R3,g_DeltaEnc+1
    0126 0E24      ADD	R2,R20
    0127 1E35      ADC	R3,R21
    0128 1E46      ADC	R4,R22
    0129 1E57      ADC	R5,R23
    012A 92300105  STS	g_DeltaEnc+1,R3
    012C 92200104  STS	g_DeltaEnc,R2
    012E 92500107  STS	g_DeltaEnc+3,R5
    0130 92400106  STS	g_DeltaEnc+2,R4
    0132 9180010C  LDS	R24,g_TotalEnc
    0134 5081      SUBI	R24,1
    0135 9380010C  STS	g_TotalEnc,R24
    0137 9020010C  LDS	R2,g_TotalEnc
    0139 2022      TST	R2
    013A F6F9      BNE	0x011A
(0072) 	}
(0073) 	/*
(0074) 	g_DeltaEnc *= 125;
(0075) 	g_DeltaEnc /=1000;
(0076) 	g_DeltaEnc *= 72;
(0077) 	g_DeltaEnc = 60000000 / g_DeltaEnc;
(0078) 	
(0079) 	//if (g_DeltaEnc > 6000)
(0080) 	//g_DeltaEnc = 6000;
(0081) 	//g_DeltaEnc *= 0xff;
(0082) 	//g_DeltaEnc /=6000;
(0083) 	*/
(0084) 	g_TotalEnc = 0;				//速度溢出标志清零
    013B 2422      CLR	R2
    013C 9220010C  STS	g_TotalEnc,R2
(0085) 	g_CntOld = g_CntUpdate;		//准备下次采样
    013E 9020010A  LDS	R2,g_CntUpdate
    0140 9030010B  LDS	R3,g_CntUpdate+1
    0142 92300109  STS	g_CntOld+1,R3
    0144 92200108  STS	g_CntOld,R2
    0146 D410      RCALL	pop_gset2
    0147 9029      LD	R2,Y+
    0148 BE2F      OUT	0x3F,R2
    0149 91E9      LD	R30,Y+
    014A 9199      LD	R25,Y+
    014B 9189      LD	R24,Y+
    014C 9099      LD	R9,Y+
    014D 9089      LD	R8,Y+
    014E 9059      LD	R5,Y+
    014F 9049      LD	R4,Y+
    0150 9039      LD	R3,Y+
    0151 9029      LD	R2,Y+
    0152 9518      RETI
_timer1_ovf_isr:
    0153 938A      ST	R24,-Y
    0154 939A      ST	R25,-Y
    0155 B78F      IN	R24,0x3F
    0156 938A      ST	R24,-Y
(0086) }
(0087) 
(0088) 
(0089) 
(0090) #pragma interrupt_handler timer1_ovf_isr:14
(0091) void timer1_ovf_isr(void)
(0092) {
(0093) 	g_TotalEnc ++; 				//速度溢出标志
    0157 9180010C  LDS	R24,g_TotalEnc
    0159 5F8F      SUBI	R24,0xFF
    015A 9380010C  STS	g_TotalEnc,R24
    015C 9189      LD	R24,Y+
    015D BF8F      OUT	0x3F,R24
    015E 9199      LD	R25,Y+
    015F 9189      LD	R24,Y+
    0160 9518      RETI
FILE: E:\PMax\单片机源代码\函数库\ADC\ADC.c
(0001) /*****************************************************************
(0002)  *  文件名:      ADC.c
(0003)  *  版本号:      
(0004)  *  创作日期:    2005.7.7
(0005)  *  作者:        fengzm
(0006)  *  功能说明:    可采集7个AD通道的值,使用了RC滤波;
(0007)  *  其它说明:    使用AVR单片机Atmaga48, 晶振:8Mhz
(0008)                   调用ADC文件的时候只需要输入通道号即可,如ADC(7);
(0009)  *****************************************************************/
(0010)  
(0011) 
(0012) /*****************************************************************
(0013) 
(0014)  *   修改日期:   2005.7.8  
(0015)  *   修改人:	  wangzq
(0016)  *   修改原因:   优化代码
(0017)                   定时器0溢出触发A/D转换
(0018)                   修改g_AdcNum改变通道号,默认值0;

⌨️ 快捷键说明

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