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

📄 m8pwm.lst

📁 电动车控制器
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0023 E5CF      LDI	R28,0x5F
    0024 E0D4      LDI	R29,4
    0025 BFCD      OUT	0x3D,R28
    0026 BFDE      OUT	0x3E,R29
    0027 51C0      SUBI	R28,0x10
    0028 40D0      SBCI	R29,0
    0029 EA0A      LDI	R16,0xAA
    002A 8308      STD	Y+0,R16
    002B 2400      CLR	R0
    002C E6ED      LDI	R30,0x6D
    002D E0F0      LDI	R31,0
    002E E010      LDI	R17,0
    002F 37E7      CPI	R30,0x77
    0030 07F1      CPC	R31,R17
    0031 F011      BEQ	0x0034
    0032 9201      ST	R0,Z+
    0033 CFFB      RJMP	0x002F
    0034 8300      STD	Z+0,R16
    0035 E3E8      LDI	R30,0x38
    0036 E0F0      LDI	R31,0
    0037 E6A0      LDI	R26,0x60
    0038 E0B0      LDI	R27,0
    0039 E010      LDI	R17,0
    003A 34E5      CPI	R30,0x45
    003B 07F1      CPC	R31,R17
    003C F021      BEQ	0x0041
    003D 95C8      LPM
    003E 9631      ADIW	R30,1
    003F 920D      ST	R0,X+
    0040 CFF9      RJMP	0x003A
    0041 D269      RCALL	_main
_exit:
    0042 CFFF      RJMP	_exit
FILE: D:\EBIKE\eb_pro\M8ProV\M8pwm.c
(0001) /****************************************************************************** 
(0002) 程序名称:电机驱动程序 
(0003) 运行平台:ATMaga8 12m晶振 
(0004) 程序说明:通过输入来调节pw波 
(0005) pc3 作为ad输入 
(0006) 
(0007) PD5=运行状态指示灯
(0008) pb0=左转灯,pb1=右转灯,pb=0时灯亮, 左右灯同时亮起为刹车状态 
(0009)  2007-12-24
(0010) ******************************************************************************/ 
(0011) #include <iom8v.h> 
(0012) #include <macros.h> 
(0013) 
(0014) #pragma  interrupt_handler Timer1_vof:9  //计算速度信息
(0015) #pragma  interrupt_handler Adc_isr:15   // 采集握把信号
(0016) #pragma  interrupt_handler int0_isr:2    //用于计算每秒钟后轮转过的半圈数
(0017) #pragma  interrupt_handler int1_isr:3    //用于相应刹车 
(0018) #pragma  interrupt_handler uart0_rx_isr:12//串口接收程序
(0019) 
(0020) #define  uchar      unsigned char
(0021) #define  uint       unsigned int
(0022) #define  BRAKE_LED_ON      PORTC |=0x03
(0023) #define  BRAKE_LED_OFF     PORTC &=0xfc
(0024) #define  LEFT_LED_ON       PORTC |=0x01
(0025) #define  LEFT_LED_OFF      PORTC &=0xfe
(0026) #define  RIGHT_LED_ON      PORTC |=0x02
(0027) #define  RIGHT_LED_OFF     PORTC &=0xfd
(0028) #define  EEP_RANG          170
(0029) //Variable
(0030) unsigned char AdResult=0x10; //保存AD结果
(0031) unsigned char SpeedVal=0;    //速度
(0032) unsigned char RolCount=0;   //每秒钟后轮转过的半圈数
(0033) unsigned int  RolNum=0;     //记录总的圈数据,满1000米后将里程写入eeprom
(0034) unsigned int  KiloMeter=0;//里程数据
(0035) unsigned int  OldKiloMeter=0; //前一里程数据
(0036) unsigned char TenMeter=0;   //十米里程计数
(0037) unsigned char UartBuf[10],UartBufCount=0;
(0038) unsigned char LrLedReg=0;   //用于保存刹车灯的状态,以便在刹车释放后回复
(0039) unsigned char BrakeFlag=0;  //0=刹车松开,0x55=刹车
(0040) 
(0041) 
(0042) 
(0043) /***************************************************************************/ 
(0044) 
(0045)  /***************************************************************************/ 
(0046)  void Port_init(void); 
(0047)  void uart0_init(void);
(0048)  void uart0_tx(unsigned char tdata);
(0049)  void tx_pack(uchar mode);
(0050)  void Timer0_init(void); 
(0051)  void Timer1_init(void); 
(0052)  void Timer2_init(void);
(0053)  void SpeedControl(void);
(0054)  void Timer1a_c(void); 
(0055)  void Hardware_init(void); 
(0056)  void EepromWrite(uchar Address, uchar Data);
(0057)  uchar EepromRead(uchar Address);
(0058)  void Delay_ms(unsigned int delay_time); 
(0059)  void adc_init(void);   
(0060) /*************************************************************************** 
(0061)                                                     端口初始化 
(0062) ****************************************************************************/ 
(0063) void Port_init(void) 
(0064) { 
(0065)  
(0066)  PORTB=0b11110111; 
_Port_init:
    0043 EF87      LDI	R24,0xF7
    0044 BB88      OUT	0x18,R24
(0067)  DDRB =0b00001000;   //PB3用来输出pw波 
    0045 E088      LDI	R24,0x8
    0046 BB87      OUT	0x17,R24
(0068)  PORTC=0b11111100;   //上拉使能
    0047 EF8C      LDI	R24,0xFC
    0048 BB85      OUT	0x15,R24
(0069)  DDRC =0b00100011;   //pc0,1=LR_led,Pc5=led in 
    0049 E283      LDI	R24,0x23
    004A BB84      OUT	0x14,R24
    004B 9508      RET
(0070)  //PORTD=0xff; 
(0071)  //DDRD =0xe0;   // d6d7=lr_led
(0072)  
(0073) }
(0074) /*************************************************************************** 
(0075)              串口0初始化 
(0076) ****************************************************************************/  
(0077) // desired baud rate: 9600
(0078) // actual: baud rate:9615 (0.2%)
(0079) // char size: 8 bit
(0080) // parity: Disabled
(0081) void uart0_init(void)
(0082) {
(0083)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    004C 2422      CLR	R2
    004D B82A      OUT	0x0A,R2
(0084)  UCSRA = 0x00;
    004E B82B      OUT	0x0B,R2
(0085)  UCSRC = BIT(URSEL) | 0x06;
    004F E886      LDI	R24,0x86
    0050 BD80      OUT	0x20,R24
(0086)  UBRRL = 0x4D; //set baud rate lo
    0051 E48D      LDI	R24,0x4D
    0052 B989      OUT	0x09,R24
(0087)  UBRRH = 0x00; //set baud rate hi
    0053 BC20      OUT	0x20,R2
(0088)  UCSRB = 0x98;
    0054 E988      LDI	R24,0x98
    0055 B98A      OUT	0x0A,R24
    0056 9508      RET
(0089) }
(0090) 
(0091) /*************************************************************************** 
(0092)                                                     定时器1初始化 
(0093) ****************************************************************************/ 
(0094) //定时器1主要用来做速度扫描
(0095) void Timer1_init(void)                      
(0096) { 
(0097)  //定时器1部分 ,1024分频,定时1s 
(0098)    TCCR1B = 0x00; //stop
_Timer1_init:
    0057 2422      CLR	R2
    0058 BC2E      OUT	0x2E,R2
(0099)    TCNT1H = 0xD2; //setup
    0059 ED82      LDI	R24,0xD2
    005A BD8D      OUT	0x2D,R24
(0100)    TCNT1L = 0x3A;
    005B E38A      LDI	R24,0x3A
    005C BD8C      OUT	0x2C,R24
(0101)    OCR1AH = 0x3D;
    005D E38D      LDI	R24,0x3D
    005E BD8B      OUT	0x2B,R24
(0102)    OCR1AL = 0x09;
    005F E089      LDI	R24,0x9
    0060 BD8A      OUT	0x2A,R24
(0103)    OCR1BH = 0x3D;
    0061 E38D      LDI	R24,0x3D
    0062 BD89      OUT	0x29,R24
(0104)    OCR1BL = 0x09;
    0063 E089      LDI	R24,0x9
    0064 BD88      OUT	0x28,R24
(0105)    //OCR1CH = $OCR1CH$;
(0106)    //OCR1CL = $OCR1CL$;
(0107)    ICR1H  = 0x3D;
    0065 E38D      LDI	R24,0x3D
    0066 BD87      OUT	0x27,R24
(0108)    ICR1L  = 0x09;
    0067 E089      LDI	R24,0x9
    0068 BD86      OUT	0x26,R24
(0109)    TCCR1A = 0x00;
    0069 BC2F      OUT	0x2F,R2
(0110)    TCCR1B = 0x05; //start Timer
    006A E085      LDI	R24,5
    006B BD8E      OUT	0x2E,R24
    006C 9508      RET
(0111) } 
(0112) /*************************************************************************** 
(0113)            Timer2初始化 ,PWM
(0114) ****************************************************************************/ 
(0115) // desired value: 20KHz 
(0116) // actual value: 20.000KHz (0.0%) 
(0117) //定时器0用来产生PW波 
(0118) void Timer2_init(void)
(0119) {
(0120)  TCCR2 = 0x00; //stop
_Timer2_init:
    006D 2422      CLR	R2
    006E BC25      OUT	0x25,R2
(0121)  ASSR  = 0x00; //set async mode
    006F BC22      OUT	0x22,R2
(0122)  TCNT2 = 0x0; //setup
    0070 BC24      OUT	0x24,R2
(0123)  OCR2  = 0x1;//设置OCR2
    0071 E081      LDI	R24,1
    0072 BD83      OUT	0x23,R24
(0124)  TCCR2 = 0x69; //8M/8=1MHz,0x79
    0073 E689      LDI	R24,0x69
    0074 BD85      OUT	0x25,R24
    0075 9508      RET
(0125) }
(0126) /*************************************************************************** 
(0127)                                                     A/D初始化 
(0128) ****************************************************************************/ 
(0129) void adc_init(void) 
(0130) { 
(0131)  ADCSRA =0x0; //关闭AD 
_adc_init:
    0076 2422      CLR	R2
    0077 B826      OUT	0x06,R2
(0132)  ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1)|(1<<MUX0); //选择外部参考电源 ADC3 左对齐 
    0078 E683      LDI	R24,0x63
    0079 B987      OUT	0x07,R24
(0133)  ACSR = (1<<ACD); //关闭模拟比较器 
    007A E880      LDI	R24,0x80
    007B B988      OUT	0x08,R24
(0134)  ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频 
    007C E98D      LDI	R24,0x9D
    007D B986      OUT	0x06,R24
    007E 9508      RET
_Adc_isr:
    007F 922A      ST	R2,-Y
    0080 B62F      IN	R2,0x3F
    0081 922A      ST	R2,-Y
(0135)  } 
(0136) /*************************************************************************** 
(0137)                                                     A/D中断处理 
(0138) ****************************************************************************/ 
(0139) void Adc_isr(void) 
(0140) { 
(0141)  AdResult=ADCH; //读取高位数据(左对齐)
    0082 B025      IN	R2,0x05
    0083 92200060  STS	AdResult,R2
    0085 9029      LD	R2,Y+
    0086 BE2F      OUT	0x3F,R2
    0087 9029      LD	R2,Y+
    0088 9518      RETI
_Timer1_vof:
    0089 920A      ST	R0,-Y
    008A 921A      ST	R1,-Y
    008B 922A      ST	R2,-Y
    008C 923A      ST	R3,-Y
    008D 924A      ST	R4,-Y
    008E 925A      ST	R5,-Y
    008F 930A      ST	R16,-Y
    0090 931A      ST	R17,-Y
    0091 932A      ST	R18,-Y
    0092 933A      ST	R19,-Y
    0093 938A      ST	R24,-Y
    0094 939A      ST	R25,-Y
    0095 93EA      ST	R30,-Y
    0096 93FA      ST	R31,-Y
    0097 B60F      IN	R0,0x3F
    0098 920A      ST	R0,-Y
    0099 D266      RCALL	push_gset1
    009A 9724      SBIW	R28,4
(0142)  //OCR2 = 0xff - AdResult; //更新PWM参数  
(0143)  
(0144) } 
(0145) /*************************************************************************** 
(0146)           定时器1中断处理程序 
(0147) ****************************************************************************/ 
(0148) void Timer1_vof(void)                                      
(0149) //1s中断程序,用于检测转速
(0150) {    
(0151)    TCNT1=0xD23A;
    009B E38A      LDI	R24,0x3A
    009C ED92      LDI	R25,0xD2
    009D BD9D      OUT	0x2D,R25
    009E BD8C      OUT	0x2C,R24
(0152)    SpeedVal=RolCount*1.13;  //3.1415*3.6*后轮半径(0.1m)=1.13                   
    009F E20A      LDI	R16,0x2A
    00A0 E010      LDI	R17,0
    00A1 D27E      RCALL	lpm32
    00A2 933A      ST	R19,-Y
    00A3 932A      ST	R18,-Y
    00A4 931A      ST	R17,-Y
    00A5 930A      ST	R16,-Y
    00A6 91000062  LDS	R16,RolCount
    00A8 2711      CLR	R17
    00A9 D2F6      RCALL	int2fp
    00AA 933A      ST	R19,-Y
    00AB 932A      ST	R18,-Y
    00AC 931A      ST	R17,-Y
    00AD 930A      ST	R16,-Y
    00AE D3CB      RCALL	empy32f
    00AF 01FE      MOVW	R30,R28
    00B0 8300      STD	Z+0,R16
    00B1 8311      STD	Z+1,R17
    00B2 8322      STD	Z+2,R18
    00B3 8333      STD	Z+3,R19
    00B4 01FE      MOVW	R30,R28
    00B5 8020      LDD	R2,Z+0
    00B6 8031      LDD	R3,Z+1
    00B7 8042      LDD	R4,Z+2
    00B8 8053      LDD	R5,Z+3
    00B9 925A      ST	R5,-Y
    00BA 924A      ST	R4,-Y
    00BB 923A      ST	R3,-Y
    00BC 922A      ST	R2,-Y
    00BD E206      LDI	R16,0x26
    00BE E010      LDI	R17,0
    00BF D260      RCALL	lpm32
    00C0 933A      ST	R19,-Y
    00C1 932A      ST	R18,-Y
    00C2 931A      ST	R17,-Y
    00C3 930A      ST	R16,-Y
    00C4 D384      RCALL	cmp32f
    00C5 F0B4      BLT	0x00DC
    00C6 01FE      MOVW	R30,R28
    00C7 8020      LDD	R2,Z+0
    00C8 8031      LDD	R3,Z+1
    00C9 8042      LDD	R4,Z+2
    00CA 8053      LDD	R5,Z+3
    00CB 925A      ST	R5,-Y
    00CC 924A      ST	R4,-Y
    00CD 923A      ST	R3,-Y
    00CE 922A      ST	R2,-Y
    00CF E206      LDI	R16,0x26
    00D0 E010      LDI	R17,0
    00D1 D24E      RCALL	lpm32
    00D2 933A      ST	R19,-Y
    00D3 932A      ST	R18,-Y
    00D4 931A      ST	R17,-Y
    00D5 930A      ST	R16,-Y
    00D6 D325      RCALL	sub32f
    00D7 D28A      RCALL	fp2int
    00D8 01A8      MOVW	R20,R16
    00D9 5040      SUBI	R20,0
    00DA 4850      SBCI	R21,0x80
    00DB C007      RJMP	0x00E3
    00DC 01FE      MOVW	R30,R28
    00DD 8100      LDD	R16,Z+0
    00DE 8111      LDD	R17,Z+1
    00DF 8122      LDD	R18,Z+2
    00E0 8133      LDD	R19,Z+3
    00E1 D280      RCALL	fp2int
    00E2 01A8      MOVW	R20,R16
    00E3 93400061  STS	SpeedVal,R20
(0153)    RolCount=0;    
    00E5 2422      CLR	R2
    00E6 92200062  STS	RolCount,R2
    00E8 9624      ADIW	R28,4
    00E9 D219      RCALL	pop_gset1
    00EA 9009      LD	R0,Y+
    00EB BE0F      OUT	0x3F,R0
    00EC 91F9      LD	R31,Y+
    00ED 91E9      LD	R30,Y+
    00EE 9199      LD	R25,Y+
    00EF 9189      LD	R24,Y+
    00F0 9139      LD	R19,Y+
    00F1 9129      LD	R18,Y+
    00F2 9119      LD	R17,Y+
    00F3 9109      LD	R16,Y+
    00F4 9059      LD	R5,Y+
    00F5 9049      LD	R4,Y+
    00F6 9039      LD	R3,Y+
    00F7 9029      LD	R2,Y+
    00F8 9019      LD	R1,Y+
    00F9 9009      LD	R0,Y+
    00FA 9518      RETI
_int0_isr:
    00FB 922A      ST	R2,-Y
    00FC 923A      ST	R3,-Y
    00FD 938A      ST	R24,-Y
    00FE 939A      ST	R25,-Y
    00FF B62F      IN	R2,0x3F
    0100 922A      ST	R2,-Y
(0154)      
(0155) } 
(0156) /*************************************************************************** 
(0157)           外部中断0处理程序 
(0158) ****************************************************************************/
(0159) void int0_isr(void)
(0160) {
(0161)  //external interupt on INT0
(0162)     RolCount++;//半圈数增加	
    0101 91800062  LDS	R24,RolCount
    0103 5F8F      SUBI	R24,0xFF
    0104 93800062  STS	RolCount,R24
(0163) 	if(RolNum> 3183)//半圈=3.1416*0.1米=0.31416米,1000/0,31416=3183
    0106 E68F      LDI	R24,0x6F
    0107 E09C      LDI	R25,0xC
    0108 90200063  LDS	R2,RolNum
    010A 90300064  LDS	R3,RolNum+1
    010C 1582      CP	R24,R2
    010D 0593      CPC	R25,R3
    010E F478      BCC	0x011E
(0164) 	{
(0165) 	   RolNum=0;
    010F 2422      CLR	R2
    0110 2433      CLR	R3
    0111 92300064  STS	RolNum+1,R3
    0113 92200063  STS	RolNum,R2
(0166) 	   ++KiloMeter;//个位,十位不为0,只需要改变个位十位	
    0115 91800065  LDS	R24,KiloMeter
    0117 91900066  LDS	R25,KiloMeter+1
    0119 9601      ADIW	R24,1
    011A 93900066  STS	KiloMeter+1,R25
    011C 93800065  STS	KiloMeter,R24
(0167) 	}
    011E 9029      LD	R2,Y+
    011F BE2F      OUT	0x3F,R2
    0120 9199      LD	R25,Y+
    0121 9189      LD	R24,Y+
    0122 9039      LD	R3,Y+
    0123 9029      LD	R2,Y+
    0124 9518      RETI
_int1_isr:
    0125 922A      ST	R2,-Y

⌨️ 快捷键说明

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