📄 02.lst
字号:
(0095) while(ASSR&(1<<TCR2UB)==1) ; //异步操作需要等待 OCR2写入完毕
00E5 B422 IN R2,0x22
00E6 FC20 SBRC R2,0
00E7 CFFD RJMP 0x00E5
(0096) }
00E8 9508 RET
(0097) }
(0098) //右电机滑行
(0099) void motor_right_stop(void)
(0100) {
(0101) motor_uen1;
_motor_right_stop:
00E9 98C4 CBI 0x18,4
(0102) motor_uen2;
00EA 98C5 CBI 0x18,5
(0103) T2_UEN;
00EB B789 IN R24,0x39
00EC 778F ANDI R24,0x7F
00ED BF89 OUT 0x39,R24
00EE 9508 RET
(0104) }
(0105)
(0106) //右电机急停
(0107) void motor_right_quick_stop(void)
(0108) {
(0109) motor_en1;
_motor_right_quick_stop:
00EF 9AC4 SBI 0x18,4
(0110) motor_en2;
00F0 9AC5 SBI 0x18,5
(0111) T2_UEN;
00F1 B789 IN R24,0x39
00F2 778F ANDI R24,0x7F
00F3 BF89 OUT 0x39,R24
00F4 9508 RET
(0112) }
(0113)
(0114) /**********************小车动作*****************************/
(0115)
(0116) void straight(void) //直行
(0117) {//motor_right_quick_stop();
(0118) motor_left_forward(0xfe);
_straight:
00F5 EF0E LDI R16,0xFE
00F6 DFB7 RCALL _motor_left_forward
(0119) motor_right_forward(0xfe);
00F7 EF0E LDI R16,0xFE
00F8 DFD7 RCALL _motor_right_forward
00F9 9508 RET
(0120)
(0121) }
(0122)
(0123) void turn_left(void) //左转
(0124) {
(0125) motor_left_forward(0xfe);
_turn_left:
00FA EF0E LDI R16,0xFE
00FB DFB2 RCALL _motor_left_forward
(0126) motor_right_forward(0x50);
00FC E500 LDI R16,0x50
00FD DFD2 RCALL _motor_right_forward
00FE 9508 RET
(0127) }
(0128)
(0129) void turn_right(void) //右转
(0130) {
(0131) motor_left_forward(0xfe);
_turn_right:
00FF EF0E LDI R16,0xFE
0100 DFAD RCALL _motor_left_forward
(0132) motor_right_backward(0x50);
0101 E500 LDI R16,0x50
0102 DFD6 RCALL _motor_right_backward
0103 9508 RET
(0133) }
(0134)
(0135) void straight_back(void) //直回
(0136) {//motor_right_quick_stop();
(0137) motor_left_backward(0xfe);
_straight_back:
0104 EF0E LDI R16,0xFE
0105 DFB1 RCALL _motor_left_backward
(0138) motor_right_backward(0xfe);
0106 EF0E LDI R16,0xFE
0107 DFD1 RCALL _motor_right_backward
0108 9508 RET
(0139) }
(0140)
(0141) void stop(void) //急停
(0142) {
(0143) motor_left_quick_stop();
_stop:
0109 DFC0 RCALL _motor_left_quick_stop
(0144) motor_right_quick_stop();
010A DFE4 RCALL _motor_right_quick_stop
010B 9508 RET
(0145) }
(0146)
(0147) void mic_turn_right(void) //向右微调
(0148) {
(0149) motor_left_forward(0xa0);
_mic_turn_right:
010C EA00 LDI R16,0xA0
010D DFA0 RCALL _motor_left_forward
(0150) motor_right_backward(0x30);
010E E300 LDI R16,0x30
010F DFC9 RCALL _motor_right_backward
0110 9508 RET
(0151) }
(0152)
(0153) void mic_turn_left(void) //向左微调
(0154) {
(0155) motor_left_forward(0xa0);
_mic_turn_left:
0111 EA00 LDI R16,0xA0
0112 DF9B RCALL _motor_left_forward
(0156) motor_right_forward(0x30);
0113 E300 LDI R16,0x30
0114 DFBB RCALL _motor_right_forward
0115 9508 RET
_flag_test:
temp --> R20
0116 940E01A6 CALL push_gset1
(0157) }
(0158)
(0159) void flag_test(void) //测试小车状态
(0160) {
(0161) uint8 temp;
(0162) temp = PINA&0x0f; //PINA的低四位
0118 B349 IN R20,0x19
0119 704F ANDI R20,0xF
(0163) switch(temp)
011A 2755 CLR R21
011B 3040 CPI R20,0
011C E0E0 LDI R30,0
011D 075E CPC R21,R30
011E F154 BLT 0x0149
011F E08F LDI R24,0xF
0120 E090 LDI R25,0
0121 1784 CP R24,R20
0122 0795 CPC R25,R21
0123 F12C BLT 0x0149
0124 E002 LDI R16,2
0125 E010 LDI R17,0
0126 019A MOVW R18,R20
0127 940E018E CALL empy16s
0129 01F8 MOVW R30,R16
012A E584 LDI R24,0x54
012B E090 LDI R25,0
012C 0FE8 ADD R30,R24
012D 1FF9 ADC R31,R25
012E 9005 LPM R0,Z+
012F 9014 LPM R1,0(Z)
0130 01F0 MOVW R30,R0
0131 9409 IJMP
(0164) {
(0165) case 0x0f:
(0166) flag = 0; //未偏
0132 2422 CLR R2
0133 92200060 STS flag,R2
(0167) break;
0135 C013 RJMP 0x0149
(0168) case 0x01:
(0169) case 0x06:
(0170) case 0x07:
(0171) case 0x08:
(0172) case 0x0a:
(0173) case 0x0e:
(0174) flag = 1; //左偏
0136 E081 LDI R24,1
0137 93800060 STS flag,R24
(0175) break;
0139 C00F RJMP 0x0149
(0176) case 0x02:
(0177) case 0x04:
(0178) case 0x05:
(0179) case 0x09:
(0180) case 0x0b:
(0181) case 0x0d:
(0182) flag = 2; //右偏
013A E082 LDI R24,2
013B 93800060 STS flag,R24
(0183) break;
013D C00B RJMP 0x0149
(0184) case 0x0c:
(0185) flag = 3; //前两出线
013E E083 LDI R24,3
013F 93800060 STS flag,R24
(0186) break;
0141 C007 RJMP 0x0149
(0187) case 0x03:
(0188) flag = 4; //后两出线
0142 E084 LDI R24,4
0143 93800060 STS flag,R24
(0189) break;
0145 C003 RJMP 0x0149
(0190) case 0x00:
(0191) flag = 5; //脱轨
0146 E085 LDI R24,5
0147 93800060 STS flag,R24
(0192) break;
(0193) default:
(0194) break;
0149 940E01A9 CALL pop_gset1
014B 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\小车寻迹\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:
014C 2422 CLR R2
014D BA2B OUT 0x1B,R2
(0009) DDRA = 0x00;
014E BA2A OUT 0x1A,R2
(0010) PORTB = 0x00;
014F BA28 OUT 0x18,R2
(0011) DDRB = 0xFF;
0150 EF8F LDI R24,0xFF
0151 BB87 OUT 0x17,R24
(0012) PORTC = 0x00;
0152 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
0153 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
0154 BA22 OUT 0x12,R2
(0015) DDRD = 0x80;
0155 E880 LDI R24,0x80
0156 BB81 OUT 0x11,R24
0157 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:
0158 2422 CLR R2
0159 BE23 OUT 0x33,R2
(0025) TCNT0= 0x01; //set count
015A E081 LDI R24,1
015B BF82 OUT 0x32,R24
(0026) OCR0 = 0x66; //set compare
015C E686 LDI R24,0x66
015D BF8C OUT 0x3C,R24
(0027) TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
015E E68C LDI R24,0x6C
015F BF83 OUT 0x33,R24
0160 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:
0161 2422 CLR R2
0162 BC2E OUT 0x2E,R2
(0036) TCNT1H = 0x4C; //setup
0163 E48C LDI R24,0x4C
0164 BD8D OUT 0x2D,R24
(0037) TCNT1L = 0x01;
0165 E081 LDI R24,1
0166 BD8C OUT 0x2C,R24
(0038) OCR1AH = 0xB3;
0167 EB83 LDI R24,0xB3
0168 BD8B OUT 0x2B,R24
(0039) OCR1AL = 0xFF;
0169 EF8F LDI R24,0xFF
016A BD8A OUT 0x2A,R24
(0040) OCR1BH = 0xB3;
016B EB83 LDI R24,0xB3
016C BD89 OUT 0x29,R24
(0041) OCR1BL = 0xFF;
016D EF8F LDI R24,0xFF
016E BD88 OUT 0x28,R24
(0042) ICR1H = 0xB3;
016F EB83 LDI R24,0xB3
0170 BD87 OUT 0x27,R24
(0043) ICR1L = 0xFF;
0171 EF8F LDI R24,0xFF
0172 BD86 OUT 0x26,R24
(0044) TCCR1A = 0x00;
0173 BC2F OUT 0x2F,R2
(0045) TCCR1B = 0x02; //start Timer
0174 E082 LDI R24,2
0175 BD8E OUT 0x2E,R24
0176 9508 RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
(0049) void timer2_init(void)
(0050) {
(0051) TCCR2 = 0x00; //stop
_timer2_init:
0177 2422 CLR R2
0178 BC25 OUT 0x25,R2
(0052) TCNT2= 0x01; //set count
0179 E081 LDI R24,1
017A BD84 OUT 0x24,R24
(0053) OCR2 = 0x66; //set compare
017B E686 LDI R24,0x66
017C BD83 OUT 0x23,R24
(0054) TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频
017D E68E LDI R24,0x6E
017E BD85 OUT 0x25,R24
017F 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:
0180 94F8 BCLR 7
(0064) port_init();
0181 DFCA RCALL _port_init
(0065) timer2_init();
0182 DFF4 RCALL _timer2_init
(0066) // timer1_init();
(0067) timer0_init();
0183 DFD4 RCALL _timer0_init
(0068) MCUCR |= (1<<ISC01); // INT0,INT1 下降沿产生中断请求
0184 B785 IN R24,0x35
0185 6082 ORI R24,2
0186 BF85 OUT 0x35,R24
(0069) //MCUCSR |= (1<<ISC2); //INT2上升沿产生中断请求
(0070) GICR |= (1<<INT0)|(1<<INT1);
0187 B78B IN R24,0x3B
0188 6C80 ORI R24,0xC0
0189 BF8B OUT 0x3B,R24
(0071) TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(0<<OCIE2); //timer interrupt sources
018A E483 LDI R24,0x43
018B BF89 OUT 0x39,R24
(0072) SEI(); //re-enable interrupts
FILE: <library>
018C 9478 BSET 7
018D 9508 RET
empy16s:
018E 920A ST R0,-Y
018F 921A ST R1,-Y
0190 938A ST R24,-Y
0191 939A ST R25,-Y
0192 9F02 MUL R16,R18
0193 01C0 MOVW R24,R0
0194 9F12 MUL R17,R18
0195 0D90 ADD R25,R0
0196 9F03 MUL R16,R19
0197 0D90 ADD R25,R0
0198 018C MOVW R16,R24
0199 9199 LD R25,Y+
019A 9189 LD R24,Y+
019B 9019 LD R1,Y+
019C 9009 LD R0,Y+
019D 9508 RET
push_gset5:
019E 92FA ST R15,-Y
019F 92EA ST R14,-Y
push_gset4:
01A0 92DA ST R13,-Y
01A1 92CA ST R12,-Y
push_gset3:
01A2 92BA ST R11,-Y
01A3 92AA ST R10,-Y
push_gset2:
01A4 937A ST R23,-Y
01A5 936A ST R22,-Y
push_gset1:
01A6 935A ST R21,-Y
01A7 934A ST R20,-Y
01A8 9508 RET
pop_gset1:
01A9 E0E1 LDI R30,1
pop:
01AA 9149 LD R20,Y+
01AB 9159 LD R21,Y+
01AC FDE0 SBRC R30,0
01AD 9508 RET
01AE 9169 LD R22,Y+
01AF 9179 LD R23,Y+
01B0 FDE1 SBRC R30,1
01B1 9508 RET
01B2 90A9 LD R10,Y+
01B3 90B9 LD R11,Y+
01B4 FDE2 SBRC R30,2
01B5 9508 RET
01B6 90C9 LD R12,Y+
01B7 90D9 LD R13,Y+
01B8 FDE3 SBRC R30,3
01B9 9508 RET
01BA 90E9 LD R14,Y+
01BB 90F9 LD R15,Y+
01BC 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -