📄 m8pwm.lst
字号:
__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 + -