📄 main.lst
字号:
(0002) ** 文件名:interupts.c 中断处理函数
(0003) *******************************************************************************/
(0004) #include "config.h"
(0005)
(0006) #pragma interrupt_handler timer0_ovf_isr:12
(0007) void timer0_ovf_isr(void)
(0008) {
(0009) TCNT0 = 0x01; //reload counter value
0102 E081 LDI R24,1
0103 BF82 OUT 0x32,R24
0104 9189 LD R24,Y+
0105 BF8F OUT 0x3F,R24
0106 9189 LD R24,Y+
0107 9518 RETI
(0010) }
(0011)
(0012) #pragma interrupt_handler timer0_comp_isr:11
(0013) void timer0_comp_isr(void)
(0014) {
_timer0_comp_isr:
0108 9518 RETI
_timer2_ovf_isr:
0109 938A ST R24,-Y
010A B78F IN R24,0x3F
010B 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
010C E081 LDI R24,1
010D BD84 OUT 0x24,R24
010E 9189 LD R24,Y+
010F BF8F OUT 0x3F,R24
0110 9189 LD R24,Y+
0111 9518 RETI
(0022) }
(0023)
(0024) /******************************************************************************/
(0025) // T2 控制PWM输出
(0026) // timer2_comp_isr不需要用,但是必须允许中断,在中断时有信号输出变化
(0027) /******************************************************************************/
(0028)
(0029) #pragma interrupt_handler timer2_comp_isr:5
(0030) void timer2_comp_isr(void)
(0031) {
_timer2_comp_isr:
0112 9518 RETI
FILE: D:\桌面\avr程序设计\循迹小车\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:
0113 2422 CLR R2
0114 BA2B OUT 0x1B,R2
(0009) DDRA = 0x00;
0115 BA2A OUT 0x1A,R2
(0010) PORTB = 0x00;
0116 BA28 OUT 0x18,R2
(0011) DDRB = 0xFF;
0117 EF8F LDI R24,0xFF
0118 BB87 OUT 0x17,R24
(0012) PORTC = 0x00;
0119 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
011A BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
011B BA22 OUT 0x12,R2
(0015) DDRD = 0x80;
011C E880 LDI R24,0x80
011D BB81 OUT 0x11,R24
011E 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:
011F 2422 CLR R2
0120 BE23 OUT 0x33,R2
(0025) TCNT0= 0x01; //set count
0121 E081 LDI R24,1
0122 BF82 OUT 0x32,R24
(0026) OCR0 = 0x66; //set compare
0123 E686 LDI R24,0x66
0124 BF8C OUT 0x3C,R24
(0027) TCCR0 = (1<<WGM00)|(1<<WGM01)|(1<<COM01)|0x04;//0x04 0100B 代表256预分频
0125 E68C LDI R24,0x6C
0126 BF83 OUT 0x33,R24
0127 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:
0128 2422 CLR R2
0129 BC2E OUT 0x2E,R2
(0036) TCNT1H = 0x4C; //setup
012A E48C LDI R24,0x4C
012B BD8D OUT 0x2D,R24
(0037) TCNT1L = 0x01;
012C E081 LDI R24,1
012D BD8C OUT 0x2C,R24
(0038) OCR1AH = 0xB3;
012E EB83 LDI R24,0xB3
012F BD8B OUT 0x2B,R24
(0039) OCR1AL = 0xFF;
0130 EF8F LDI R24,0xFF
0131 BD8A OUT 0x2A,R24
(0040) OCR1BH = 0xB3;
0132 EB83 LDI R24,0xB3
0133 BD89 OUT 0x29,R24
(0041) OCR1BL = 0xFF;
0134 EF8F LDI R24,0xFF
0135 BD88 OUT 0x28,R24
(0042) ICR1H = 0xB3;
0136 EB83 LDI R24,0xB3
0137 BD87 OUT 0x27,R24
(0043) ICR1L = 0xFF;
0138 EF8F LDI R24,0xFF
0139 BD86 OUT 0x26,R24
(0044) TCCR1A = 0x00;
013A BC2F OUT 0x2F,R2
(0045) TCCR1B = 0x02; //start Timer
013B E082 LDI R24,2
013C BD8E OUT 0x2E,R24
013D 9508 RET
(0046) }
(0047) /**************************timer2 PWM输出***********************/
(0048) // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
(0049) void timer2_init(void)
(0050) {
(0051) TCCR2 = 0x00; //stop
_timer2_init:
013E 2422 CLR R2
013F BC25 OUT 0x25,R2
(0052) TCNT2= 0x01; //set count
0140 E081 LDI R24,1
0141 BD84 OUT 0x24,R24
(0053) OCR2 = 0x66; //set compare
0142 E686 LDI R24,0x66
0143 BD83 OUT 0x23,R24
(0054) TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频
0144 E68E LDI R24,0x6E
0145 BD85 OUT 0x25,R24
0146 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:
0147 94F8 BCLR 7
(0064) port_init();
0148 DFCA RCALL _port_init
(0065) timer2_init();
0149 DFF4 RCALL _timer2_init
(0066) // timer1_init();
(0067) timer0_init();
014A DFD4 RCALL _timer0_init
(0068) MCUCR |= (1<<ISC01); // INT0,INT1 下降沿产生中断请求
014B B785 IN R24,0x35
014C 6082 ORI R24,2
014D BF85 OUT 0x35,R24
(0069) //MCUCSR |= (1<<ISC2); //INT2上升沿产生中断请求
(0070) GICR |= (1<<INT0)|(1<<INT1);
014E B78B IN R24,0x3B
014F 6C80 ORI R24,0xC0
0150 BF8B OUT 0x3B,R24
(0071) TIMSK = (1<<TOIE0)|(1<<TOIE2)|(1<<OCIE0)|(1<<OCIE2); //timer interrupt sources
0151 EC83 LDI R24,0xC3
0152 BF89 OUT 0x39,R24
(0072) SEI(); //re-enable interrupts
0153 9478 BSET 7
0154 9508 RET
_Delay100us:
i --> R20
n --> R16
0155 940E01D3 CALL push_gset1
FILE: D:\桌面\avr程序设计\循迹小车\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--)
0157 E943 LDI R20,0x93
0158 C006 RJMP 0x015F
(0010) while(--i); //5 * i clock
0159 2F84 MOV R24,R20
015A 5081 SUBI R24,1
015B 2F48 MOV R20,R24
015C 2388 TST R24
015D F7D9 BNE 0x0159
015E 950A DEC R16
015F 2300 TST R16
0160 F7C1 BNE 0x0159
0161 940E01D6 CALL pop_gset1
0163 9508 RET
_Delay1ms:
n --> R20
0164 940E01D3 CALL push_gset1
0166 01A8 MOVW R20,R16
(0011) }
(0012) void Delay1ms(uint16 n)
(0013) {
(0014) for (;n!=0;n--){
0167 C004 RJMP 0x016C
(0015) Delay100us(10);
0168 E00A LDI R16,0xA
0169 DFEB RCALL _Delay100us
016A 5041 SUBI R20,1
016B 4050 SBCI R21,0
016C 3040 CPI R20,0
016D 0745 CPC R20,R21
016E F7C9 BNE 0x0168
016F 940E01D6 CALL pop_gset1
0171 9508 RET
_Delay1s:
n --> R20
0172 940E01D3 CALL push_gset1
0174 01A8 MOVW R20,R16
(0016) }
(0017) }
(0018) void Delay1s(uint16 n)
(0019) {
(0020) n=n*40;
0175 E208 LDI R16,0x28
0176 E010 LDI R17,0
0177 019A MOVW R18,R20
0178 940E01BB CALL empy16s
017A 01A8 MOVW R20,R16
(0021) for (;n!=0;n--){
017B C004 RJMP 0x0180
(0022) Delay100us(250);
017C EF0A LDI R16,0xFA
017D DFD7 RCALL _Delay100us
017E 5041 SUBI R20,1
017F 4050 SBCI R21,0
0180 3040 CPI R20,0
0181 0745 CPC R20,R21
0182 F7C9 BNE 0x017C
0183 940E01D6 CALL pop_gset1
0185 9508 RET
FILE: D:\桌面\avr程序设计\循迹小车\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();
_main:
0186 940E0147 CALL _init_devices
(0011) straight();
0188 940E00A8 CALL _straight
(0012)
(0013) flag_test(); //测试小车状态
018A 940E00C9 CALL _flag_test
018C C02C RJMP 0x01B9
(0014) while(1) //没有脱轨
(0015) {
(0016) flag_test();
018D 940E00C9 CALL _flag_test
(0017) switch(flag)
018F 91400060 LDS R20,flag
0191 2755 CLR R21
0192 3040 CPI R20,0
0193 0745 CPC R20,R21
0194 F0A9 BEQ 0x01AA
0195 3041 CPI R20,1
0196 E0E0 LDI R30,0
0197 075E CPC R21,R30
0198 F0C1 BEQ 0x01B1
0199 3042 CPI R20,2
019A E0E0 LDI R30,0
019B 075E CPC R21,R30
019C F0B9 BEQ 0x01B4
019D 3043 CPI R20,3
019E E0E0 LDI R30,0
019F 075E CPC R21,R30
01A0 F0C1 BEQ 0x01B9
01A1 3044 CPI R20,4
01A2 E0E0 LDI R30,0
01A3 075E CPC R21,R30
01A4 F0A1 BEQ 0x01B9
01A5 3045 CPI R20,5
01A6 E0E0 LDI R30,0
01A7 075E CPC R21,R30
01A8 F071 BEQ 0x01B7
01A9 C00F RJMP 0x01B9
(0018) {
(0019) case 0: //正常情况将速度设成相等
(0020) motor_right_speed_set(0xFE);
01AA EF0E LDI R16,0xFE
01AB 940E0095 CALL _motor_right_speed_set
(0021) motor_left_speed_set(0xFE);
01AD EF0E LDI R16,0xFE
01AE 940E006D CALL _motor_left_speed_set
(0022) break;
01B0 C008 RJMP 0x01B9
(0023) case 1:
(0024) mic_turn_right();
01B1 940E00BF CALL _mic_turn_right
(0025) break;
01B3 C005 RJMP 0x01B9
(0026) case 2:
(0027) mic_turn_left();
01B4 940E00C4 CALL _mic_turn_left
(0028) break;
01B6 C002 RJMP 0x01B9
(0029) case 3:
(0030) break;
(0031) case 4:
(0032) break;
(0033) case 5:
(0034) stop();
FILE: <library>
01B7 940E00BC CALL _stop
01B9 CFD3 RJMP 0x018D
01BA 9508 RET
empy16s:
01BB 920A ST R0,-Y
01BC 921A ST R1,-Y
01BD 938A ST R24,-Y
01BE 939A ST R25,-Y
01BF 9F02 MUL R16,R18
01C0 01C0 MOVW R24,R0
01C1 9F12 MUL R17,R18
01C2 0D90 ADD R25,R0
01C3 9F03 MUL R16,R19
01C4 0D90 ADD R25,R0
01C5 018C MOVW R16,R24
01C6 9199 LD R25,Y+
01C7 9189 LD R24,Y+
01C8 9019 LD R1,Y+
01C9 9009 LD R0,Y+
01CA 9508 RET
push_gset5:
01CB 92FA ST R15,-Y
01CC 92EA ST R14,-Y
push_gset4:
01CD 92DA ST R13,-Y
01CE 92CA ST R12,-Y
push_gset3:
01CF 92BA ST R11,-Y
01D0 92AA ST R10,-Y
push_gset2:
01D1 937A ST R23,-Y
01D2 936A ST R22,-Y
push_gset1:
01D3 935A ST R21,-Y
01D4 934A ST R20,-Y
01D5 9508 RET
pop_gset1:
01D6 E0E1 LDI R30,1
pop:
01D7 9149 LD R20,Y+
01D8 9159 LD R21,Y+
01D9 FDE0 SBRC R30,0
01DA 9508 RET
01DB 9169 LD R22,Y+
01DC 9179 LD R23,Y+
01DD FDE1 SBRC R30,1
01DE 9508 RET
01DF 90A9 LD R10,Y+
01E0 90B9 LD R11,Y+
01E1 FDE2 SBRC R30,2
01E2 9508 RET
01E3 90C9 LD R12,Y+
01E4 90D9 LD R13,Y+
01E5 FDE3 SBRC R30,3
01E6 9508 RET
01E7 90E9 LD R14,Y+
01E8 90F9 LD R15,Y+
01E9 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -