📄 01.lst
字号:
__start:
__text_start:
003A E5CF LDI R28,0x5F
003B E0D4 LDI R29,4
003C BFCD OUT 0x3D,R28
003D BFDE OUT 0x3E,R29
003E 51C0 SUBI R28,0x10
003F 40D0 SBCI R29,0
0040 EA0A LDI R16,0xAA
0041 8308 STD Y+0,R16
0042 2400 CLR R0
0043 E6E0 LDI R30,0x60
0044 E0F0 LDI R31,0
0045 E010 LDI R17,0
0046 36E1 CPI R30,0x61
0047 07F1 CPC R31,R17
0048 F011 BEQ 0x004B
0049 9201 ST R0,Z+
004A CFFB RJMP 0x0046
004B 8300 STD Z+0,R16
004C E7E4 LDI R30,0x74
004D E0F0 LDI R31,0
004E E6A0 LDI R26,0x60
004F E0B0 LDI R27,0
0050 E010 LDI R17,0
0051 37E4 CPI R30,0x74
0052 07F1 CPC R31,R17
0053 F021 BEQ 0x0058
0054 95C8 LPM
0055 9631 ADIW R30,1
0056 920D ST R0,X+
0057 CFF9 RJMP 0x0051
0058 940E00E2 CALL _main
_exit:
005A CFFF RJMP _exit
_Delay100us:
i --> R20
n --> R16
005B 940E01C7 CALL push_gset1
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\unit.c
(0001) #include "config.h"
(0002) /***************************************************************************
(0003) 延时公式
(0004)
(0005) */
(0006) void Delay100us(uint8 n)
(0007) {
(0008) uint8 i; //4clock
(0009) for(i=147;n!=0;n--)
005D E943 LDI R20,0x93
005E C006 RJMP 0x0065
(0010) while(--i); //5 * i clock
005F 2F84 MOV R24,R20
0060 5081 SUBI R24,1
0061 2F48 MOV R20,R24
0062 2388 TST R24
0063 F7D9 BNE 0x005F
0064 950A DEC R16
0065 2300 TST R16
0066 F7C1 BNE 0x005F
0067 940E01CA CALL pop_gset1
0069 9508 RET
_Delay1ms:
n --> R20
006A 940E01C7 CALL push_gset1
006C 01A8 MOVW R20,R16
(0011) }
(0012) void Delay1ms(uint16 n)
(0013) {
(0014) for (;n!=0;n--){
006D C004 RJMP 0x0072
(0015) Delay100us(10);
006E E00A LDI R16,0xA
006F DFEB RCALL _Delay100us
0070 5041 SUBI R20,1
0071 4050 SBCI R21,0
0072 3040 CPI R20,0
0073 0745 CPC R20,R21
0074 F7C9 BNE 0x006E
0075 940E01CA CALL pop_gset1
0077 9508 RET
_Delay1s:
n --> R20
0078 940E01C7 CALL push_gset1
007A 01A8 MOVW R20,R16
(0016) }
(0017) }
(0018) void Delay1s(uint16 n)
(0019) {
(0020) n=n*40;
007B E208 LDI R16,0x28
007C E010 LDI R17,0
007D 019A MOVW R18,R20
007E 940E01AF CALL empy16s
0080 01A8 MOVW R20,R16
(0021) for (;n!=0;n--){
0081 C004 RJMP 0x0086
(0022) Delay100us(250);
0082 EF0A LDI R16,0xFA
0083 DFD7 RCALL _Delay100us
0084 5041 SUBI R20,1
0085 4050 SBCI R21,0
0086 3040 CPI R20,0
0087 0745 CPC R20,R21
0088 F7C9 BNE 0x0082
0089 940E01CA CALL pop_gset1
008B 9508 RET
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\init_device.c
(0001) //ICC-AVR application builder : 2006-9-7 0:27:10
(0002) // Target : M32
(0003) // Crystal: 7.3728Mhz
(0004) #include "config.h"
(0005)
(0006) void port_init(void)
(0007) {
(0008) PORTA = 0x00;
_port_init:
008C 2422 CLR R2
008D BA2B OUT 0x1B,R2
(0009) DDRA = 0x00;
008E BA2A OUT 0x1A,R2
(0010) PORTB = 0x00;
008F BA28 OUT 0x18,R2
(0011) DDRB = 0xFF;
0090 EF8F LDI R24,0xFF
0091 BB87 OUT 0x17,R24
(0012) PORTC = 0x00;
0092 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
0093 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
0094 BA22 OUT 0x12,R2
(0015) DDRD = 0x80;
0095 E880 LDI R24,0x80
0096 BB81 OUT 0x11,R24
0097 9508 RET
(0016) }
(0017)
(0018) //============timer1 PWM输出==================//
(0019) //TIMER0 initialize - prescale:1024
(0020) // desired value: 25mSec
(0021) // actual value: 25.000mSec (0.0%)
(0022) void timer0_init(void)
(0023) {
(0024) TCCR0 = 0x00; //stop
_timer0_init:
0098 2422 CLR R2
0099 BE23 OUT 0x33,R2
(0025) TCNT0= 0x01; //set count
009A E081 LDI R24,1
009B BF82 OUT 0x32,R24
(0026) OCR0 = 0x66; //set compare
009C E686 LDI R24,0x66
009D BF8C OUT 0x3C,R24
(0027) TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
009E E68C LDI R24,0x6C
009F BF83 OUT 0x33,R24
00A0 9508 RET
(0028) }
(0029)
(0030) //TIMER1 initialize - prescale:8
(0031) // desired value: 50mSec
(0032) // actual value: 50mSec (0.0%)
(0033) void timer1_init(void)
(0034) {
(0035) TCCR1B = 0x00; //stop
_timer1_init:
00A1 2422 CLR R2
00A2 BC2E OUT 0x2E,R2
(0036) TCNT1H = 0x4C; //setup
00A3 E48C LDI R24,0x4C
00A4 BD8D OUT 0x2D,R24
(0037) TCNT1L = 0x01;
00A5 E081 LDI R24,1
00A6 BD8C OUT 0x2C,R24
(0038) OCR1AH = 0xB3;
00A7 EB83 LDI R24,0xB3
00A8 BD8B OUT 0x2B,R24
(0039) OCR1AL = 0xFF;
00A9 EF8F LDI R24,0xFF
00AA BD8A OUT 0x2A,R24
(0040) OCR1BH = 0xB3;
00AB EB83 LDI R24,0xB3
00AC BD89 OUT 0x29,R24
(0041) OCR1BL = 0xFF;
00AD EF8F LDI R24,0xFF
00AE BD88 OUT 0x28,R24
(0042) ICR1H = 0xB3;
00AF EB83 LDI R24,0xB3
00B0 BD87 OUT 0x27,R24
(0043) ICR1L = 0xFF;
00B1 EF8F LDI R24,0xFF
00B2 BD86 OUT 0x26,R24
(0044) TCCR1A = 0x00;
00B3 BC2F OUT 0x2F,R2
(0045) TCCR1B = 0x02; //start Timer
00B4 E082 LDI R24,2
00B5 BD8E OUT 0x2E,R24
00B6 9508 RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
(0049) void timer2_init(void)
(0050) {
(0051) TCCR2 = 0x00; //stop
_timer2_init:
00B7 2422 CLR R2
00B8 BC25 OUT 0x25,R2
(0052) TCNT2= 0x01; //set count
00B9 E081 LDI R24,1
00BA BD84 OUT 0x24,R24
(0053) OCR2 = 0x66; //set compare
00BB E686 LDI R24,0x66
00BC BD83 OUT 0x23,R24
(0054) TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频
00BD E68E LDI R24,0x6E
00BE BD85 OUT 0x25,R24
00BF 9508 RET
(0055) //高比低为:(OCR2-0X55)/(0XFF-OCR2) OX55++++++(0X77)__________OXFF
(0056) //即OCR2越大,输出越大
(0057) }
(0058)
(0059) //call this routine to initialize all peripherals
(0060) void init_devices(void)
(0061) {
(0062) //stop errant interrupts until set up
(0063) CLI(); //disable all interrupts
_init_devices:
00C0 94F8 BCLR 7
(0064) port_init();
00C1 DFCA RCALL _port_init
(0065) timer2_init();
00C2 DFF4 RCALL _timer2_init
(0066) // timer1_init();
(0067) timer0_init();
00C3 DFD4 RCALL _timer0_init
(0068) MCUCR |= (1<<ISC01); // INT0,INT1 下降沿产生中断请求
00C4 B785 IN R24,0x35
00C5 6082 ORI R24,2
00C6 BF85 OUT 0x35,R24
(0069) //MCUCSR |= (1<<ISC2); //INT2上升沿产生中断请求
(0070) GICR |= (1<<INT0)|(1<<INT1);
00C7 B78B IN R24,0x3B
00C8 6C80 ORI R24,0xC0
00C9 BF8B OUT 0x3B,R24
(0071) TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(0<<OCIE2); //timer interrupt sources
00CA E483 LDI R24,0x43
00CB BF89 OUT 0x39,R24
(0072) SEI(); //re-enable interrupts
00CC 9478 BSET 7
00CD 9508 RET
_timer0_ovf_isr:
00CE 938A ST R24,-Y
00CF B78F IN R24,0x3F
00D0 938A ST R24,-Y
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\interupts.c
(0001) /*******************************************************************************
(0002) ** 文件名:interupts.c 中断处理函数
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005)
(0006) #pragma interrupt_handler timer0_ovf_isr:10
(0007) void timer0_ovf_isr(void)
(0008) {
(0009) TCNT0 = 0x01; //reload counter value
00D1 E081 LDI R24,1
00D2 BF82 OUT 0x32,R24
00D3 9189 LD R24,Y+
00D4 BF8F OUT 0x3F,R24
00D5 9189 LD R24,Y+
00D6 9518 RETI
(0010) }
(0011)
(0012) #pragma interrupt_handler timer0_comp_isr:20
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
00D7 9518 RETI
_timer2_ovf_isr:
00D8 938A ST R24,-Y
00D9 B78F IN R24,0x3F
00DA 938A ST R24,-Y
(0015) //compare occured TCNT0=OCR0
(0016) }
(0017)
(0018) #pragma interrupt_handler timer2_ovf_isr:6
(0019) void timer2_ovf_isr(void)
(0020) {
(0021) TCNT2 = 0x01; //reload counter value
00DB E081 LDI R24,1
00DC BD84 OUT 0x24,R24
00DD 9189 LD R24,Y+
00DE BF8F OUT 0x3F,R24
00DF 9189 LD R24,Y+
00E0 9518 RETI
(0022) }
(0023)
(0024) /******************************************************************************/
(0025) // T2 控制PWM输出
(0026) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0027) /******************************************************************************/
(0028)
(0029) #pragma interrupt_handler timer2_comp_isr:8
(0030) void timer2_comp_isr(void)
(0031) {
_timer2_comp_isr:
00E1 9518 RETI
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\main.c
(0001) /*******************************************************************************
(0002) ** 文件名:main.c 工程主文件
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005)
(0006) volatile uint8 flag; //小车状态
(0007) //0未偏 1左偏 2右偏 3前出线 4后出线 5脱轨
(0008) /*void main(void)
(0009) {
(0010) init_devices();
(0011) straight();
(0012)
(0013) flag_test(); //测试小车状态
(0014) while(1) //没有脱轨
(0015) {
(0016) flag_test();
(0017) switch(flag)
(0018) {
(0019) case 0: //正常情况将速度设成相等
(0020) motor_right_speed_set(0xFE);
(0021) motor_left_speed_set(0xFE);
(0022) break;
(0023) case 1:
(0024) mic_turn_right();
(0025) break;
(0026) case 2:
(0027) mic_turn_left();
(0028) break;
(0029) case 3:
(0030) break;
(0031) case 4:
(0032) break;
(0033) case 5:
(0034) stop();
(0035) break;
(0036) default:
(0037) break;
(0038) }
(0039) }
(0040) }/end main*/
(0041)
(0042) // moto test *****************************************************************
(0043)
(0044) void main(void)
(0045) {
(0046) init_devices();
_main:
00E2 940E00C0 CALL _init_devices
00E4 C02A RJMP 0x010F
(0047) while(1)
(0048) {
(0049)
(0050) straight();
00E5 940E0158 CALL _straight
(0051) Delay1ms(1000);
00E7 EE08 LDI R16,0xE8
00E8 E013 LDI R17,3
00E9 940E006A CALL _Delay1ms
(0052) turn_left();
00EB 940E015D CALL _turn_left
(0053) Delay1ms(100);
00ED E604 LDI R16,0x64
00EE E010 LDI R17,0
00EF 940E006A CALL _Delay1ms
(0054) turn_right();
00F1 940E0162 CALL _turn_right
(0055) Delay1ms(100);
00F3 E604 LDI R16,0x64
00F4 E010 LDI R17,0
00F5 940E006A CALL _Delay1ms
(0056)
(0057) straight_back();
00F7 940E0167 CALL _straight_back
(0058) Delay1ms(500);
00F9 EF04 LDI R16,0xF4
00FA E011 LDI R17,1
00FB 940E006A CALL _Delay1ms
(0059) mic_turn_left();
00FD 940E0174 CALL _mic_turn_left
(0060) Delay1ms(100);
00FF E604 LDI R16,0x64
0100 E010 LDI R17,0
0101 940E006A CALL _Delay1ms
(0061)
(0062) mic_turn_right();
0103 940E016F CALL _mic_turn_right
(0063) Delay1ms(100);
0105 E604 LDI R16,0x64
0106 E010 LDI R17,0
0107 940E006A CALL _Delay1ms
(0064) stop();
0109 940E016C CALL _stop
(0065) Delay1ms(500);
010B EF04 LDI R16,0xF4
010C E011 LDI R17,1
010D 940E006A CALL _Delay1ms
010F CFD5 RJMP 0x00E5
0110 9508 RET
FILE: C:\DOCUME~1\Administrator.1B4135EF7FF9405\桌面\小车寻迹\motor.c
(0001) /****************************************************************
(0002) ** 文件名:motor.c 电机驱动函数
(0003) ****************************************************************/
(0004) #include "config.h"
(0005) /*#define T0_EN TIMSK |= (1<<OCIE0)|(1<<TOIE0)
(0006) #define T0_UEN TIMSK &=~ (1<<OCIE0)|(1<<TOIE0)
(0007) #define T0_start TCCR0 |= (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;
(0008) //0x04 0100B 代表256预分频
(0009) #define T0_stop TCCR0 = 0x00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -